View Full Version : Giochino per voi
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
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 !!!
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
Mi ripago delle 40 ore di straordinario fatte il mese scorso...
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...
Si lo scopo era proprio quello di commentare il codice e migliorarlo ;) Anche la mela, non mi piace quadrata! :D DOmani lo posto.
C'è un bug...se la mela appare sotto il serpente resta un po' bruttina ;)
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);
}
}
Originally posted by "cionci"
C'è un bug...se la mela appare sotto il serpente resta un po' bruttina ;)
Hai ragione! Chi lo risolve?? :D
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ì...
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);
Oh scusa me l'ero persa! ;)
Si e è la soluzione + semplice, ma secondo me si può fare qualcosa di meglio ;)
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...
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);
Se non lo becca al primo colpo va' in loop quel codice...
Originally posted by "Cimmo"
Se non lo becca al primo colpo va' in loop quel codice...
Dettagli...avevo tolto "int flag=0" dal ciclo...
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);
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:
Corretto quello sopra...se non esistono celle libere lancia una eccezione...
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 !!!
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
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...
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
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...
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);
}
}
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...
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
Ma era bellino vedere l'aggiornamento in tempo reale di come avanzava diagonalmente :) Dai via...impegnati su... :p
Vabbè va, fammi mangiare e poi mi ci metto! :D
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);
}
}
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 :)
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);
}
}
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 ;)
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
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;
}
Ah...ovviamente la parte di disegno la lascio a voi ;)
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
Non ho problemi con l'HTML...se vuoi ti ci faccio una cornicina ;)
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
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
Ecco qua l'html e un po di grafica veloce veloce ;)
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?
Ok...tanto basta cambiare un paio di numerini....
Ecco un primo "prototipo"...Occorre il jre 1.2 almeno, con la JVM di Microsoft non funge :mad:
Non mi funziona... Come si fa a sostituire alla JVM Microsoft quella Sun (definitivamente) ?
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:
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:
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...
I JRE ce l'ho in una dir a parte...insieme a JBuilder...
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!
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
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.
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...
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
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);
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...
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?? ;)
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...
ok!!! In fondo un po' sborone lo sono anche io ;)
Vediamo se oggi ho un po' di tempo :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.