PDA

View Full Version : Giochino per voi


cn73
06-02-2003, 14:25
EHm...non avevo molto da fare oggi al lavoro :D

Quanti punti riuscite a fare??
Se interessa posto anche il codice java.

Nuova versione col codice di cionci! :D

cn73
06-02-2003, 16:44
Ecco il mio record! :D

cionci
06-02-2003, 17:14
Assasssssinoooo !!! :o Non riesco a smettere di giocarci :D:D:D:D

Per ora sono arrivato a 39...già lì se te ne tocca uno sul bordo è finita !!!

cn73
06-02-2003, 18:39
Dai che dopo 32 mele mangiate la velocità si blocca (vedi output della console java :D) Il record attuale è di 59 fatto da un mio amico :eek:

Louder Than Hell
06-02-2003, 18:40
eeh..cavolo che invidia voi vi mettete a fare giochi quando non avete niente da fare tanto per.......... :mad:


:p

cn73
06-02-2003, 18:47
Mi ripago delle 40 ore di straordinario fatte il mese scorso...

recoil
06-02-2003, 20:38
carino dai :-)

dimenticavo, io ho fatto 32 punti ma ci ho giocato solo un paio di volte
se metti il codice java modifico qualcosa e lo rallento un attimo perché diventa veramente troppo veloce poi...

cn73
06-02-2003, 21:48
Si lo scopo era proprio quello di commentare il codice e migliorarlo ;) Anche la mela, non mi piace quadrata! :D DOmani lo posto.

cionci
07-02-2003, 08:21
C'è un bug...se la mela appare sotto il serpente resta un po' bruttina ;)

cn73
07-02-2003, 08:24
Ecco il codice... la classe java.awt.Graphics2D permetterebbe di usare "effetti" grafici migliori, ma la Microsoft JVM non supporta il jdk 1.2 (Brava Microsoft! :mad)

E' sicuramente migliorabile, possiamo divertirci a farlo se volete!



import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.Graphics;
//import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Event;

public class Snake extends Applet implements Runnable{

static final int rows = 15;
static final int columns = 25;

static final Font font = new Font("Arial",Font.BOLD, 12);

boolean gioco = false, mangiato=false, gioco2=false, playing=false;
int size, hsize=0, speed=200;

Point[] posizioni = new Point[374];

int direzione = 0; // 0 - destra
// 1 - sinistra
// 2 - su
// 3 - giù

Point mela = new Point(12,7);

Thread runner;

public void init() {

System.out.println("Init applet -> keyEvent added");

KeyListener keyListener = new KeyAdapter() {

public void keyPressed(KeyEvent keyEvent) {


int key = keyEvent.getKeyCode();
//System.out.println("Key Pressed : "+ key);

if(key == KeyEvent.VK_RIGHT && posizioni[1].x!=posizioni[0].x+1) { direzione=0; gioco=true; playing=true; }
else if(key == KeyEvent.VK_LEFT && posizioni[1].x!=posizioni[0].x-1) { direzione=1; gioco=true; playing=true; }
else if(key == KeyEvent.VK_UP && posizioni[1].y!=posizioni[0].y-1) { direzione=2; gioco=true; playing=true; }
else if(key == KeyEvent.VK_DOWN && posizioni[1].y!=posizioni[0].y+1) { direzione=3; gioco=true; playing=true; }
else if(key == KeyEvent.VK_ESCAPE)
playing=false;

}
};

addKeyListener(keyListener);

size=3;

for(int i=0; i<374; i++)
posizioni[i] = new Point(0,0);

posizioni[0].move(3,rows);
posizioni[1].move(2,rows);
posizioni[2].move(1,rows);
}

public void start() {
if(runner==null) {
runner = new Thread(this);
runner.start();
}
}

public void stop() {
runner = null;
}

public void run() {

Thread thisThread = Thread.currentThread();
while (thisThread == runner){

// Il gioco finisce se si sbatte contro il muro oppure ci si morde la coda
for(int i=5; i<size; i++)
if(posizioni[0].x == posizioni[i].x && posizioni[0].y == posizioni[i].y)
gioco2 = true;

if(( (gioco2) || (direzione==0 && posizioni[0].x==columns)
|| (direzione==1 && posizioni[0].x==1) || (direzione==2 && posizioni[0].y==1)
|| (direzione==3 && posizioni[0].y==rows))) {
// risetta gli start points
gioco = false;
gioco2 = false;
if(size>hsize) hsize=size;
size=3;
posizioni[2].move(1,rows);
posizioni[1].move(2,rows);
posizioni[0].move(3,rows);
mela.move(12,7);
}

repaint();


try{

//setta la velocità del serpente.
Thread.sleep(speed);
}
catch(InterruptedException e) { }

}
}

public void update(Graphics g) {

//Graphics2D g = (Graphics2D)g1;

//g.setBackground(Color.black);

g.setColor(Color.red);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
if(gioco) {
g.setColor(Color.blue);
if(posizioni[0].x==mela.x && posizioni[0].y==mela.y) {
mangiato=true;
size++;

g.clearRect(0,0,getSize().width,12);
}
// Disegna la nuova posizione e cancella quella vecchia

g.clearRect(posizioni[size-1].x*20-20,posizioni[size-1].y*20-20,21,21);

if(posizioni[size-1].x == mela.x && posizioni[size-1].y == mela.y)
g.drawRoundRect(mela.x*20-20,mela.y*20-20,19,19,19,19);


if(playing) {
for(int i=size; i>0; i--)
posizioni[i].move(posizioni[i-1].x, posizioni[i-1].y);

switch(direzione) {
case 0: posizioni[0].x = posizioni[0].x+1; break;
case 1: posizioni[0].x = posizioni[0].x-1; break;
case 2: posizioni[0].y = posizioni[0].y-1; break;
case 3: posizioni[0].y = posizioni[0].y+1; break;
}
}

// Controllo se la mela è stata mangiata

for(int i=0; i<size; i++)
g.fillOval(posizioni[i].x*20-20,posizioni[i].y*20-20,20,20);

if(mangiato) {
mangiato = false;
g.clearRect(mela.x*20-20,mela.y*20-20,21,21);
mela.x=(int)(Math.random()*24+1);
mela.y=(int)(Math.random()*14+1);
//g.drawRoundRect(mela.x*20-20,mela.y*20-20,19,19,19,19);
g.setColor(Color.red);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
if (speed >= 50){
speed -=5;
System.out.println("curr speed: "+ speed);
}

}
}
else {
// Pulisci schermo e inizializza gli oggetti
g.clearRect(0,0,getSize().width,getSize().height);

g.setColor(Color.blue);
for(int i=0; i<size; i++)
g.fillOval(posizioni[i].x*20-20,posizioni[i].y*20-20,20,20);
g.setColor(Color.red);
//g.drawRect(mela.x*20-20,mela.y*20-20,19,19);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
speed = 200;

}
g.setFont(font);
g.setColor(Color.magenta);
g.drawString("Punteggio: "+ (size -3) + (hsize == 0 ? "" : (" Miglior Punteggio: "+ (hsize-3))) ,10,10);


}

}

