使用java自制一个简单的贪吃蛇游戏

使用素材文件夹:

素材说明:snake0是空白区域,snake1是墙,snake2是面包,snake3是向上的蛇头,snake4是向下的蛇头,snake5是向左的蛇头,snake6是向右的蛇头,snake7是向上的蛇身,snake8是向下的蛇身,snake9是向左的蛇身,snake10是向右的蛇身,snake.mid是背景音乐。

素材链接:https://pan.baidu.com/s/1U9xJ_QAN0J0APaK_DgN73A 提取码: vyjp 

场景需求:初始状态主角只有一个蛇头,地图随机生成一个面包,当主角吃到面包时,主角身长+1并生成一个新的面包,当蛇头触碰到墙壁或触碰到蛇身时,游戏结束。

场景分析:地图信息我们可以使用二维数组来存储,主角自身的信息我们可以使用一个叫做snake的ArrayList来进行存储,可以新建一个Node类,用来存储x坐标和y坐标以及这个位置主角的节点状态;

当主角每移动一次,可以细分为四种情况

①主角移动一格,蛇头碰到墙壁,游戏结束

②主角移动一格,蛇头碰到蛇身,游戏结束

③主角移动一格,没有吃到面包,蛇头向移动方向移动一格,原先的蛇头位置变成蛇身,原先的蛇身最后一个节点删除,其他部分保留

④主角移动一格,吃到了面包,蛇头向移动方向移动一格,原先的蛇头位置变成蛇身,原先的蛇身原封不动的保留(蛇头移动了一格,原有长度未删减,故实现了蛇的长度+1)

针对这四种情况,分别作出以下处理:

假设接受到方向指令时,玩家按的是上

①判断当前蛇头垂直向上一格的地图信息是墙吗?如果是墙,游戏结束

②判断当前蛇头垂直向上一格的地图信息是蛇身结点的状态吗?如果是,游戏结束

③判断当前蛇头垂直向上一格的地图信息是面包吗?如果不是面包,新建一个临时的ArrayList名叫temp,用来存储新的主角信息,先添加一个蛇头向上的Node信息到temp,再遍历原先的snake,从0遍历到snake.length-2的位置,遍历的第一个结点是原先的蛇头,需要先根据它的方向转换成蛇身的状态(也就是原先的蛇头向右,现在要变成蛇身向右)然后再将其添加到temp,其他结点则不需要转换直接添加到temp即可,最后将temp赋值给snake

④判断当前蛇头垂直向上一格的地图信息是面包吗?如果是面包,新建一个临时的ArrayList名叫temp,用来存储新的主角信息,先添加一个蛇头向上的Node信息到temp,再遍历原先的snake,从0遍历到snake.length-1的位置,遍历的第一个结点是原先的蛇头,需要先根据它的方向转换成蛇身的状态(也就是原先的蛇头向右,现在要变成蛇身向右)然后再将其添加到temp,其他结点则不需要转换直接添加到temp即可,最后将temp赋值给snake

目前贪吃蛇游戏的主要逻辑已经介绍完毕,但是现在它还是按键驱动的,我们可以为其添加一个线程,用于驱动其向蛇头指向方向移动,默认每移动一次,线程休眠500ms,玩家可以通过按键调整难度,难度加大则休眠时间减小,难度减小则休眠时间增加,在这个项目里,我默认难度最大的时候间隔200ms移动一次,难度最小的时候,间隔1000ms移动一次,可以通过A加速,D减速。

项目代码如下:

Map类:

package 贪吃蛇;

public class Map {
	int snakeX = 0;
	int snakeY = 0;
	int score = 0;
	int[][] map = new int[12][12];
	
	
	public Map(int snakeX,int snakeY,int[][] map){
		this.snakeX = snakeX;
		this.snakeY = snakeY;
		int temp[][] = new int[12][12];
		for(int i=0;i<12;i++){
			for(int j=0;j<12;j++){
				temp[i][j] = map[i][j];
			}
		}
		this.map = temp;//避免直接引用
		
	}


