这是本人写的第一个游戏  简单写下过程

开发环境:

Java SE 8  Ecplice

思路:蛇的可以看成是由一个一个正方形组成,用Arraylist来记录下每一个正方体的坐标位置,先把前一个方块的坐标替换下一个方块的坐标,再通过move方法移动蛇头,最后repaint,如此循环。


需要掌握:

1.JFrame和JPanel的使用方法

2.Arraylist的使用方法

3.线程的创建

4.KeyListener的使用

5.双缓冲


共有两个类:

Test:


<pre name="code" class="java">import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;


public class Test {
	public static void main(String args[]){
		JFrame frame = new JFrame();
		Mypanel mp = new Mypanel();
		mp.setBackground(Color.WHITE);//设置JPanel背景色
		mp.addKeyListener(mp);
		frame.addKeyListener(mp);//绑定监听器
		frame.add(mp,BorderLayout.CENTER);//把JPanel放到JFrame中央
		frame.setSize(1920,1080);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Thread t = new Thread(mp);
		t.start();//启动线程
	}
}







Mypanel:



import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JPanel;

public class Mypanel extends JPanel implements Runnable, KeyListener{
	
	int p,o,q,w;
	//食物随机出现
	int x_food = (int)(Math.random()*60)*30+100;
	int y_food = (int)(Math.random()*30)*30+100;
	int x[] = new int[10];
	int y[] = new int[10];
	int x_c[];
	int y_c[];
	int x_1 = 30;
	int y_1 = 0;
	int check_food = 0;
	int check_self = 0;
	
	ArrayList list_x = new ArrayList();
	ArrayList list_y = new ArrayList();
	
	Image ImageBuffer = null;
	Graphics GraImage = null;
	
	String direction = "right";
	
	//构造函数 初始化蛇的位置 
	public Mypanel(){
		for(int i = 0; i < 10; i++){
			x[i] = 100 + 30*i;
			y[i] = 400;
			list_x.add(new Integer(x[i]));
			list_y.add(new Integer(y[i]));
		}			
	}
	public void paint(Graphics g){
		super.paint(g);
		g.setColor(Color.BLACK);
		g.fillRect(x_food, y_food, 30, 30);
		if(check_self == 1){
			g.setColor(Color.BLACK);
			g.fillRect(0, 0, 1920, 1080);
		}
		for(int i = 0; i < list_x.size(); i++){	
			g.fillRect(((Integer) list_x.get(i)).intValue(), ((Integer) list_y.get(i)).intValue(), 30, 30);
		}
	}
	public void run(){
		while(true){
			for(int i = 0; i < list_x.size()-1; i++){
				list_x.set(i,list_x.get(i + 1));
				list_y.set(i,list_y.get(i + 1));
			}
			move(direction);
			stay();
			food();
			carshcheck();
		}
	}
	
	//重画
	public void stay(){
		try{
			Thread.sleep(200);
		}catch(Exception e){}
		repaint();
	}
	
	
	public void move(String d){
		if(d == "right"){
			p = 1;
			o = 0;
		}
		if(d =="left"){
			p = -1;
			o = 0;
		}
		if(d =="up"){
			p = 0;
			o = -1;
		}
		if(d =="down"){
			p = 0;
			o = 1;
		}
		
		q = ((Integer) list_x.get(list_x.size()-1)).intValue();
		w = ((Integer) list_y.get(list_y.size()-1)).intValue();
		q += 30*p;
		w += 30*o;
		list_x.set(list_x.size()-1,new Integer(q)) ;
		list_y.set(list_y.size()-1,new Integer(w)) ;//代码检查要细心
	}
	
	public void food(){
		check_food = 0;
		if(direction == "left"){
			x_1 = 30; 
			y_1 = 0;
		}
		if(direction == "right"){
			x_1 = -30;
			y_1 = 0;
		}
		if(direction == "up"){
			x_1 = 0; 
			y_1 = 30;
		}
		if(direction == "down"){
			x_1 = 0;
			y_1 = -30;
		}
		if(q == x_food + x_1 && w == y_food + y_1){
			list_x.add(new Integer(x_food));
			list_y.add(new Integer(y_food));
			check_food = 1;
			repaint();
			x_food = (int)(Math.random()*60)*30+100;
			y_food = (int)(Math.random()*30)*30+100;
		}
	}
	
	//自身碰撞检测
	public void carshcheck(){
		for(int i = 0; i < list_x.size(); i++){
			for(int j = i + 1; j < list_x.size(); j++){
				if(list_x.get(i).equals(list_x.get(j)) && list_y.get(i).equals(list_y.get(j)) && check_food == 0){
					check_self = 1;
				}
			}
		}
	}
	
	//按键处理
	public void keyPressed(KeyEvent arg0) {
		if(arg0.getKeyCode()==37 && direction!="right"){
			direction = "left";
		}
		if(arg0.getKeyCode()==38 && direction!="down"){
			direction = "up";
		}
		if(arg0.getKeyCode()==39 && direction!="left"){
			direction = "right";
		}
		if(arg0.getKeyCode()==40 && direction!="up"){
			direction = "down";
		}
	}
	public void keyReleased(KeyEvent arg0) {
	}
	public void keyTyped(KeyEvent arg0) {	
	}
	
	//双缓冲
	public void update(Graphics g){
		ImageBuffer = createImage(this.getWidth(), this.getHeight()); 
		GraImage = ImageBuffer.getGraphics();       
		paint(GraImage);        
		GraImage.dispose();      
		g.drawImage(ImageBuffer, 0, 0, this);   
	} 
}