Day02 騷年,玩蛇嗎?(製作小遊戲貪吃蛇)
阿新 • • 發佈:2018-12-30
花了兩天時間,終於讓我的蛇跑起來了,第一次自己獨立做成功一個小遊戲,感覺很有成就感。嘻嘻嘻嘻嘻嘻~~~
附上實現後的圖,可以玩,但還有些細節需要改進,比如記分,暫停,重玩等功能暫時還沒實現,以後會改進的
我說一下思路和步驟
第一步:JFrame畫出視窗
第二步:重寫paint方法,用來畫出地圖界限、球和蛇
第三步:初始化 init() 設定球和蛇的初始位置座標
第四部:寫內部類move,實現執行緒。讓蛇跑起來
第五步:遊戲規則,蛇不能撞牆,不能纏著自己。否則遊戲結束GG。蛇吃到球變長,同時會在隨機位置產生新的球。
第六步:switch實現鍵盤操作 addKeyListenner()
這裡最重要的一個核心思想就是 執行緒
寫一個死迴圈while(true),然後把畫的操作都放在迴圈裡面,這樣遊戲就可以一直玩。
但是每迴圈一次,要讓執行緒歇一會再繼續跑,這裡就用到了Thread.sleep(time);
這樣就實現了讓蛇以穩定速度前行。
package com.java1997; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.LinkedList; import javax.swing.JFrame; import javax.swing.JOptionPane; public class Snake extends JFrame{ private Point point=new Point(); private LinkedList<Point> list=new LinkedList<Point>(); private int time; private int key; //初始化 private void init(){ //食物初始位置 point.setLocation(100, 100); //蛇初始位置 list.add(new Point(300,300)); list.add(new Point(310,300)); list.add(new Point(320,300)); list.add(new Point(330,300)); list.add(new Point(340,300)); list.add(new Point(350,300)); list.add(new Point(360,300)); list.add(new Point(370,300)); list.add(new Point(380,300)); time=100; key=37; } @Override public void paint(Graphics g) { Image img = createImage(500, 500); Graphics g1=img.getGraphics(); //畫背景 g1.setColor(Color.BLACK); g1.fillRect(0, 0, 500, 500); //線框 g1.translate(50, 50); g1.setColor(Color.WHITE); g1.drawRect(0, 0, 400, 400); //線條用draw,填滿用fill //食物 g1.setColor(Color.CYAN); g1.fillOval(point.x, point.y, 10, 10); //蛇 g1.setColor(Color.PINK); for(Point p:list){ g1.fillRect(p.x, p.y, 10, 10); } g.drawImage(img, 0, 0, 500, 500, this); } public Snake(){ this.setTitle("玩蛇騷年"); //標題 this.setSize(500,500); //大小 this.setVisible(true); //可見 this.setLocationRelativeTo(null); //居中 this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e){ if(e.getKeyCode()>=37 && e.getKeyCode()<=40){ if(Math.abs(e.getKeyCode()-key)!=2){ key=e.getKeyCode(); } } } }); init(); new Thread(new Move()).start(); } //實現執行緒 class Move implements Runnable{ public void run() { int i=0;//記步數 while(true){ try { System.out.println(i+"~~~"); Thread.sleep(time); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //獲取蛇頭 Point p = list.getFirst().getLocation(); switch (key) { case 37: p.x=p.x-10; break; case 38: p.y=p.y-10; break; case 39: p.x=p.x+10; break; case 40: p.y=p.y+10; break; } //蛇不能撞牆,不能撞自己 System.out.println(p.x+","+p.y); if(p.x<0||p.x>390||p.y<0||p.y>390||list.contains(p)){ JOptionPane.showMessageDialog(null, "遊戲結束 GG"); break; } list.addFirst(p); //吃球,更新球座標 if(p.equals(point)){ int x=(int)(Math.random()*40)*10; int y=(int)(Math.random()*40)*10; point.setLocation(x, y); }else{ list.removeLast(); } Snake.this.repaint(); i++; } } } public static void main(String[] args) { new Snake(); } }