	public int getSnakeX() {
		return snakeX;
	}


	public void setSnakeX(int snakeX) {
		this.snakeX = snakeX;
	}


	public int getSnakeY() {
		return snakeY;
	}


	public void setSnakeY(int snakeY) {
		this.snakeY = snakeY;
	}


	public int getScore() {
		return score;
	}


	public void setScore(int score) {
		this.score = score;
	}


	public int[][] getMap() {
		return map;
	}


	public void setMap(int[][] map) {
		this.map = map;
	}
	
	
	
	
}

MapFactory类:

package 贪吃蛇;

//空是0,墙是1,面包是2,蛇头向右是6
public class MapFactory {
	static int[][] map={
		{1,1,1,1,1,1,1,1,1,1,1,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,2,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,6,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,1},		
		{1,1,1,1,1,1,1,1,1,1,1,1}		
	};
	
	public static int[][] getMap(){
		int [][] temp = new int[12][12];
		for(int i=0;i<12;i++)
		for(int j=0;j<12;j++)
			temp[i][j] = map[i][j];
		return temp;
	}
	
	
}

GameFrame类:

package 贪吃蛇;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JOptionPane;



public class GameFrame extends JFrame implements ActionListener ,MouseListener,KeyListener,Runnable{

	Thread t;//判断计时器
	private int countTime = 0;
	private int overTime = 500;//默认0.5秒移动一次
	private int snakeX = 5;
	private int snakeY = 5;
	private int score = 0;
	private int flag = 1;
	private int leftX = 0,leftY = 0;//地图左上角坐标
	//private int mapRow = 0,mapColumn = 0;//地图的行列数
	private int width = 0,height = 0;//屏幕大小
	private boolean acceptKey = true;
	private Image pic[] = null;
	private int[][] map = null;
	private ArrayList<Node> snake = new ArrayList<Node>();//存储蛇的每个部分的状态及坐标
	Sound sound;
	
