Java实现简易版贪吃蛇
效果图
实现代码
SnakePanel.java
public class SnakePanel extends JPanel implements KeyListener ,ActionListener{
//加载图片
ImageIcon up=new ImageIcon("up.png");
ImageIcon down=new ImageIcon("down.png");
ImageIcon left=new ImageIcon("left.png");
ImageIcon right=new ImageIcon("right.png");
ImageIcon title=new ImageIcon("title.jpg");
ImageIcon food=new ImageIcon("food.png");
ImageIcon body=new ImageIcon("body.png");
//蛇的数据结构的设置
int[] snakex=new int[750];
int[] snakey=new int[750];
int len;
String direction="R";//表示的是蛇头的方向
//食物的数据
Random r=new Random();
int foodx=r.nextInt(34)*25+25;//闭前开后,随机的位置
int foody=r.nextInt(24)*25+75 ;
//游戏开始或者结束变量
boolean isStarted=false;
//游戏失败
boolean isFaild=false;
Timer timer=new Timer(150,this);
//统计分数
int score=0;
public SnakePanel() {//构造方法
this.setFocusable(true);
initSnake();//初始化,防止静态蛇
this.addKeyListener(this);
timer.start();
}
//初始化蛇,将蛇放在界面上
public void initSnake(){
len=3;
direction="R";
snakex[0]=100;
snakey[0]=100;
snakex[1]=75;
snakey[1]=100;
snakex[2]=50;
snakey[2]=100;
isStarted=false;
isFaild=false;
score=0;
}
public void paint (Graphics g ){
//设置画布的背景色
this.setBackground(Color.BLACK);
g.fillRect(25,75,850,600);
//设置标题
title.paintIcon(this,g,25,11);
//蛇头
if(direction.equals("R")){
right.paintIcon(this,g,snakex[0],snakey[0]);
}else if(direction.equals("L")){
left.paintIcon(this,g,snakex[0],snakey[0]);
}else if(direction.equals("U")){
up.paintIcon(this,g,snakex[0],snakey[0]);
}else if(direction.equals("D")){
down.paintIcon(this,g,snakex[0],snakey[0]);
}
//蛇身
for(int i=1;i<len;i++){
body.paintIcon(this,g,snakex[i],snakey[i]);
}
//画开始提示语
if(!isStarted){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press Space to Start/Pause",280,300);
}
//失败提示语
if(isFaild){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Game Over,Press Space to Restart",200 ,300);
}
//画食物
food.paintIcon(this,g,foodx,foody );
//分数和长度的统计
g.setColor(Color.RED);
g.setFont(new Font("arial",Font.PLAIN,15));
g.drawString("Score:"+score,750,35);
g.drawString("Length:"+len,750,55);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
if(isFaild){
initSnake();
}else
{
isStarted=!isStarted;
}
repaint();
}else if(keyCode==KeyEvent.VK_UP&&!direction.equals("D")){
direction="U";
}else if(keyCode==KeyEvent.VK_DOWN&&!direction.equals("U")){
direction="D";
}else if(keyCode==KeyEvent.VK_LEFT&&!direction.equals("R")){
direction="L";
}else if(keyCode==KeyEvent.VK_RIGHT&&!direction.equals("L")){
direction="R";
}
}
@Override
public void keyReleased(KeyEvent e) {
}
/*
* 1.重新定个闹钟
* 2.蛇移动
* 3.画布重新画*/
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
if(isStarted &&! isFaild){
//移动身体
for (int i=len;i>0;i--){
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
//头移动
if(direction.equals("R")){
//横坐标+25
snakex[0]=snakex[0]+25;
//超边界
if(snakex[0]>850){
isFaild=true;
}
}else if(direction.equals("L")){
snakex[0]=snakex[0]-25;
if(snakex[0]<25){
isFaild=true;
}
}else if(direction.equals("U")){
snakey[0]=snakey[0]-25;
if (snakey[0]<75){
isFaild=true;
}
}else if(direction.equals("D")){
snakey[0]=snakey[0]+25;
if(snakey[0]>650){
isFaild=true;
}
}
//吃食物的逻辑
if(snakex[0]==foodx&&snakey[0]==foody){
len++;
score++;
boolean flag=true;
while (flag){
foodx=r.nextInt(34)*25+25;
foody=r.nextInt(24)*25+75;
for(int i=0;i<len;i++){
if(foodx==snakex[i]&&foody==snakey[i])
break;
if( i==len-1)flag=false;
}
}
}
//判断死亡
for(int i=1;i<len;i++){
if(snakex[0]==snakex[i]&&snakey[0]==snakey[i])
isFaild=true;
}
}
repaint();}
}
Snake.java
public class Snake {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setBounds(400,200,900,720);
frame.setResizable(false);//大小不可以拖动
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭是退出
SnakePanel panle=new SnakePanel();
frame.add(panle);
frame.setVisible(true);
}
}
注:图片都是放在根目录下
因为这是第一个练手的项目,是看着视频制作的,有很多的知识点不能完全的讲解,如果有什么错误和不便,请见谅,期待越来越好的自己。