package com.kuang.snake;
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 GamePanel extends JPanel implements KeyListener, ActionListener {
int length; // 蛇的长度
int[] snakeX = new int[600]; // 蛇的坐标X
int[] snakeY = new int[500]; // 蛇的坐标Y
String direction; // 蛇头方向
boolean isStart = false; // 游戏是否开始
Timer timer = new Timer(100, this); // 定时器
// 定义一个食物
int foodX;
int foodY;
Random random = new Random();
boolean isFail = false; // 死亡判断
int score; // 积分系统
// 构造器
public GamePanel() {
init();
// 获取键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
timer.start(); // 启动定时器
}
// 初始化
public void init() {
length = 3;
snakeX[0] = 100;snakeY[0] = 100; // 头部坐标
snakeX[1] = 75;snakeY[1] = 100; // 第一个身体坐标
snakeX[2] = 50;snakeY[2] = 100; // 第二个身体坐标
direction = "R"; // 蛇头向右
// 食物坐标
foodX = 25 + 25 * random.nextInt(34);
foodY = 75 + 25 * random.nextInt(24);
score = 0; // 积分
}
// 画板:画边界,画蛇
// Graphics:画笔
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 清屏
this.setBackground(Color.WHITE); // 设置背景颜色
Data.header.paintIcon(this, g, 25, 11); // 绘制头部的广告栏
g.fillRect(25, 75, 850, 600); // 绘制游戏区域
// 画一条静态的小蛇
if (direction.equals("L")) { // 蛇头(左)
Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (direction.equals("R")) { // 蛇头(右)
Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (direction.equals("U")) { // 蛇头(上)
Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (direction.equals("D")) { // 蛇头(下)
Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
}
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); // 蛇的长度通过length控制
}
// 画食物
Data.food.paintIcon(this, g, foodX, foodY);
// 画积分
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 18));
g.drawString("长度:"+length, 750, 35);
g.drawString("积分:"+score, 750, 50);
// 游戏提示:是否开始
if (isStart == false) {
// 画一个文字
g.setColor(Color.WHITE); // 设置画笔颜色
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("按下空格键开始游戏", 300, 300);
}
// 失败提示
if (isFail == true) {
// 画一个文字
g.setColor(Color.RED); // 设置画笔颜色
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("游戏失败,按下空格键重新开始", 200, 300);
}
}
// 接收键盘的输入:监听
@Override
public void keyPressed(KeyEvent e) {
// 获取键盘按下的按键
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) { // 如果按下的是空格键
if (isFail) { // 游戏失败,重新开始
isFail = false;
init(); // 重新初始化
} else { // 暂停游戏
isStart = !isStart;
}
repaint(); // 刷新界面
}
// 键盘控制走向
if (keyCode == KeyEvent.VK_LEFT) {
direction = "L"; // 左
} else if (keyCode == KeyEvent.VK_RIGHT) {
direction = "R"; // 右
} else if (keyCode == KeyEvent.VK_UP) {
direction = "U"; // 上
} else if (keyCode == KeyEvent.VK_DOWN) {
direction = "D"; // 下
}
}
// 定时器,监听时间:帧
@Override
public void actionPerformed(ActionEvent e) {
// 如果游戏处于开始状态,并且游戏没有结束
if (isStart && isFail == false) {
// 身体移动
for (int i = length - 1; 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;
}
} else if (direction.equals("L")) { // 左移
snakeX[0] = snakeX[0] - 25;
// 边界判断
if (snakeX[0] < 25) {
snakeX[0] = 850;
}
} else if (direction.equals("U")) { // 上移
snakeY[0] = snakeY[0] - 25;
// 边界判断
if (snakeY[0] < 75) {
snakeY[0] = 650;
}
} else if (direction.equals("D")) { // 下移
snakeY[0] = snakeY[0] + 25;
// 边界判断
if (snakeY[0] > 650) {
snakeY[0] = 75;
}
}
// 如果蛇头和食物重合(吃到食物)
if (snakeX[0] == foodX && snakeY[0] == foodY) {
length++; // 长度+1
score = score + 10; // 吃到食物+10
// 重新生成食物坐标
foodX = 25 + 25 * random.nextInt(34);
foodY = 75 + 25 * random.nextInt(24);
}
// 结束判断
for (int i = 1; i < length; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
isFail = true;
}
}
repaint(); // 刷新界面
}
timer.start(); // 定时器启动
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
教编程的侯老师
- 粉丝: 2427
- 资源: 20
最新资源
- CTF密码学专项解密和加密集成工具
- Node.js安装全指南:覆盖Windows、macOS与Linux多系统适配及镜像源配置
- 基于 C 语言的删除链表末尾脚本函数
- 网络协议中的PPP认证流程及关键技术点解析
- 基于STM32可调电源带电流保护-V1.0版
- PantumP2500系列维修手册
- 启动 MATLAB 出现 License checkout failed. Invalid host. License Manager Error -9
- ChatGPT付费创作系统V3.1.0独立版 WEB+H5+小程序端 (新增支持非微信环境的H5支付)
- C++求链表长度的递归方法
- C语言求链表长度的递归方法
- docker-compose-linux-x86-64-v2.32.2
- 基于java+ssm+mysql的可视化高校公寓管理系统开题报告.doc
- 股票分时图K线图小程序源码.7z
- 基于java+ssm+mysql的量化积分管理系统开题报告.doc
- 基于java+ssm+mysql的敏捷工贸公司销售管理系统开题报告.docx
- A Pathfinding Project Pro 5.2.5
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