	final int WALL = 1,FOOD = 2,SNAKEHEADUP = 3,SNAKEHEADDOWN = 4,SNAKEHEADLEFT = 5,
			SNAKEHEADRIGHT = 6,SNAKEBODYUP = 7,SNAKEBODYDOWN = 8,SNAKEBODYLEFT = 9,SNAKEBODYRIGHT = 10;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GameFrame();
	}
	
	public GameFrame(){
		super("贪吃蛇游戏带音乐版");
		setSize(600,600);
		setVisible(true);
		setResizable(false);
		setLocation(300,20);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container cont = getContentPane();
		cont.setLayout(null);
		cont.setBackground(Color.black);
		getPic();
		width = this.getWidth();
		height = this.getHeight();
		this.setFocusable(true);
		initMap();
		this.addKeyListener(this);
		this.addMouseListener(this);
		t = new Thread(this);
		t.start();
		//播放音乐预留。。。
		sound = new Sound();
		sound.loadSound();
	}
	
	public void paint(Graphics g){
		//System.out.println("我被调用了");
		printMap();
		
		for(int i=0;i<12;i++)
		for(int j=0;j<12;j++){
//			if(map[i][j]!=0){
//				System.out.println("这个位置 不是0,它的值是"+map[i][j]);
//				g.drawRect(10, 30, getWidth()/2-50, getHeight()/2-50);
				g.drawImage(pic[map[i][j]],leftX+j*30,leftY+i*30,30,30,this);
//			}
		}
		g.clearRect(140, 60 , 300, 40);
		g.setColor(Color.RED);
		g.setFont(new Font("楷体_2312",Font.BOLD,30));
		g.drawString("现在分数:", 200, 90);
		g.drawString(String.valueOf(score),360,90);
	}
	

	private void getPic() {
		// TODO Auto-generated method stub
		pic = new Image[11];
		for(int i=0;i<=10;i++){
			pic[i] = Toolkit.getDefaultToolkit().getImage("D:/Game/snake"+i+".jpg");
		}
	}

	private void initMap() {
		// TODO Auto-generated method stub
		map = MapFactory.getMap();
		snake.clear();
		flag = 1;
		int[][] temp = map;
		for(int i=0;i<temp.length;i++)
		{
			for(int j=0;j<temp[0].length;j++){
				System.out.print(temp[i][j]+" ");		
				}
			System.out.println();
		}	
		
		getMapSizeAndPosition();
		getSnakeHeadPosition();
	}
	
	//获取游戏区域大小及显示游戏的左上角位置
	public void getMapSizeAndPosition(){
		int mapRow = map.length;
		int mapColumn = map[0].length;
		leftX = (width - map[0].length * 30)/2;
		leftY = (height - map.length * 30)/2;
		System.out.println(leftX);
		System.out.println(leftY);
		System.out.println(mapRow);
		System.out.println(mapColumn);
	}

	//获取蛇头位置
	public void getSnakeHeadPosition(){
		for(int i=1;i<11;i++){
			for(int j=1;j<11;j++){
				if(map[i][j]==SNAKEHEADUP||map[i][j]==SNAKEHEADDOWN||map[i][j]==SNAKEHEADLEFT||map[i][j]==SNAKEHEADRIGHT){
					snakeX = i;
					snakeY = j;
					snake.add(new Node(map[i][j],snakeX,snakeY));//初始化蛇的信息
					break;
				}			
			}
		}
	}


	
	
	public class Node{
		int state;
		int x;
		int y;
		
		public Node(int state,int x,int y){
			this.state = state;
			this.x = x;
			this.y = y;
		}
		
	}
	
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode() == KeyEvent.VK_A){
			if(overTime>200)//最难一秒移5格
			overTime -=100;
		}
		if(e.getKeyCode() == KeyEvent.VK_D){
			if(overTime<1000)//最容易一秒移1格
				overTime +=100;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_UP){
			if(map[snake.get(0).x][snake.get(0).y]==SNAKEHEADDOWN){//如果蛇头向下,不让其向上移动

				return;
			}
			
			if(map[snake.get(0).x-1][snake.get(0).y]==WALL||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYUP||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYDOWN
					||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYLEFT||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYRIGHT){
					flag = 2;//撞墙或吃到自己
				}
			else
				moveUp();
		}
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			
			if(map[snake.get(0).x][snake.get(0).y]==SNAKEHEADUP){//如果蛇头向上,不让其向下移动

				return;
			}
			
			if(map[snake.get(0).x+1][snake.get(0).y]==WALL||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYUP||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYDOWN
					||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYLEFT||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYRIGHT){
					flag = 2;
			}
			else
				moveDown();
		}
		if(e.getKeyCode() == KeyEvent.VK_LEFT){
			
			if(map[snake.get(0).x][snake.get(0).y]==SNAKEHEADRIGHT){//如果蛇头向右,不让其向左移动

				return;
			}
			
			if(map[snake.get(0).x][snake.get(0).y-1]==WALL||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYUP||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYDOWN
					||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYLEFT||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYRIGHT){
					flag = 2;
			}
			else 
				moveLeft();
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			if(map[snake.get(0).x][snake.get(0).y]==SNAKEHEADLEFT){//如果蛇头向左,不让其向下移动

				return;
			}
			
			if(map[snake.get(0).x][snake.get(0).y+1]==WALL||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYUP||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYDOWN
					||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYLEFT||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYRIGHT){
					flag = 2;
			}
			else 
				moveRight();
		}
				
		repaint();

		if(flag==2){
			acceptKey = false;
			String msg = "游戏结束,你的得分是"+score+"\n是否重来?";
			int type = JOptionPane.YES_NO_OPTION;
			String title = "Game Over";
			int choice = 0;
			choice = JOptionPane.showConfirmDialog(null, msg,title,type);
			if(choice==1){
				System.exit(0);
			}else if(choice == 0){
				acceptKey = true;
				initMap();
				score=0;
				countTime = 0;
				overTime = 500;
				repaint();
		}
		}
		
		
	}

	private void moveRight() {
		// TODO Auto-generated method stub
		System.out.println("我按的是右啊");
		countTime = 0;
		ArrayList<Node> temp = new ArrayList<Node>();
		int x = snake.get(0).x;
		int y = snake.get(0).y+1;
		if(map[x][y] == FOOD){
			score++;
			resetFood();
			temp.add(new Node(SNAKEHEADRIGHT,x,y));
			map[x][y] = SNAKEHEADRIGHT;
			for(int i=0;i<snake.size();i++){
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
//			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		else{
			temp.add(new Node(SNAKEHEADRIGHT,x,y));
			map[x][y] = SNAKEHEADRIGHT;
			for(int i=0;i<snake.size()-1;i++){			
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		
		snake = temp;
	}

	private void moveLeft() {
		// TODO Auto-generated method stub
		System.out.println("我按的是左啊");
		countTime = 0;
		ArrayList<Node> temp = new ArrayList<Node>();
		int x = snake.get(0).x;
		int y = snake.get(0).y-1;
		if(map[x][y] == FOOD){
			score++;
			resetFood();
			temp.add(new Node(SNAKEHEADLEFT,x,y));
			map[x][y] = SNAKEHEADLEFT;
			for(int i=0;i<snake.size();i++){
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
//			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		else{
			temp.add(new Node(SNAKEHEADLEFT,x,y));
			map[x][y] = SNAKEHEADLEFT;
			for(int i=0;i<snake.size()-1;i++){			
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		
		snake = temp;
	}

	private void moveUp() {
		// TODO Auto-generated method stub
		System.out.println("我按的是上啊");
		countTime = 0;
		ArrayList<Node> temp = new ArrayList<Node>();
		int x = snake.get(0).x-1;
		int y = snake.get(0).y;
		if(map[x][y] == FOOD){
			score++;
			resetFood();
			temp.add(new Node(SNAKEHEADUP,x,y));
			map[x][y] = SNAKEHEADUP;
			for(int i=0;i<snake.size();i++){
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
//			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		else{
			temp.add(new Node(SNAKEHEADUP,x,y));
			map[x][y] = SNAKEHEADUP;
			for(int i=0;i<snake.size()-1;i++){			
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		
		snake = temp;
	}
	
	private void moveDown() {
		// TODO Auto-generated method stub
		System.out.println("我按的是下啊");
		countTime = 0;
		ArrayList<Node> temp = new ArrayList<Node>();
		int x = snake.get(0).x+1;
		int y = snake.get(0).y;
		if(map[x][y] == FOOD){
			score++;
			resetFood();
			temp.add(new Node(SNAKEHEADDOWN,x,y));
			map[x][y] = SNAKEHEADDOWN;
			for(int i=0;i<snake.size();i++){
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
//			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		else{
			temp.add(new Node(SNAKEHEADDOWN,x,y));
			map[x][y] = SNAKEHEADDOWN;
			for(int i=0;i<snake.size()-1;i++){			
				if(i==0){
					switch(snake.get(i).state){
					case SNAKEHEADUP:snake.get(i).state = SNAKEBODYUP;break;
					case SNAKEHEADDOWN:snake.get(i).state = SNAKEBODYDOWN;break;
					case SNAKEHEADLEFT:snake.get(i).state = SNAKEBODYLEFT;break;
					case SNAKEHEADRIGHT:snake.get(i).state = SNAKEBODYRIGHT;break;
					}
				}
				temp.add(snake.get(i));
				map[snake.get(i).x][snake.get(i).y] = snake.get(i).state;
			}	
			map[snake.get(snake.size()-1).x][snake.get(snake.size()-1).y] = 0;
		}
		
		snake = temp;
		
	}

	private void printMap(){
		for(int i=0;i<map.length;i++)
		{
			for(int j=0;j<map[0].length;j++){
				System.out.print(map[i][j]+" ");		
				}
			System.out.println();
		}		
		System.out.println("______________________________________________");
	}
	
	private void resetFood(){
		int x,y;
		do{
			x = (int) (Math.random()*10)+1;
			y = (int)(Math.random()*10)+1;
		}while(map[x][y]!=0);
		map[x][y] = FOOD;		
		
	}
	


	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void judge(){
		if(flag==2){
			acceptKey = false;
			String msg = "游戏结束,你的得分是"+score+"\n是否重来?";
			int type = JOptionPane.YES_NO_OPTION;
			String title = "Game Over";
			int choice = 0;
			choice = JOptionPane.showConfirmDialog(null, msg,title,type);
			if(choice==1){
				System.exit(0);
			}else if(choice == 0){
				acceptKey = true;
				initMap();
				flag=1;
				countTime = 0;
				score=0;
				overTime = 500;
				repaint();
		}
		}
	}
	
	@Override
	public void run() {
		
		while(true){
			if(countTime<overTime){
				countTime += 50;
			}else{
				countTime = 0;
				switch(snake.get(0).state){
				case SNAKEHEADUP:{
					if(map[snake.get(0).x-1][snake.get(0).y]==WALL||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYUP||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYDOWN
							||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYLEFT||map[snake.get(0).x-1][snake.get(0).y]==SNAKEBODYRIGHT){
							flag = 2;//撞墙或吃到自己
						}
					else
						moveUp();
				};break;//根据蛇头方向向前移动
				case SNAKEHEADDOWN:{
					if(map[snake.get(0).x+1][snake.get(0).y]==WALL||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYUP||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYDOWN
							||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYLEFT||map[snake.get(0).x+1][snake.get(0).y]==SNAKEBODYRIGHT){
							flag = 2;
					}
					else
						moveDown();
				};break;
				case SNAKEHEADLEFT:{
				if(map[snake.get(0).x][snake.get(0).y-1]==WALL||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYUP||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYDOWN
							||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYLEFT||map[snake.get(0).x][snake.get(0).y-1]==SNAKEBODYRIGHT){
							flag = 2;
				}
					else 
						moveLeft();
				};break;
				case SNAKEHEADRIGHT:{
					if(map[snake.get(0).x][snake.get(0).y+1]==WALL||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYUP||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYDOWN
							||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYLEFT||map[snake.get(0).x][snake.get(0).y+1]==SNAKEBODYRIGHT){
							flag = 2;
					}
					else 
						moveRight();
				};break;
				}
				
				repaint();
				
				
				
			}
			try {
				if(flag!=2)//如果下一步不会撞墙或者吃掉自己
					Thread.sleep(50);
				else{//游戏结束
					judge();
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

Sound类:

package 贪吃蛇;

import java.io.File;
import java.io.IOException;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class Sound {
	String path = new String("D:/Music/");
	String file = new String("snake.mid");
	Sequence seq;
	Sequencer midi;
	boolean sign;
	void loadSound(){
		try {
			seq = MidiSystem.getSequence(new File(path+file));
			midi = MidiSystem.getSequencer();
			midi.open();
			midi.setSequence(seq);
			midi.start();
			midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
			
		} catch (InvalidMidiDataException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MidiUnavailableException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		sign = true;
	}
	
	public Sound(){
		
	}
	

	
	void mystop(){midi.stop();midi.close();sign=false;}
	boolean isplay(){return sign;}
	void setMusic(String e){file=e;}
	
}

如果需要修改关卡难度(比如增加障碍)的话,可以对MapFactory的地图信息进行部分修改。

需要自定义贪吃蛇的话,按自己需要修改图片即可。

游戏运行效果如下:

猜你喜欢

转载自blog.csdn.net/A1344714150/article/details/84677625