cn73
07-02-2003, 08:25
Originally posted by "cionci"

C'è un bug...se la mela appare sotto il serpente resta un po' bruttina ;)

Hai ragione! Chi lo risolve?? :D

recoil
10-02-2003, 17:43
io proprio non ho tempo in sti giorni :-(
in ogni caso la mela non dovrebbe proprio comparire sotto il serpente, almeno nello snake dei nokia non è così...

Cimmo
10-02-2003, 23:33
Originally posted by "cn73"



Hai ragione! Chi lo risolve?? :D
Non e' la soluzione + bella del mondo, ma dovrebbe ri-randomizzare il punto della mela se ne viene beccato uno dove c'e' gia' il serpente.
Va' al posto dei 2 random che generano un punto a caso per la nuova mela...il repeat until io l'ho scritto in C, e' uguale in Java che non lo so?


do
{
int flag=0;

mela.x=(int)(Math.random()*24+1);
mela.y=(int)(Math.random()*14+1);

for (int i=0; i<size; i++)
if ((mela.x==posizioni[i].x) && (mela.y==posizioni[i].y))
flag=1;

} while (flag==1);

cn73
13-02-2003, 09:13
Oh scusa me l'ero persa! ;)
Si e è la soluzione + semplice, ma secondo me si può fare qualcosa di meglio ;)

cionci
13-02-2003, 09:31
Originally posted by "cn73"

Si e è la soluzione + semplice, ma secondo me si può fare qualcosa di meglio ;)
In teoria (lo so ceh è contro le leggi della probabilità), con un ciclod el genere potrebbe looppare infinitamente (Murphy docet)...
Quindi è meglio non prendere nuovamente numeri casuali, ma fare la ricerca di una posizione libera...ad esempio spostandosi in diagonale fino a quando non si trova una posizione libera...

cionci
13-02-2003, 09:47
Una cosa del genere direi...

mela.x=(int)(Math.random()*24+1);
mela.y=(int)(Math.random()*14+1);
do
{
int flag = 0;
for (int i=0; i<size && !flag; i++)
if ((mela.x==posizioni[i].x) && (mela.y==posizioni[i].y))
flag=1;

if(flag)
{
mela.x = (mela.x % 24) + 1;
mela.y = (mela.y % 14) + 1;
}
} while (flag);

Cimmo
13-02-2003, 09:49
Se non lo becca al primo colpo va' in loop quel codice...

cionci
13-02-2003, 10:01
Originally posted by "Cimmo"

Se non lo becca al primo colpo va' in loop quel codice...
Dettagli...avevo tolto "int flag=0" dal ciclo...

cionci
13-02-2003, 11:06
Questo è un ottimo metodo...per altro esaustivo...

int startx = mela.x=(int)(Math.random()*24+1);
int starty = mela.y=(int)(Math.random()*14+1);
const int szx = 24, szy = 14;

do {
int flag = 0;
for (int i=0; i<size && !flag; i++)
if ((mela.x==posizioni[i].x) && (mela.y==posizioni[i].y))
flag=1;
if(flag)
{
mela.x--;
mela.y++;
if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}
if(startx == mela.x && starty == mela.y)
throw //una eccezione
}
}while(flag);

