贪吃蛇自己做的才有意思
在这里插入代码片
package entiy;
import javax.swing.JFrame;
public class snake {
public static void main(String[] args){
JFrame frame =new JFrame();//创建窗口
frame.setBounds(400, 200, 900, 720);//设置x、y、长、宽
frame.setResizable(false);//窗口不可移动
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在窗口关闭时程序退出
//创建画布
snakePanel panel=new snakePanel();
//添加画布
frame.add(panel);
frame.setVisible(true);//显示窗体
}
}
在这里插入代码片
package entiy;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
//监听键盘动作
public class snakePanel extends JPanel implements KeyListener, ActionListener {
// 加载所有图片
ImageIcon up = new ImageIcon("up.png");
ImageIcon body = new ImageIcon("body.png");
ImageIcon down = new ImageIcon("down.png");
ImageIcon food = new ImageIcon("food.png");
ImageIcon left = new ImageIcon("left.png");
ImageIcon right = new ImageIcon("right.png");
ImageIcon title = new ImageIcon("title.jpg");
// 设计蛇
int[] snakex = new int[750];// 横坐标
int[] snakey = new int[750];// 纵坐标
int len = 3;
String direction = "R";// R右L左U上D下
// 食物的随机生成
Random r = new Random();
int foodx = r.nextInt(34) * 25 + 25;
int foody = r.nextInt(24) * 25 + 75;
// 游戏是否开始
boolean isStarted = false;
// 游戏是否失败
boolean isFaild = false;
//统计分数
int score =0;
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;
isStarted=false;
isFaild=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 < 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", 300, 300);
}
//画失败提示语
if(isFaild){
// 设置提示语颜色
g.setColor(Color.WHITE);
// 设置字体
g.setFont(new Font("arial", Font.BOLD, 30));
// 画文字
g.drawString("GAME OVER,press space to start", 300, 300);
}
// 画食物
food.paintIcon(this, g, foodx, foody);
//画分数和长度统计
g.setColor(Color.WHITE);
g.setFont(new Font("arial", Font.PLAIN, 15));
g.drawString("Score:"+score, 750, 30);
g.drawString("Length:"+len, 750, 50);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
// 键盘按下去的方法
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
if(isFaild){
initSnake();
}else{
isStarted = !isStarted;
}
// 重新画改变isStarted的状态,只有为false 才可以使得提示语言有效
//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) {
// TODO Auto-generated method stub
}
// 实现蛇移动的监听,动作的执行
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 重新定闹钟
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) {
snakex[0] = 25;
}
} else if (direction.equals("L")) {
// 横坐标-25
snakex[0] = snakex[0] - 25;
if (snakex[0] < 25) {
snakex[0] = 850;
}
} else if (direction.equals("U")) {
// 纵坐标-25
snakey[0] = snakey[0] - 25;
if (snakey[0] < 75) {
snakey[0] = 650;
}
} else if (direction.equals("D")) {
// 纵坐标+25
snakey[0] = snakey[0] + 25;
if (snakey[0] > 650) {
snakey[0] = 75;
}
}
// 吃食物的逻辑
if (snakex[0] == foodx && snakey[0] == foody) {
len++;
score++;
foodx = r.nextInt(34) * 25 + 25;
foody = r.nextInt(24) * 25 + 75;
//如果食物出现在身体里则重新产生食物
for(int i=0;i<len;i++){
if(snakex[i] == foodx && snakey[i] == foody){
foodx = r.nextInt(34) * 25 + 25;
foody = r.nextInt(24) * 25 + 75;
}
}
}
// 头部碰到身体判断为死亡
for (int i = 1; i < len; i++) {
if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
isFaild = true;
}
}
}
repaint();
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200425151412873.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2huZXdvX3BkYXll,size_16,color_FFFFFF,t_70)