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 +穿墙位置随机+食物位置随机
需积分: 0 5 浏览量
更新于2023-04-20
收藏 59KB ZIP 举报
在本文中,我们将深入探讨如何使用Java编程语言实现一个经典的贪吃蛇游戏,其中包括贪吃蛇穿墙后的位置随机生成以及食物位置的随机生成。这是一个非常实用的编程练习,可以帮助开发者提升面向对象编程、事件处理和游戏逻辑设计的能力。
我们需要理解贪吃蛇游戏的基本原理。贪吃蛇游戏的核心是一个二维数组,代表游戏地图。蛇由一系列坐标点表示,每次移动时,蛇的头部坐标会更新,而尾部坐标则会根据移动方向进行移除或保留。食物则是一个单独的坐标点,蛇碰到食物时,长度增加,食物会在地图上随机生成新的位置。
1. **Java基础知识**:Java是一种广泛使用的面向对象编程语言,具备平台无关性、安全性、高性能等特点。在这个项目中,我们将用到类、对象、继承、接口等核心概念。
2. **贪吃蛇类设计**:创建一个`Snake`类,包含蛇的头部和身体坐标数组,以及移动方向等属性。然后,定义移动方法,处理蛇的移动逻辑,包括碰撞检测(墙壁和自身)以及食物碰撞。
3. **穿墙位置随机生成**:当蛇碰到墙壁时,可以设置一个特殊状态,让蛇在地图的另一侧随机生成新的位置。这需要利用Java的随机数生成器,如`java.util.Random`类,来生成新的坐标。
4. **食物类**:创建一个`Food`类,包含食物的坐标属性。食物的生成位置应避免与蛇的任何部分重叠。在游戏开始时生成食物,并在蛇吃到食物后重新随机生成。
5. **游戏循环**:游戏的主循环通常是一个无限循环,负责更新蛇的位置、检测游戏状态(如胜利或失败)以及绘制游戏画面。这里可以使用Java的`javax.swing`库来创建图形用户界面(GUI),并响应键盘事件来控制蛇的移动。
6. **事件处理**:通过`KeyListener`或`ActionListener`接口,我们可以监听用户的键盘输入,根据用户的按键改变蛇的移动方向。同时,需要定期更新游戏状态,如每秒更新一次。
7. **随机生成食物位置**:食物的随机位置生成可以在游戏开始和蛇吃到食物后进行。使用`Random`类的`nextInt()`方法来生成地图内的随机坐标,确保这个坐标不在蛇的身体范围内。
8. **测试和调试**:完成基本功能后,进行详尽的测试,确保蛇能正确移动、穿墙、吃食物,并在适当情况下结束游戏。使用调试工具检查逻辑错误和边界条件。
9. **优化和扩展**:可以考虑增加游戏难度,比如增加速度,或者添加多个蛇进行对战模式。还可以考虑优化图形界面,如添加背景、动画效果和音效。
通过这个贪吃蛇项目,开发者不仅可以巩固Java编程基础,还能锻炼游戏开发的逻辑思维和问题解决能力。通过不断的实践和改进,可以将这个简单的游戏变得越来越复杂和有趣。
m0_65123017
- 粉丝: 1
- 资源: 1
最新资源
- 纯真IP库,用于ip查询地址使用的数据库文件
- 基于javaweb的动漫网站管理系统毕业设计论文.doc
- 废物垃圾检测28-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 探索CSDN博客数据:使用Python爬虫技术
- 基于tensorflow和cnn做的图像识别,对四种花卉进行了分类项目源代码+使用说明,可识别:玫瑰花、郁金香、蒲公英、向日葵
- 基于Java的电影订票网站的设计与开发毕业设计论文.doc
- ODrive 固件 0.5.6
- 停电自动关机程序.EXE
- RabbitMQ 的7种工作模式
- 基于java的大学生二手书在线买卖系统论文.doc