代碼下載
最近學習了Java的貪喫蛇的製作方法,重新回顧了一下Java的窗口知識,下面就講一下它的流程吧:
一、首先創建並設置窗口的屬性:
然後設置窗口是顯示出來的:
二、窗口創建完成後就要在窗口加一個畫布:
並添加畫布基本屬性:
在main方法中調用
加入圖片裝飾
三、畫布完成後就要設置蛇的初始化狀態
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; /** * Created by Taoyongpan on 2017/3/23. */ public class SnakePanel extends JPanel implements KeyListener,ActionListener{ ImageIcon body = new ImageIcon("img/body.png"); ImageIcon food = new ImageIcon("img/food.png"); ImageIcon title = new ImageIcon("img/title.jpg"); ImageIcon up = new ImageIcon("img/up.png"); ImageIcon down = new ImageIcon("img/down.png"); ImageIcon left = new ImageIcon("img/left.png"); ImageIcon right = new ImageIcon("img/right.png"); int[] snakex = new int[750]; int[] snakey = new int[750]; //隨機產生食物 Random random = new Random(); int foodx = random.nextInt(34)*25+25; int foody = random.nextInt(24)*25+75; //貪喫蛇長度 int len = 3; //得分 int score = 0; //貪喫蛇速度 int speed = 0; //貪喫蛇方向 String fangxiang = "R";//R向右,L向左,U向上,D向下 //默認遊戲爲不開始 boolean isStarted = false; //判斷遊戲是否結束 boolean isFailed = false; Timer timer = new Timer(100,this); //重新構造 public SnakePanel(){ //獲得焦點 this.setFocusable(true); //添加鍵盤監聽 this.addKeyListener(this); setup(); timer.start(); } public void paint(Graphics g){ //調用paint方法 super.paint(g); this.setBackground(Color.WHITE); title.paintIcon(this,g,25,11); //畫一個方框 g.fillRect(25,75,850,600); //畫蛇頭 if(fangxiang.equals("R")){ right.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("L")){ left.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("U")){ up.paintIcon(this,g,snakex[0],snakey[0]); }else if(fangxiang.equals("D")){ down.paintIcon(this,g,snakex[0],snakey[0]); } //畫蛇身體 for(int i = 1; i < len; i++){ body.paintIcon(this,g,snakex[i],snakey[i]); } //設置開始的提示語句 if(!isStarted){ g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,30)); g.drawString("Press Space to Start/Stop",300,300); } //設置失敗時候的提示語句 if (isFailed){ g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,30)); g.drawString("Game over,Press Space to ReStart",300,300); } //添加食物 food.paintIcon(this,g,foodx,foody); g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.PLAIN,20)); g.drawString("Score:"+score,750,30); g.drawString("Length:"+len,750,50); } //初始化蛇 public void setup(){ isFailed = false; isStarted = false; len = 3; //默認方向爲R fangxiang = "R"; snakex[0] = 100; snakey[0] = 100; snakex[1] = 75; snakey[1] = 100; snakex[2] = 50; snakey[2] = 100; } //在源組件上按下一個鍵然後釋放該鍵後被調用 @Override public void keyTyped(KeyEvent e) { } //在源組件上按下一個鍵後被調用 @Override public void keyReleased(KeyEvent e) { } // 在源組件上釋放一個鍵後被調用 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //敲空格鍵 /** * VK_HOME Home鍵 VK_CONTROL 控制鍵 VK_END End鍵 VK_SHIFT shift鍵 VK_PGUP page up鍵 VK_BACK_SPACE 退格鍵 VK_PGDN page down鍵 VK_CAPS_LOCK 大小寫鎖定鍵 VK_UP 上箭頭 VK_NUM_LOCK 小鍵盤鎖定鍵 VK_DOWN 下箭頭 VK_ENTER 回車鍵 VK_LEFT 左箭頭 VK_UNDEFINED 未知鍵 VK_RIGHT 右箭頭 VK_F1--VK_F12 F1 -- F12 VK_ESCAPE Esc鍵 VK_0 --VK_9 0 --- 9 VK_TAB Tab鍵 VK_A --VK_Z A----Z */ if(keyCode == KeyEvent.VK_SPACE){ if (isFailed) { setup(); }else { isStarted = !isStarted; } repaint(); }else if (keyCode == KeyEvent.VK_UP && fangxiang != "D"){ fangxiang = "U"; }else if (keyCode == KeyEvent.VK_DOWN&& fangxiang != "U"){ fangxiang = "D"; }else if (keyCode == KeyEvent.VK_LEFT&& fangxiang != "R"){ fangxiang = "L"; }else if (keyCode == KeyEvent.VK_RIGHT&& fangxiang != "L"){ fangxiang = "R"; } } //就像一個鬧鐘一樣 /** * 這是一個事件監聽器,可以處理類似單擊鼠標時觸發的事件 * ActionEvent就是一個事件類,傳入的e就是該事件的對象 * @param e */ @Override public void actionPerformed(ActionEvent e) { //再定義一個鬧鐘 timer.start(); //移動數據 if(isStarted&&!isFailed){ //移動身體 for (int i = len ; i > 0 ; i--){ snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //移動頭 if(fangxiang.equals("R")){ snakex[0] = snakex[0] + 25; if (snakex[0] >850){ isFailed = true; //snakex[0] = 25; } }else if(fangxiang.equals("L")){ snakex[0] = snakex[0] - 25; if (snakex[0] < 25){ //snakex[0] = 850; isFailed = true; } }else if(fangxiang.equals("U")){ snakey[0] = snakey[0] - 25; if (snakey[0] <75 ){ //snakey[0] = 650; isFailed = true; } }else if(fangxiang.equals("D")){ snakey[0] = snakey[0] + 25; if(snakey[0] > 650){ //snakey[0] = 75; isFailed = true; } } if(snakex[0] == foodx&&snakey[0] == foody){ len++; score++; foodx = random.nextInt(34)*25+25; foody = random.nextInt(24)*25+75; } for (int i= 1;i<len;i++){ if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) { isFailed = true; } } } //repaint() repaint(); } }