cn73
13-02-2003, 11:07
HAi ragione coinci...anche se è praticamente impossibile (un po' come vincere al supoerenalotto ogni settimana 2 volte per tutta la vita ) :D non conviene usare quel codice... Il tuo sistema mi pare il migliore... Ma senti qua: ipotizziamo che nello schermo non esstano celle libere :sofico:

cionci
13-02-2003, 11:13
Corretto quello sopra...se non esistono celle libere lancia una eccezione...

cn73
13-02-2003, 12:55
Lo provo subito ;)

cn73
13-02-2003, 13:44
mmm..va in loop...

cn73
13-02-2003, 13:45
mmm..va in loop...

cionci
13-02-2003, 14:02
A me no!!!
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.Graphics;
//import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Event;

public class Snake extends Applet implements Runnable{

static final int rows = 15;
static final int columns = 25;

static final Font font = new Font("Arial",Font.BOLD, 12);

boolean gioco = false, mangiato=false, gioco2=false, playing=false;
int size, hsize=0, speed=200;

Point[] posizioni = new Point[374];

int direzione = 0; // 0 - destra
// 1 - sinistra
// 2 - su
// 3 - giù

Point mela = new Point(12,7);

Thread runner;

public void init() {

System.out.println("Init applet -> keyEvent added");

KeyListener keyListener = new KeyAdapter() {

public void keyPressed(KeyEvent keyEvent) {


int key = keyEvent.getKeyCode();
//System.out.println("Key Pressed : "+ key);

if(key == KeyEvent.VK_RIGHT && posizioni[1].x!=posizioni[0].x+1) { direzione=0; gioco=true; playing=true; }
else if(key == KeyEvent.VK_LEFT && posizioni[1].x!=posizioni[0].x-1) { direzione=1; gioco=true; playing=true; }
else if(key == KeyEvent.VK_UP && posizioni[1].y!=posizioni[0].y-1) { direzione=2; gioco=true; playing=true; }
else if(key == KeyEvent.VK_DOWN && posizioni[1].y!=posizioni[0].y+1) { direzione=3; gioco=true; playing=true; }
else if(key == KeyEvent.VK_ESCAPE)
playing=false;

}
};

addKeyListener(keyListener);

size=3;

for(int i=0; i<374; i++)
posizioni[i] = new Point(0,0);

posizioni[0].move(3,rows);
posizioni[1].move(2,rows);
posizioni[2].move(1,rows);
}

public void start() {
if(runner==null) {
runner = new Thread(this);
runner.start();
}
}

public void stop() {
runner = null;
}

public void run() {

Thread thisThread = Thread.currentThread();
while (thisThread == runner){

// Il gioco finisce se si sbatte contro il muro oppure ci si morde la coda
for(int i=5; i<size; i++)
if(posizioni[0].x == posizioni[i].x && posizioni[0].y == posizioni[i].y)
gioco2 = true;

if(( (gioco2) || (direzione==0 && posizioni[0].x==columns)
|| (direzione==1 && posizioni[0].x==1) || (direzione==2 && posizioni[0].y==1)
|| (direzione==3 && posizioni[0].y==rows))) {
// risetta gli start points
gioco = false;
gioco2 = false;
if(size>hsize) hsize=size;
size=3;
posizioni[2].move(1,rows);
posizioni[1].move(2,rows);
posizioni[0].move(3,rows);
mela.move(12,7);
}

repaint();


try{

//setta la velocità del serpente.
Thread.sleep(speed);
}
catch(InterruptedException e) { }

}
}

public void update(Graphics g) {

//Graphics2D g = (Graphics2D)g1;

//g.setBackground(Color.black);

g.setColor(Color.red);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
if(gioco) {
g.setColor(Color.blue);
if(posizioni[0].x==mela.x && posizioni[0].y==mela.y) {
mangiato=true;
size++;

g.clearRect(0,0,getSize().width,12);
}
// Disegna la nuova posizione e cancella quella vecchia

g.clearRect(posizioni[size-1].x*20-20,posizioni[size-1].y*20-20,21,21);

if(posizioni[size-1].x == mela.x && posizioni[size-1].y == mela.y)
g.drawRoundRect(mela.x*20-20,mela.y*20-20,19,19,19,19);


if(playing) {
for(int i=size; i>0; i--)
posizioni[i].move(posizioni[i-1].x, posizioni[i-1].y);

switch(direzione) {
case 0: posizioni[0].x = posizioni[0].x+1; break;
case 1: posizioni[0].x = posizioni[0].x-1; break;
case 2: posizioni[0].y = posizioni[0].y-1; break;
case 3: posizioni[0].y = posizioni[0].y+1; break;
}
}

// Controllo se la mela è stata mangiata

for(int i=0; i<size; i++)
g.fillOval(posizioni[i].x*20-20,posizioni[i].y*20-20,20,20);

if(mangiato) {
mangiato = false;
g.clearRect(mela.x*20-20,mela.y*20-20,21,21);
int startx = mela.x=(int)(Math.random()*24+1);
int starty = mela.y=(int)(Math.random()*14+1);
int szx = 24, szy = 14;
int flag;

do {
flag = 0;
for (int i=0; i<size && flag==0; i++)
if ((mela.x==posizioni[i].x) && (mela.y==posizioni[i].y))
flag=1;
if(flag != 0)
{
mela.x--;
mela.y++;
if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}
if(startx == mela.x && starty == mela.y)
flag=0;
}
}while(flag != 0);

//g.drawRoundRect(mela.x*20-20,mela.y*20-20,19,19,19,19);
g.setColor(Color.red);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
if (speed >= 50){
speed -=5;
System.out.println("curr speed: "+ speed);
}

}
}
else {
// Pulisci schermo e inizializza gli oggetti
g.clearRect(0,0,getSize().width,getSize().height);

g.setColor(Color.blue);
for(int i=0; i<size; i++)
g.fillOval(posizioni[i].x*20-20,posizioni[i].y*20-20,20,20);
g.setColor(Color.red);
//g.drawRect(mela.x*20-20,mela.y*20-20,19,19);
g.fill3DRect(mela.x*20-20,mela.y*20-20,19,19,false);
speed = 200;

}
g.setFont(font);
g.setColor(Color.magenta);
g.drawString("Punteggio: "+ (size -3) + (hsize == 0 ? "" : (" Miglior Punteggio: "+ (hsize-3))) ,10,10);


}

}
PS: per l'eccezione...non so come si faccia in Java !!!

