?? snake2.java
字號:
/* * Snake2.java * * Created on 2004年5月5日, 下午9:01 *//** * * * @author zhouhui */import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.event.*;import java.util.*;public class Snake2 extends JPanel implements Runnable { /* 0 變量聲明*/ static int speed=2; static int lastunitnum=0; static boolean isPause=false; static int playTimes=5; static JLabel label1=new JLabel("按‘P’暫停,再按其它任意鍵繼續(xù)"); static JLabel label2=new JLabel("您總共有 "+playTimes+" 次機會"); static boolean isAlive=true; static JFrame f; static Thread t; static Random ran=new Random(); static int unitnum=4; static final int north=4;static final int south=3;static final int west=2;static final int east=1; static int direction=south; static class BodyUnit //身體單位類聲明 { int xc; int yc; } static BodyUnit bodyunit[]=new BodyUnit[50]; //all has 50 bodyunit static class Food //食物類聲明 { int x; int y; Food(int xx,int yy) { this.x=xx; this.y=yy; } } Food food; /** 1 構造方法 */ public Snake2() { super.setSize(600,550); super.setVisible(true); for(int i=0;i<unitnum;i++) //初始化bodyuint { bodyunit[i]=new BodyUnit(); bodyunit[i].xc=10; bodyunit[i].yc=i*10+20; } food=new Food(60, 70); //初始化food t=new Thread(this); t.start(); } /* 2 事件響應方法*/ public static void s2keyPressed(KeyEvent e) { if(e.getKeyCode()==39&&direction!=west) { direction=east; } if(e.getKeyCode()==37&&direction!=east) { direction=west; } if(e.getKeyCode()==38&&direction!=south) { direction=north; } if(e.getKeyCode()==40&&direction!=north) { direction=south; } if((e.getKeyChar()=='p'||e.getKeyChar()=='P')&&isAlive==true) { isPause=true; } if(isPause==true&&e.getKeyChar()!='p'&&e.getKeyChar()!='P') { isPause=false; } if(isAlive==false&&e.getKeyCode()==32&&playTimes>0) //按空格繼續(xù) { lastunitnum=unitnum; unitnum=4; //恢復初始值 speed=2; isPause=false; isAlive=true; } System.out.println(e.getKeyChar()); System.out.println(e.getKeyCode()); //System.out.println("speed is "+speed); } /* 3 畫圖方法*/ public void paintComponent(Graphics g) { g.drawLine(0,500,600,500); g.drawLine(0,1,600,1); g.drawLine(485, 1, 485, 500); g.drawLine(1,1,1, 500); this.setSize(600,550); int i; //先畫蛇 g.clearRect(bodyunit[0].xc,bodyunit[0].yc,9,9); for( i=0;(i<unitnum-1);i++) { bodyunit[i].xc=bodyunit[i+1].xc; bodyunit[i].yc=bodyunit[i+1].yc; { g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9); } } if(direction==south) { bodyunit[i].yc+=10; if(bodyunit[i].xc>=500) bodyunit[i].xc-=500 ; if(bodyunit[i].yc>=500) bodyunit[i].yc-=500 ; if(bodyunit[i].xc<0) bodyunit[i].xc+=500 ; if(bodyunit[i].yc<0) bodyunit[i].yc+=500 ; g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9); } if(direction==north) { bodyunit[i].yc-=10; if(bodyunit[i].xc>=500) bodyunit[i].xc-=500 ; if(bodyunit[i].yc>=500) bodyunit[i].yc-=500 ; if(bodyunit[i].xc<0) bodyunit[i].xc+=500 ; if(bodyunit[i].yc<0) bodyunit[i].yc+=500 ; g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9); } if(direction==east) { bodyunit[i].xc+=10; if(bodyunit[i].xc>=500) bodyunit[i].xc-=500 ; if(bodyunit[i].yc>=500) bodyunit[i].yc-=500 ; if(bodyunit[i].xc<0) bodyunit[i].xc+=500 ; if(bodyunit[i].yc<0) bodyunit[i].yc+=500 ; g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9); } if(direction==west) { bodyunit[i].xc-=10; if(bodyunit[i].xc>=500) bodyunit[i].xc-=500 ; if(bodyunit[i].yc>=500) bodyunit[i].yc-=500 ; if(bodyunit[i].xc<0) bodyunit[i].xc+=500 ; if(bodyunit[i].yc<0) bodyunit[i].yc+=500 ; g.fillRect(bodyunit[i].xc,bodyunit[i].yc,9,9); } g.drawRect(food.x,food.y, 9, 9); // 再畫食物 /* if(lastunitnum>unitnum) //若有必要的話,就擦掉身體 { for(int j=unitnum;j<lastunitnum;i++) { g.clearRect(bodyunit[j].xc, bodyunit[j].yc,10, 10); } lastunitnum=0; } */ } /* 4 睡覺方法*/ public void run() { int count=0; try{ while(true&&playTimes>0) { t.sleep((int)400/speed); if(isPause==false&&isAlive==true) { if(hitSelf()) { isAlive=false; //playTimes--; //break; while(true&&isAlive==false) { t.sleep((int)400/speed); //repaint(); } } if(eatFood()&&(unitnum%5==3)) speed+=1; repaint(); } count++; System.out.println("count="+count+" 00000000000000000000000000000000"); System.out.println("speed="+speed); System.out.println("unitnum="+unitnum); System.out.println("lastunitnum="+lastunitnum); System.out.println("playtimes="+playTimes); System.out.println("direction="+direction); }System.out.println("isAlive is false now"); }catch(InterruptedException e){System.out.println("run-thread was interrupted");} } /* 5 判斷(x,y)是否有蛇身體單位的方法*/ public boolean hasUnit(int x,int y) { for(int i=0;i<unitnum;i++) { if(bodyunit[i].xc==x&&bodyunit[i].yc==y) return true; } return false; } /* 6 判斷(x,y)是否有食物的方法*/ public boolean hasFood(int xx,int yy) { if(food.x==xx&&food.y==yy) return true; else return false; } /* 7 產生食物的方法 */ public void generateFood() { boolean flag=true; int x,y; while(flag) { x=ran.nextInt(50)*10; y=ran.nextInt(50)*10; if(!hasUnit(x,y)) { flag=false; food=new Food(x,y); System.out.println("generate food successfully "+x+" "+y); } } } /* 8 吃食物的方法 */ public boolean eatFood() { boolean eatsuccess=false; switch (direction) { case east: { if(hasFood(bodyunit[unitnum-1].xc+10,bodyunit[unitnum-1].yc)) { System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction); unitnum++; bodyunit[unitnum-1]=new BodyUnit(); bodyunit[unitnum-1].xc=food.x; bodyunit[unitnum-1].yc=food.y; System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc); generateFood(); eatsuccess=true; } }break; case west: { if(hasFood(bodyunit[unitnum-1].xc-10,bodyunit[unitnum-1].yc)) { System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction); unitnum++; bodyunit[unitnum-1]=new BodyUnit(); bodyunit[unitnum-1].xc=food.x; bodyunit[unitnum-1].yc=food.y; generateFood(); eatsuccess=true; System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc); } }break; case north: { if(hasFood(bodyunit[unitnum-1].xc,bodyunit[unitnum-1].yc-10)) { System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction); unitnum++; bodyunit[unitnum-1]=new BodyUnit(); bodyunit[unitnum-1].xc=food.x; bodyunit[unitnum-1].yc=food.y; generateFood(); eatsuccess=true; System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc); } }break; case south: { if(hasFood(bodyunit[unitnum-1].xc,bodyunit[unitnum-1].yc+10)) { System.out.println("old head at "+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc+direction); unitnum++; bodyunit[unitnum-1]=new BodyUnit(); bodyunit[unitnum-1].xc=food.x; bodyunit[unitnum-1].yc=food.y; generateFood(); eatsuccess=true; System.out.println(direction+"new head at"+bodyunit[unitnum-1].xc+" "+bodyunit[unitnum-1].yc); } }break; } //if(unitnum%5==3&&eatsuccess) this.speed+=3; return eatsuccess; } /* 9 判斷是否撞自己的方法 */ public boolean hitSelf() { for(int i=0;i<=unitnum-4;i++) { if(bodyunit[i].xc==bodyunit[unitnum-1].xc&&bodyunit[i].yc==bodyunit[unitnum-1].yc) { System.out.println(" hithithit "); playTimes--; label2.setText("您還有 "+playTimes+"次機會 \n按空格重玩"); return true; } } return false; } /* 10 */ public void paint(Graphics g) { super.paint(g); //this.paintComponent(g); if(lastunitnum>unitnum) //若有必要的話,就擦掉身體 { for(int j=unitnum;j<lastunitnum;j++) { g.clearRect(bodyunit[j].xc, bodyunit[j].yc,10, 10); } lastunitnum=0; } } /** 主方法 * @param args the command line arguments */ public static void main(String[] args) { f=new JFrame("貪吃蛇"); f.getContentPane().add(label1,BorderLayout.SOUTH); label2.setSize(5,500); f.getContentPane().add(label2,BorderLayout.EAST); f.addKeyListener(new KeyAdapter() //增添處理鍵盤事件的方法 { public void keyPressed(KeyEvent e) { s2keyPressed(e); // 待添加 } } ); final Snake2 s2=new Snake2(); f.getContentPane().add(s2,BorderLayout.NORTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBounds(10, 10, 600, 600); f.setResizable(false); f.setVisible(true); } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -