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) {
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于JavaSE的儿时经典小游戏-贪吃蛇
共18个文件
png:14个
java:3个
jar:1个
0 下载量 88 浏览量
2024-03-01
18:32:53
上传
评论
收藏 158KB ZIP 举报
温馨提示
JavaSE版的经典儿时小游戏“贪吃蛇”是一款深受广大玩家喜爱的单机桌面游戏,它是基于Java Standard Edition(JavaSE)平台开发,利用Java语言的图形用户界面(GUI)功能实现的。在这款游戏中,开发者通常采用Java Swing或AWT库进行窗口及图形绘制,以模拟出熟悉的二维游戏环境。 游戏的基本规则如下: 游戏目标:玩家通过键盘控制一条虚拟的蛇在游戏区域内移动,蛇的目标是不断寻找并“吃掉”随机出现在地图上的食物(通常表现为一个小点或者水果图标)。 蛇的移动:每次吃到食物,蛇的长度会增加,同时玩家获得积分奖励;蛇只能按照上、下、左、右四个基本方向移动,并且移动过程中蛇的身体不可自相碰撞。 游戏挑战:随着蛇的增长,移动空间逐渐减小,增加了操作难度,对玩家反应速度和策略规划提出了更高要求。一旦蛇头触碰到墙壁或者自己的身体,游戏即告结束。 游戏机制:游戏中还包括边界处理,蛇在屏幕边界处可以实现循环穿越,也就是从一侧消失后在另一侧出现,以保持游戏连续性。 交互设计:为了提升用户体验,游戏还可能包含暂停/继续、重新开始等功能,比如通过按下空格键来暂停游戏或在失败后重
资源推荐
资源详情
资源评论
收起资源包目录
snake.zip (18个子文件)
snake
src
statics
down.png 2KB
left.png 2KB
food.png 1KB
header.png 39KB
up.png 2KB
right.png 2KB
body.png 1KB
com
kuang
snake
GamePanel.java 6KB
StartGames.java 577B
Data.java 1KB
statics
down.png 2KB
left.png 2KB
food.png 1KB
header.png 39KB
up.png 2KB
right.png 2KB
body.png 1KB
snake.jar 55KB
共 18 条
- 1
资源评论
侯彦庆
- 粉丝: 2315
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功