cn73
13-02-2003, 14:09
Hai ragione, avevo scritto male il codice ;)

Per l'eccezione non si può lanciare perchè bisognerebbe dichiarare throws Exception il metodo update, che essendo un metodo della classe Applet non si può "ovverraidare" :D

Allora ho fatto così:


if(startx == mela.x && starty == mela.y) {
g.drawString("Miiiiiii! Ma come hai fatto?? Sei il SUPERCAMPIONE!!", 100,150);
playing = false;
flag=false;
}


:D

cionci
13-02-2003, 14:19
Se vuoi vedere se genera tutte le posizioni mettilo in una classe a se e stampa le varie posizione fino a quando la posizione iniziale è uguale a quella raggiunta...
Ah...funziona indipendentemente dalla forma della "matrice"...quadrata, rettangolare con y > x...

cn73
13-02-2003, 14:44
Ho fatto questa classe:


import java.awt.Point;


public class TestSnake {


Point mela = new Point();
int size =0;
static final int szx = 24, szy = 14;
Point[] posizioni = new Point[374];

public TestSnake(){};

public void test(){


int startx = mela.x=(int)(Math.random()*24+1);
int starty = mela.y=(int)(Math.random()*14+1);

// la mela non può comparire in un punto occupato dal serpente! Codice di cionci ;)

boolean flag = true;

do {
//flag = false;
posizioni[size++] = new Point(mela.x ,mela.y);
System.out.println("mela: " + mela.x + " " + mela.y);
//for (int i=0; i<size && !flag; i++)
// if ((mela.x==posizioni[i].x) && (mela.y==posizioni[i].y))
// flag=true;
//if(flag)
{
mela.x--;
mela.y++;
System.out.println("mela dopo l'incremento: " + mela.x + " " + mela.y);

if(mela.x < 1 || mela.y > szy)
{
System.out.println("mela.x < 1 || mela.y > szy");
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
System.out.println("szx+szy");
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
System.out.println("z > szx");
mela.x = szx;
mela.y = z - mela.x;
}
else
{
System.out.println("else");
mela.y = 1;
mela.x = z - 1;
}

}


if(startx == mela.x && starty == mela.y) {
System.out.println("Miiiiiii! Sei tornato al punto di partenza!!!");

flag=false;
}
}
}while(flag);
System.out.println("size : " + size);
}

public static void main (String[] args){
TestSnake ts = new TestSnake();
ts.test();
}

}




Effettivamente l'output finale (il numero di punti coperti nella griglia prima che torni al punto di partenza) è prorio 336 ;)

Ora ne faccio una versione grafica :D

cionci
13-02-2003, 14:54
Uno poteva anche più semplicemente scorrere ogni riga...ma come ho già detto andando in diagonale si fanno sicuramente meno controlli (sulla validità della posizione) !!! Credo che nel 95% dei casi non si vada oltre i 3 controlli... In un controllo su linea si può facilmente anche andare oltre i 15 o 20 controlli...

Questo metodo scorre la "matrice" sulle diagonali...e per avanzare sfrutta il fatto che la somma degli indici su una diagonale è costante...

cn73
14-02-2003, 08:58
Test grafico! :D


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;


public class TestSnake extends JFrame {


Point mela = new Point();
int size =0;
static final int szx = 24, szy = 14;
Point[] posizioni = new Point[374];

JButton goButton;
JPanel grid ;

ActionListener actionTest;

public TestSnake(){

this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setSize(new Dimension(500, 420));
this.setTitle("TestSnake");

goButton=new JButton("START");
goButton.addActionListener(actionTest = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
test();
}
});

grid = new JPanel();
grid.setLayout(new GridLayout(szx,szy,1,1));

for (int i=0; i<szx; i++)
for (int j=0; j<szy; j++)
grid.add(new JLabel(" "));

for (int i=0; i<szx*szy; i++) {
((JLabel)(grid.getComponent(i))).setBorder(BorderFactory.createEtchedBorder());
}

getContentPane().setLayout(new BorderLayout());
getContentPane().add(grid, BorderLayout.NORTH);
getContentPane().add(goButton, BorderLayout.SOUTH);

};

