使用素材文件夹:
素材说明: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的地图信息进行部分修改。
需要自定义贪吃蛇的话,按自己需要修改图片即可。
游戏运行效果如下: