1. 程式人生 > >Day02 騷年,玩蛇嗎?(製作小遊戲貪吃蛇)

Day02 騷年,玩蛇嗎?(製作小遊戲貪吃蛇)

花了兩天時間,終於讓我的蛇跑起來了,第一次自己獨立做成功一個小遊戲,感覺很有成就感。嘻嘻嘻嘻嘻嘻~~~


附上實現後的圖,可以玩,但還有些細節需要改進,比如記分,暫停,重玩等功能暫時還沒實現,以後會改進的


我說一下思路和步驟

第一步: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();
	}

}