public void test(){

int startx = mela.x=(int)(Math.random()*24+1);
int starty = mela.y=(int)(Math.random()*14+1);

// la mela non può comparire in un punto occupato dal serpente! Codice di cionci ;)

boolean flag = true;

do {
posizioni[size++] = new Point(mela.x ,mela.y);
System.out.println("mela: " + mela.x + " " + mela.y);
int num = (mela.x-1) * szy + mela.y -1;
((JLabel)(grid.getComponent( num ))).setBackground(Color.red);
{
mela.x--;
mela.y++;
System.out.println("mela dopo l'incremento: " + mela.x + " " + mela.y);

if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}

if(startx == mela.x && starty == mela.y) {
System.out.println("Miiiiiii! Sei tornato al punto di partenza!!!");
flag=false;
}
}
}while(flag);
System.out.println("size : " + size);

goButton.removeActionListener(actionTest);
goButton.setText("EXIT");

goButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

}

public static void main (String[] args){
TestSnake ts = new TestSnake();

ts.pack();
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = ts.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
ts.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
ts.setVisible(true);

}

}

cionci
14-02-2003, 09:20
Ma non si può rallentare la copertura delle varie celle ? Ho provato ad infilare in giro la sleep, ma la esegue sempre prima di colorarle di rosso...

cn73
14-02-2003, 10:45
Ma si il modo c'è sicuramente, è un problema di refresh... Si potrebbe fare un thread apposito, ma è il risultato che conta in questo caso...o no?? :D

cionci
14-02-2003, 10:52
Ma era bellino vedere l'aggiornamento in tempo reale di come avanzava diagonalmente :) Dai via...impegnati su... :p

cn73
14-02-2003, 11:43
Vabbè va, fammi mangiare e poi mi ci metto! :D

cn73
14-02-2003, 13:53
Cionci prova questo...dove sbaglio???


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;


public class TestSnake extends JFrame implements Runnable{


Point mela = new Point();
int size =0;
static final int szx = 15, szy = 25;
static final int rows = 15, columns = 25;

Point[] posizioni = new Point[374];

JButton goButton;
JPanel grid ;

ActionListener actionTest;
Thread runner;

public TestSnake(){

this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setSize(new Dimension(500, 420));
this.setTitle("TestSnake");

goButton=new JButton("START");
goButton.addActionListener(actionTest = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {

start();
}
});

grid = new JPanel();
grid.setLayout(new GridLayout(rows,columns,1,1));

for (int i=0; i<rows; i++)
for (int j=0; j<columns; j++)
grid.add(new JLabel(" "));

for (int i=0; i< (rows * columns); i++) {
((JLabel)(grid.getComponent(i))).setBorder(BorderFactory.createEtchedBorder());
}

getContentPane().setLayout(new BorderLayout());
getContentPane().add(grid, BorderLayout.NORTH);
getContentPane().add(goButton, BorderLayout.SOUTH);

};



public void start() {
if(runner==null) {
runner = new Thread(this);
runner.start();
}
}

public void stop() {
runner = null;
}

public void run() {
System.out.println("running ");
Thread thisThread = Thread.currentThread();
//goButton.setEnabled(false);
while (thisThread == runner){

// Il gioco finisce se si sbatte contro il muro oppure ci si morde la coda


try{


int startx = mela.x=(int)(Math.random()*24+1);
int starty = mela.y=(int)(Math.random()*14+1);

boolean flag = true;

do {
System.out.println("mela: " + mela.x + " " + mela.y + " size : " + size);
posizioni[size++] = new Point(mela.x ,mela.y);


{
mela.x--;
mela.y++;


if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}

if(startx == mela.x && starty == mela.y) {
System.out.println("Miiiiiii! Sei tornato al punto di partenza!!!");
flag=false;
}
}
Thread.sleep(50);
repaint();
}while(flag);

System.out.println("final size : " + size);

goButton.removeActionListener(actionTest);
goButton.setText("EXIT");


goButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

stop();
}
catch(InterruptedException e) { }
}
}



public void repaint(){
try{
int num = (mela.x-1) * szy + mela.y -1;
((JLabel)(grid.getComponent( num ))).setBackground(Color.red);
}catch(Exception ex){System.out.println("oops!");}

}

public static void main (String[] args){
TestSnake ts = new TestSnake();

ts.pack();
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = ts.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
ts.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
ts.setVisible(true);

}

}

cionci
14-02-2003, 14:17
Erano szx e szy sbagliati ;)
Le coordinate sono 1-based quindi se fai una matrice 25x15 szx e szy devono essere 25 e 15...

Ho messo anche szy e szx come parametro nella generazione casuale della posizione iniziale... Anche il vettore di Point deve essere szx*szy...

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;


public class TestSnake extends JFrame implements Runnable{


Point mela = new Point();
int size =0;
static final int szx = 5, szy = 45;
static final int rows = 5, columns = 45;

Point[] posizioni = new Point[szx*szy];

JButton goButton;
JPanel grid ;

ActionListener actionTest;
Thread runner;

public TestSnake(){

this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setSize(new Dimension(500, 420));
this.setTitle("TestSnake");

goButton=new JButton("START");
goButton.addActionListener(actionTest = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {

start();
}
});

grid = new JPanel();
grid.setLayout(new GridLayout(rows,columns,1,1));

for (int i=0; i<rows; i++)
for (int j=0; j<columns; j++)
grid.add(new JLabel(" "));

for (int i=0; i< (rows * columns); i++) {
((JLabel)(grid.getComponent(i))).setBorder(BorderFactory.createEtchedBorder());
}

getContentPane().setLayout(new BorderLayout());
getContentPane().add(grid, BorderLayout.NORTH);
getContentPane().add(goButton, BorderLayout.SOUTH);

};



