package com.msb.game;
import javax.imageio.stream.ImageInputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
/**
* GamePanel 继承了JPanel以后,才具备了面板的功能,才成为了一个面板
*/
public class GamePanel extends JPanel {
//定义两个数组
//蛇的长度:
int length;
//一个专门存储蛇的x轴坐标的数组
int[] snakeX = new int[300];
//一个专门存储蛇的y轴坐标的数组
int[] snakeY = new int[300];
Random random = new Random();
//游戏只有两个状态:开始、暂停:
boolean isStart = false;//默认游戏是暂停效果
//加入一个定时器:
Timer timer;
//定义蛇的行走方向:
String direction ;
//定义食物的X、Y轴坐标:
int foodX;
int foodY;
//定义积分:
int score;
//加入变量判断小蛇死亡状态:
boolean isDie = false;//默认没有死亡
public void init(){
//初始化蛇的长度:
length = 3;
//初始化蛇头坐标:
//随机生成蛇头位置//25为最小单位
snakeX[0] = 100 + 25 * random.nextInt(30);
snakeY[0] = 100 + 25 * random.nextInt(16);
/*snakeX[0] = 175;
snakeY[0] = 275;
//初始化第一节身子坐标:
snakeX[1] = 150;
snakeY[1] = 275;
//初始化第二节身子坐标:
snakeX[2] = 125;
snakeY[2] = 275;*/
//初始化蛇头的方向:
direction = "R";// U D L R
//初始化食物坐标:
/* foodX = 300;
foodY = 200;*/
//随机生成食物位置
foodX = 25 + 25 * random.nextInt(36);
foodY = 50 + 25 * random.nextInt(22);
}
public GamePanel(){
init();
//将焦点定位在当前操作的面板上:
this.setFocusable(true);
//加入监听
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {//监听键盘按键的按下操作
super.keyPressed(e);
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if(keyCode == KeyEvent.VK_SPACE){//监听空格:
if(isDie){
//全部恢复到初始化状态:
init();
isDie = false;
}else{//小蛇没有死亡的情况下:
isStart = !isStart;
repaint();//重绘动作
}
}
//监听向上箭头:
if(keyCode == KeyEvent.VK_UP){
direction = "U";
}
//监听向下箭头:
if(keyCode == KeyEvent.VK_DOWN){
direction = "D";
}
//监听向左箭头:
if(keyCode == KeyEvent.VK_LEFT){
direction = "L";
}
//监听向右箭头:
if(keyCode == KeyEvent.VK_RIGHT){
direction = "R";
}
}
});
//对定时器进行初始化:
timer = new Timer(125, new ActionListener() {
/*
ActionListener是事件监听
相当于每100ms监听一下你是否发生一个动作
具体的动作放入actionPerformed
*/
@Override
public void actionPerformed(ActionEvent e) {
if(isStart&&isDie == false){//游戏是开始状态且小蛇活着的时候,蛇才动
//后一节身子走到前一节身子的位置上:
for(int i=length-1;i>0;i--){
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
//动蛇头:
if("R".equals(direction)){
snakeX[0] += 25;
}
if("L".equals(direction)){
snakeX[0] -= 25;
}
if("U".equals(direction)){
snakeY[0] -= 25;
}
if("D".equals(direction)){
snakeY[0] += 25;
}
//防止蛇超出边界: 右
if(snakeX[0]>875){
snakeY[0] = 100 + 25 * random.nextInt(16);
snakeX[0] = 25;
}
//左
if(snakeX[0]<25){
snakeY[0] = 100 + 25 * random.nextInt(16);
snakeX[0] = 875;
}
//上
if(snakeY[0]<25){
snakeX[0]= 100+25 * random.nextInt(16);
snakeY[0] = 850;
}
//下
if(snakeY[0]>850){
snakeX[0]=100 + 25 * random.nextInt(16);
snakeY[0] = 25;
}
//检测碰撞动作(食物的坐标和蛇头坐标完全重合才算碰撞):
if(snakeX[0] == foodX&&snakeY[0] == foodY){
//蛇的长度+1:
length++;
//食物坐标改变(随机生成坐标在面板内且为25的倍数):
/*
[25,875] -> [1,35]*25
[25,850] -> [1,34]*25
Math.random() -> [0.0,1.0)
Math.random()*35 -> [0.0,30.0)
(int)(Math.random()*35) -> [0,29]
(int)(Math.random()*35)+1 -> [1,30]
*/
foodX = ((int)(Math.random()*35)+1)*25;//[25,875]
foodY = ((int)(Math.random()*34)+1)*25;//[25,850]
//吃上食物以后积分+10:
score += 10;
}
//死亡判定:
for(int i = 1;i<length;i++){
if(snakeX[0] == snakeX[i]&&snakeY[0] == snakeY[i]){
//将死亡状态改为true:
isDie = true;
}
}
repaint();//重绘
}
}
});
//定时器必须要启动:
timer.start();
}
/**
* paintComponent这个方法比较特殊,这个方法就属于图形版的main方法
* 自动调用
* @param g the <code>Graphics</code> object to protect
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
/*
* paintIcon四个参数:this是当前面板,g是是用画笔,x、y是对应坐标
*/
//填充背景颜色
this.setBackground(new Color(0, 0, 0, 255));
//调节画笔颜色:
g.setColor(new Color(93, 236, 61, 255));
//画一个矩形:
g.fillRect(25,25,875,850);
//画蛇:
//画蛇头:
if("R".equals(direction)){
Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("L".equals(direction)){
Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("U".equals(direction)){
Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("D".equa
没有合适的资源?快使用搜索试试~ 我知道了~
贪吃蛇+Java +穿墙位置随机+食物位置随机
共37个文件
png:14个
class:7个
xml:5个
需积分: 0 0 下载量 36 浏览量
2023-04-20
13:25:01
上传
评论
收藏 59KB ZIP 举报
温馨提示
练习了一个贪吃蛇项目,贪吃蛇穿墙后位置随机生成,食物的位置也是随机生成
资源推荐
资源详情
资源评论
收起资源包目录
snake.zip (37个子文件)
snake
TestSnakeGame
TestSnakeGame.iml 433B
src
Main.java 116B
images
laoshu.png 1KB
headleft.png 1KB
qingwa.png 2KB
headdown.png 2KB
headup.png 1KB
headright.png 1KB
body.png 859B
com
msb
game
StartGame.java 1KB
TestURL.java 357B
Images.java 2KB
GamePanel.java 9KB
src
META-INF
MANIFEST.MF 61B
out
artifacts
snake_jar
snake.jar 18KB
production
TestSnakeGame
Main.class 516B
images
laoshu.png 1KB
headleft.png 1KB
qingwa.png 2KB
headdown.png 2KB
headup.png 1KB
headright.png 1KB
body.png 859B
com
msb
game
Images.class 1KB
GamePanel.class 3KB
StartGame.class 1KB
GamePanel$1.class 1KB
TestURL.class 691B
GamePanel$2.class 2KB
snake
META-INF
MANIFEST.MF 61B
.idea
artifacts
snake_jar.xml 340B
workspace.xml 5KB
misc.xml 278B
modules.xml 395B
.gitignore 50B
encodings.xml 208B
snake.iml 433B
共 37 条
- 1
资源评论
m0_65123017
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功