贪吃蛇java代码解释_贪吃蛇java代码

package cn;

import javax.swing.*;

public class Snake {

public static void main(String[] args) {

JFrame frame=new JFrame();

frame.setBounds(400,200,900,700);

frame.setResizable(false);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

SnakePanel panel=new SnakePanel();

frame.add(panel);

frame.setVisible(true);

}

}

Snake类的代码

package cn;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.Random;

public class SnakePanel extends JPanel implements KeyListener, ActionListener {

ImageIcon up=new ImageIcon("C:\\Users\\Administrator\\Desktop\\up.png");

ImageIcon down=new ImageIcon("C:\\Users\\Administrator\\Desktop\\down.png");

ImageIcon left=new ImageIcon("C:\\Users\\Administrator\\Desktop\\left.png");

ImageIcon right=new ImageIcon("C:\\Users\\Administrator\\Desktop\\right.png");

ImageIcon title=new ImageIcon("C:\\Users\\Administrator\\Desktop\\title.jpg");

ImageIcon food=new ImageIcon("C:\\Users\\Administrator\\Desktop\\food.png");

ImageIcon body=new ImageIcon("C:\\Users\\Administrator\\Desktop\\body.png");

//蛇的数据结构

int[] snakeX=new int[750];

int[] snakeY=new int[750];

int len=3;

int score=0;

String direction="R";

//食物

Random random=new Random();

int foodX=random.nextInt(34)*25+25;

int foodY=random.nextInt(24)*25+75;

//游戏是否开始

boolean isStarted=false;

//游戏是否结束

boolean isGameOver=false;

Timer timer=new Timer(150,this);

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;

isGameOver=false;

}

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

{

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",300,300);

}

if(isGameOver)

{

g.setColor(Color.white);

g.setFont(new Font("arial",Font.BOLD,30));

g.drawString("Game Over!",300,300);

}

//画食物

food.paintIcon(this,g,foodX,foodY);

//计算分数和长度

g.setColor(Color.white);

g.setFont(new Font("arial",Font.PLAIN,15));

g.drawString("Score:"+score+"   Length:"+len,750,30);

}

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

int keyCode=e.getKeyCode();

if(keyCode==KeyEvent.VK_SPACE)

{

if(isGameOver)

{

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_RIGHT && !direction.equals("L"))

{

direction="R";

}

else if(keyCode==KeyEvent.VK_LEFT && !direction.equals("R"))

{

direction="L";

}

}

@Override

public void keyReleased(KeyEvent e) {

}

@Override

public void actionPerformed(ActionEvent e) {

/*

1.重新定一个闹钟

2.蛇移动

3。重画

*/

timer.start();

if (isStarted  && !isGameOver)

{

//移动身体

for (int i=len;i>0;i--)

{

snakeX[i]=snakeX[i-1];

snakeY[i]=snakeY[i-1];

}

//头移动

if(direction.equals("R"))

{

snakeX[0]=snakeX[0]+25;

if(snakeX[0]>850)

{

//snakeX[0]=25;

isGameOver=true;

}

}

else if(direction.equals("L"))

{

snakeX[0]=snakeX[0]-25;

if(snakeX[0]<25)

{

//snakeX[0]=850;

isGameOver=true;

}

}

else if(direction.equals("U"))

{

snakeY[0]=snakeY[0]-25;

if(snakeY[0]<75)

{

//snakeY[0]=650;

isGameOver=true;

}

}

else if(direction.equals("D"))

{

snakeY[0]=snakeY[0]+25;

if(snakeY[0]>650)

{

//snakeY[0]=75;

isGameOver=true;

}

}

//吃食物的逻辑

if(snakeX[0]==foodX&&snakeY[0]==foodY)

{

len++;

score++;

foodX=random.nextInt(34)*25+25;

foodY=random.nextInt(24)*25+75;

}

for (int i=1;i

{

if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i])

{

isGameOver=true;

}

}

}

repaint();//这一步特别重要

}

}

Panel类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值