public void start() {
if(runner==null) {
runner = new Thread(this);
runner.start();
}
}

public void stop() {
runner = null;
}

public void run() {
System.out.println("running ");
Thread thisThread = Thread.currentThread();
//goButton.setEnabled(false);
while (thisThread == runner){

// Il gioco finisce se si sbatte contro il muro oppure ci si morde la coda


try{


int startx = mela.x = (int)(Math.random()*szx+1);
int starty = mela.y = (int)(Math.random()*szy+1);

boolean flag = true;

do {
System.out.println("mela: " + mela.x + " " + mela.y + " size : " + size);
posizioni[size++] = new Point(mela.x ,mela.y);


{
mela.x--;
mela.y++;


if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}

if(startx == mela.x && starty == mela.y) {
System.out.println("Miiiiiii! Sei tornato al punto di partenza!!!");


flag=false;
}
}
Thread.sleep(50);
repaint();
}while(flag);

System.out.println("final size : " + size);

goButton.removeActionListener(actionTest);
goButton.setText("EXIT");


goButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

stop();
}
catch(InterruptedException e) { }
}
}



public void repaint(){
try{
int num = (mela.x-1) * szy + mela.y -1;
((JLabel)(grid.getComponent( num ))).setBackground(Color.red);
}catch(Exception ex){System.out.println("oops!");}

}

public static void main (String[] args){
TestSnake ts = new TestSnake();

ts.pack();
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = ts.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
ts.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) /

2);
ts.setVisible(true);

}

}


Dagli una indentatina va :)

cn73
14-02-2003, 14:50
Ecco si c'ero arrivato!

Dai un'occhio alla versione finale con sorpresina, è carina no?? :D


Curiosità: ma le stai facendo girare ste clssi vero?? :)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;


public class TestSnake extends JFrame implements Runnable{


Point mela = new Point();
int size =0;
static final int szx = 15, szy = 25;
static final int rows = 15, columns = 25;

Point[] posizioni = new Point[szx * szy];

JButton goButton;
JPanel grid ;

ActionListener actionTest;
Thread runner;

boolean first = true;

public TestSnake(){

this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setSize(new Dimension(500, 420));
this.setTitle("TestSnake");

goButton=new JButton("START");
goButton.addActionListener(actionTest = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {

start();
}
});

grid = new JPanel();
grid.setLayout(new GridLayout(rows,columns,1,1));

for (int i=0; i<rows; i++)
for (int j=0; j<columns; j++)
grid.add(new JLabel(" "));

for (int i=0; i< (rows * columns); i++) {
((JLabel)(grid.getComponent(i))).setBorder(BorderFactory.createEtchedBorder());
}

getContentPane().setLayout(new BorderLayout());
getContentPane().add(grid, BorderLayout.NORTH);
getContentPane().add(goButton, BorderLayout.SOUTH);

};



public void start() {
if(runner==null) {
runner = new Thread(this);
runner.start();
}
}

public void stop() {
runner = null;
}

public void run() {
System.out.println("running ");
Thread thisThread = Thread.currentThread();
while (thisThread == runner){

try{
int startx = mela.x=(int)(Math.random()*szx+1);
int starty = mela.y=(int)(Math.random()*szy+1);
System.out.println("punto di partenza! : " + mela.x + " " + mela.y );

boolean flag = true;
do {
System.out.println("mela: " + mela.x + " " + mela.y + " size : " + size);
posizioni[size++] = new Point(mela.x ,mela.y);
System.out.println("aggiunta mela!");
repaint();
first = false;
{
mela.x--;
mela.y++;

if(mela.x < 1 || mela.y > szy)
{
int z = mela.x + mela.y + 1;
if(z > (szx+szy))
{
mela.x = 1;
mela.y = 1;
}
else if(z > szx)
{
mela.x = szx;
mela.y = z - mela.x;
}
else
{
mela.y = 1;
mela.x = z - 1;
}
}

if(startx == mela.x && starty == mela.y) {
JOptionPane.showMessageDialog(this, "Miiiiiii! Sei tornato al punto di partenza!!!",
"E Bravo Cionci! :)",
JOptionPane.INFORMATION_MESSAGE);

flag=false;
}
}
Thread.sleep(50);


}while(flag);

System.out.println("final size : " + size);

goButton.removeActionListener(actionTest);
goButton.setText("EXIT");


goButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

stop();
}
catch(InterruptedException e) { }
}
}

public void repaint(){
try{
int num = (mela.x-1) * (szy) + mela.y -1;
JLabel jl = ((JLabel)(grid.getComponent( num )));
jl.setBackground(first? Color.red : Color.blue);
jl.setText(mela.x + "," + mela.y);
}catch(Exception ex){System.out.println("oops!");}

}

