package com.fish.game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class GamePanel extends JPanel {
//定义蛇的长度
int length;
//定义蛇头的方向
String direction;
//定义一个游戏开始的标识
boolean isStart = false;
//定义一个定时器
Timer timer;
//定义两个数组存储蛇的坐标
int[] snakeX = new int[500];
int[] snakeY = new int[500];
//定义食物坐标
int foodX;
int foodY;
//定义积分
int score;
//判断蛇是否死亡
boolean isDie=false;//默认蛇是活的
//定义一个选择那种食物
int foodChoice;
//定义一个方法初始化蛇的位置
void init() {
//初始化蛇身的长度
length = 3;
//蛇头的位置
snakeX[0] = 175;
snakeY[0] = 475;
//第一节蛇身的位置
snakeX[1] = 150;
snakeY[1] = 475;
//第二节蛇身的位置
snakeX[2] = 120;
snakeY[2] = 475;
//初始化蛇头的方向
direction = "R";//U D L R
//初始化食物的坐标
foodX=125;
foodY=525;
//初始化食物为苹果 0 ,橙子 1,桃子 2;
foodChoice=0;
}
//空参构造函数
GamePanel() {
init();
//将焦点设置当前的面板上
this.setFocusable(true);
//加入监听,用来监听鼠标按键的。匿名内部类(接口的实现类或抽象方法的继承类)
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
int keyCode = e.getKeyCode();//获取键盘按键的SC码
if (keyCode == KeyEvent.VK_SPACE) {//监听空格键
if(isDie){//如果蛇已经死亡了,则重新开始
init();
//改变蛇的状态
isDie=false;
}else {//如果蛇没死的情况下,正常开始游戏
isStart = !isStart;
//画面重绘
repaint();//重绘动作会调用paintComponent(Graphics g)方法
}
}
//监听向上键
if(keyCode==KeyEvent.VK_UP){
direction="U";
}
//监听向下键
if(keyCode==KeyEvent.VK_DOWN){
direction="D";
}
//监听向右键
if(keyCode==KeyEvent.VK_RIGHT){
direction="R";
}
//监听向左键
if(keyCode==KeyEvent.VK_LEFT){
direction="L";
}
}
});
//对定时器进行初始化操作,作用是每隔300毫秒改变蛇的坐标参数,重新画蛇
timer=new Timer(300, new ActionListener() {
/**
* ActionListener是事件监听相当于每300ms监听一下你是否发生了
* 一个动作.具体的动作放入actiorPerformed
* @param e
*/
@Override
public void actionPerformed(ActionEvent e) {
if(isStart==true&&isDie==false){//判断游戏是否开始,只有游戏开始且蛇是活的,才有动作
//动身子:后一节身子走到前一节身子的坐标上,0索引是蛇头,1是第一节蛇身
for (int i = length-1; i >0 ; i--) {
//将前一节的坐标赋给后一节的
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//更改蛇头坐标:
// R:X坐标+25,Y坐标不变
if("R".equals(direction)){
snakeX[0]+=25;
}
// L:X坐标+25,Y坐标不变
if("L".equals(direction)){
snakeX[0]-=25;
}
// U:X坐标+25,Y坐标不变
if("U".equals(direction)){
snakeY[0]-=25;
}
// D:X坐标+25,Y坐标不变
if("D".equals(direction)){
snakeY[0]+=25;
}
//防止蛇超出右边界
if(snakeX[0]>790){
snakeX[0]=10;
}
//防止蛇超出左边界
if(snakeX[0]<10){
snakeX[0]=790;
}
//防止蛇超出上边界
if(snakeY[0]<50){
snakeY[0]=790;
}
//防止蛇超出下边界
if(snakeY[0]>790){
snakeY[0]=50;
}
//蛇和食物发送碰撞(即蛇吃食物)
if(snakeX[0]==foodX&&snakeY[0]==foodY){
//计算积分,苹果每次加10分,橙子每次加20分,桃子每次加30分
switch (foodChoice){
case 0: score+=10;
break;
case 1: score+=20;
break;
case 2: score+=30;
break;
}
//改变蛇的长度
length++;
//更换食物
Random rd=new Random();
foodChoice= rd.nextInt(3);
//重新生成食物的坐标
/**
* [50,750]->[2,30]*25
* [2 30]
* Math.random()->[0.0,1.0)
* Math.random()*30->[0.0,30.0)
* (int)(Math.random()*30)->[0,29]
* (int)(Math.random()*30)+2 ->[2,32]
*/
foodX=((int) (Math.random()*25)+2)*25;
/**
* [100,725]->[4,29]*25
* [4,29]->[0,25]+4
* [0,25]
* new Random().nextInt(26)->[0,26)->[0,25]
*/
foodY=(new Random().nextInt(23)+4)*25;
}
//判断蛇是否死亡:蛇头和任意一节身子的坐标相等时,蛇才死亡
for (int i = 1; i <length ; i++) {
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
isDie=true;
}
}
//重绘
repaint();
}
}
});
//Timer启动
timer.start();
}
//重写划面板的方法
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//填充背景颜色,color里面填rgb三原色,红、绿,蓝
this.setBackground(new Color(209, 224, 195));
//画头部图片
Images.headImg.paintIcon(this, g, 1, 1);
//设置画笔的颜色
g.setColor(new Color(165, 204, 219));
//画一个矩形
// g.drawRect(1,60,785,698);
g.fillRect(1, 60, 785, 698);
//画小蛇
//1.根据蛇头的方向画画蛇头
if ("R".equals(direction)) {
Images.righ
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java Swing的小游戏-贪吃蛇(JAVA、Swing)(适合初学者学习参考)源代码
共16个文件
png:11个
java:4个
iml:1个
需积分: 5 0 下载量 163 浏览量
2024-12-03
15:49:53
上传
评论
收藏 201KB RAR 举报
温馨提示
贪吃蛇小游戏,通过java swing编写
资源推荐
资源详情
资源评论
收起资源包目录
SnakeGameGradeA.rar (16个子文件)
SnakeGameGradeA
src
images
down.png 2KB
Apple.png 2KB
orange.png 2KB
left.png 2KB
head2.png 92KB
food.png 1KB
head.png 88KB
peach.png 2KB
up.png 2KB
right.png 2KB
body.png 828B
com
fish
game
StartGame.java 1KB
Images.java 3KB
GamePanel.java 10KB
test
TestGame.java 544B
SnakeGameGradeA.iml 871B
共 16 条
- 1
资源评论
yzs507
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功