public static void main (String[] args){
TestSnake ts = new TestSnake();

ts.pack();
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = ts.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
ts.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
ts.setVisible(true);

}

}

cionci
14-02-2003, 14:59
Originally posted by "cn73"

Curiosità: ma le stai facendo girare ste clssi vero?? :)

Certo che la faccio girare...e grazie per il "bravo"!!! ;)

PS: x e y sono invertite...cioè la x dovrebbe essere orizzontaqle e la y verticale...poi in pratica non cabmia niente ;)

cn73
14-02-2003, 15:35
grrr volevo modificare la'llegato del primo post per mettere la versione prima del baco e mi ha cancellato quello vecchgio dicendomi che è stata raggiunta la dimensione max per gli allegati!!! :mad: Ma chi l'ha programmato sto forum??? :D

cn73
19-02-2003, 11:27
Nuova versione :)

cionci
19-02-2003, 12:01
Mmmhhh...se non sei registrato su PCTuner non permette di scaricarlo...

Ora...in cosa ossiamo migliorarlo ?!?!?!? Direi nella grafica ;)

Quindi prima di tutto oserei dire che ci vuole una classe per la mela con un metodo che ridisegna la mela (queta volta fatta bene)...
Una cosa del genere (lo scrivo in C++) :

class Mela {
private:
Point m;
public:
Mela():m(1,1) { };
Mela(int x, int y):m(x,y) { };
void muovi(int x, int y) { m.x = x; m.y = y; };
Point posizione() { return m; };
void disegna();
};

Ed una classe per il serpente:

class Serpente {
private:
vector<Point> pos;
public:
Serpente() { };
Serpente(vector<Point> v):pos(v) { };
void sposta(vector<Point> v) { pos = v; };
void muovi(int direzione);
bool collisione(int x, int y);
void disegna();
};

bool Serpente::collisione(int x, int y)
{
for (int i=0; i<pos.size; i++)
if (x==pos[i].x && y==pos[i].y)
return TRUE;
return FALSE;
}

cionci
19-02-2003, 12:05
Ah...ovviamente la parte di disegno la lascio a voi ;)

cn73
19-02-2003, 13:20
Non lo sapevo dell'iscrizione...davvero!
Ora provo ad aggiornare l'allegato, l'altra volta nn me lo faceva aggiornare forse per i problemi che ha avuto il forum...

Per la grafica: Qualcosa si potrebbe fare usando le API del JAVA 1.2, ma quei @@@@ di Microsoft non hanno aggiunto tale supporto nella loro Virtual MAchine... Bhè chi se ne frega, v scaricate la JVM della SUN che è tutta un'altra cosa! :D

MAgari qualcuno potrebbe rifare la pagina HTML che ospita l'Applet, tu ciocnci come te la cavi?? :D

cionci
19-02-2003, 13:26
Non ho problemi con l'HTML...se vuoi ti ci faccio una cornicina ;)

cn73
19-02-2003, 13:41
Zi zi :D sai aggiungere il codice per l'Applet? Ho aggiornato l'alleg<to al primo post ora funge!

Magari ora provo a migliorare un po' la grafica...un'altra miglioria potrebbe essere quella di non fare terminare il gioco quando si tocca una parete...un po' come in Snake 2 dei telefonini Nokia, fare riapparire il serpente dalla parte opposta... e magari qualche topolino bonus qua e la :D

cn73
19-02-2003, 13:52
Zi zi :D sai aggiungere il codice per l'Applet? Ho aggiornato l'alleg<to al primo post ora funge!

Magari ora provo a migliorare un po' la grafica...un'altra miglioria potrebbe essere quella di non fare terminare il gioco quando si tocca una parete...un po' come in Snake 2 dei telefonini Nokia, fare riapparire il serpente dalla parte opposta... e magari qualche topolino bonus qua e la :D

cionci
19-02-2003, 23:27
Ecco qua l'html e un po di grafica veloce veloce ;)

cn73
20-02-2003, 11:34
Bellino!! Senti nella nuova versione ho bisogno di allargare un po' la finestra, perchè devo aggiungere una status bar e un menu...poi posto il prototipo delle classi, però occorre il JRE 1.2 (le SWING) ok?

cionci
20-02-2003, 11:52
Ok...tanto basta cambiare un paio di numerini....

cn73
21-02-2003, 09:21
Ecco un primo "prototipo"...Occorre il jre 1.2 almeno, con la JVM di Microsoft non funge :mad:

cionci
21-02-2003, 11:01
Non mi funziona... Come si fa a sostituire alla JVM Microsoft quella Sun (definitivamente) ?

Cimmo
21-02-2003, 11:09
Originally posted by "cionci"

Non mi funziona... Come si fa a sostituire alla JVM Microsoft quella Sun (definitivamente) ?
Che sistema operativo? Sotto XP con l'SP1a sei a cavallo perche' hanno tolo la MSVM (hanno capito che faceva ca?are), se hai l'SP1 vai su pannello di controllo - installazione applicazioni - impostazione accesso ai programmi - e da li' trovi la voce che parla di Java.

in caso non avessi XP...non saprei :rolleyes:

Cimmo
21-02-2003, 11:10
Originally posted by "cionci"

Non mi funziona... Come si fa a sostituire alla JVM Microsoft quella Sun (definitivamente) ?
Che sistema operativo? Sotto XP con l'SP1a sei a cavallo perche' hanno tolto la MSVM (hanno capito che faceva ca?are), se hai l'SP1 vai su pannello di controllo - installazione applicazioni - impostazione accesso ai programmi - e da li' trovi la voce che parla di Java.

in caso non avessi XP...non saprei :rolleyes:

P.S.= Azz ho postato 2 volte uguale...e dire che mi aveva dato un error in posting...mah! :confused:

cionci
21-02-2003, 11:13
Windows 2000 SP3

Cimmo
21-02-2003, 11:27
Originally posted by "cionci"

Windows 2000 SP3
Pero' e' strano se ci installi sopra quella di Sun dovrebbe beccare quella...non e' che ultimamente hai messo qualche patch riguardante proprio la JVM di M$? Io fossi in te proverei a reinstallare quella di Sun...

cionci
21-02-2003, 11:29
I JRE ce l'ho in una dir a parte...insieme a JBuilder...

Cimmo
21-02-2003, 11:34
Originally posted by "cionci"

I JRE ce l'ho in una dir a parte...insieme a JBuilder...
Si pero' in fase di installazione delle JRE vanno a dire a windows di usare quella di Sun al posto di quella di M$, tu prova a reinstallarle al massimo rimane tutto come prima!

cn73
21-02-2003, 13:01
Occorre il java plugin, incluso solo nel JRE 1.4.1 nelle precedenti è separato e devi scaricartelo...

http://java.sun.com/products/archive/

alla voce JavaTM Plug-In

cn73
21-02-2003, 14:37
Nuova versione.

cionci, che ne dici di studiare il modo di passare da snake-->snake2 (hai presente quello dei telefonini?)

1)Quando si sbatte contro il muro non si muore, ma si spunta dalla parte opposta.
2)A random compaiono dei topolini extra da mangiare.

Cimmo
21-02-2003, 15:14
Sta diventando molto carino ho notato 2 cose:

1) Alle volte non mi funzionano da subito le freccette non so perche'....
2) Credo ci sia ancora un bug, quando mangi la mela e ci passi sopra con il resto del corpo mi sembra sparisca il corpo in corrispondenza della mela...

ciao
Cimmo

P.S.= Fate 2 versioni: Snake I e Snake II, per la storia degli spostamenti basta che fate cosi': x=(x+1)%larghezzatot; e uguale per le y!
Magari l'avevate gia' pensato, ma vi do un piccolo contributo...

cn73
21-02-2003, 15:50
1)Se non ha il focus, non "sente" gli eventi keyPressed. Devi cliccare con il mouse sull'applet.
2)NOn ci ho fatto caso, ora guardo!

Dai cionci che ho nominato pure te! :D

cionci
21-02-2003, 16:05
Ho visto ;)

Ecco il l'HTML aggiornato...

Riguardo ai bordi non ci vuole poi molto...
Basta far avanzare il serpente con x = (x % szx) + 1 (o - 1 a seconda della direzione); e y = (y % szy) + 1 (o - 1 a seconda della direzione);

Cimmo
21-02-2003, 16:13
Originally posted by "cn73"

1)Se non ha il focus, non "sente" gli eventi keyPressed. Devi cliccare con il mouse sull'applet.
2)NOn ci ho fatto caso, ora guardo!

Dai cionci che ho nominato pure te! :D
1) Il focus non ce l'ha mai, ogni volta devo cliccare sull'applet, non si puo' mettere un evento che dopo che hai fatto go da' il fuoco all'applet evitando di dover cliccare?
2) Piu' precisamente sparisce la seconda o terza pallina del serpente in corrispondenza della mela mangiata...

P.S.= non so cosa fossero i file di cionci, ma non hanno corretto questi 2 problemi...

cn73
21-02-2003, 20:05
Originally posted by "Cimmo"

Sta diventando molto carino ho notato 2 cose:

1) Alle volte non mi funzionano da subito le freccette non so perche'....
2) Credo ci sia ancora un bug, quando mangi la mela e ci passi sopra con il resto del corpo mi sembra sparisca il corpo in corrispondenza della mela...

ciao
Cimmo

P.S.= Fate 2 versioni: Snake I e Snake II, per la storia degli spostamenti basta che fate cosi': x=(x+1)%larghezzatot; e uguale per le y!
Magari l'avevate gia' pensato, ma vi do un piccolo contributo...

ti intendi di JAVA?? Nello zip c'è il sorgente perchè non provi?? ;)

Cimmo
21-02-2003, 20:16
Originally posted by "cn73"



ti intendi di JAVA?? Nello zip c'è il sorgente perchè non provi?? ;)
Di Java non tantissimo, ne so di + di C e C++, il problema pero' non e' tanto il linguaggio, ma il tempo...devo laurearmi a marzo e devo ancora scrivere 50 pagine di tesi!!!! :muro:
Caso mai facciamo qualcosa insieme dopo...ho gia' in mente qualcosa di sborone...

cn73
21-02-2003, 20:24
ok!!! In fondo un po' sborone lo sono anche io ;)

cn73
24-02-2003, 08:53
Vediamo se oggi ho un po' di tempo :D