package top.jimxu.snake;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SnakePanel extends JPanel implements KeyListener,ActionListener{
//加载所有图片
ImageIcon up = new ImageIcon("up.png");
ImageIcon down = new ImageIcon("down.png");
ImageIcon left = new ImageIcon("left.png");
ImageIcon right = new ImageIcon("right.png");
ImageIcon title = new ImageIcon("title.jpg");
ImageIcon body = new ImageIcon("body.png");
ImageIcon food = new ImageIcon("food.png");
//蛇的数据结构设计
int[] snakex = new int[750];
int[] snakey = new int[750];
int len = 3;
String direction = "R";//R右L左U上D下
//食物生成
Random r = new Random();
int foodx = r.nextInt(34)*25+25; // 34个格子,一个格子25排像素,还有25像素空白
int foody = r.nextInt(24)*25+75; // 24个格子,一个格子25排像素,还有75像素空白
//游戏是否开始
boolean isStarted = false;
//游戏是否失败
boolean isFaild = false;
// 初始化蛇
public void initSnake(){
isStarted = false;
isFaild = false;
len = 3;
direction = "R";
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}
public SnakePanel() {
this.setFocusable(true);
initSnake(); //放置静态蛇;
this.addKeyListener(this);//添加键盘监听接口
timer.start();
}
//设置蛇移动速度
Timer timer = new Timer(150, this);
public void paint(Graphics g){
//设置背景黑色
this.setBackground(Color.black);
g.fillRect(25, 75, 850, 600);
//设置标题
title.paintIcon(this, g, 25, 11);
//画蛇头
if(direction.equals("R")){
right.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("L")){
left.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("U")){
up.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("D")){
down.paintIcon(this, g, snakex[0], snakey[0]);
}
//画蛇身
for(int i=1;i<len;i++){
body.paintIcon(this, g, snakex[i],snakey[i]);
}
//画开始提示语
if(!isStarted){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press Space to Start or Pause", 230, 350);
}
//画失败提示语
if (isFaild) {
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Game Over,Press Space to Start", 230, 350);
}
//画食物
food.paintIcon(this, g, foodx, foody);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//监听按键
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
//实现空格暂停 继续
if(keyCode == KeyEvent.VK_SPACE){
if(isFaild){
initSnake();
}
else{
isStarted = !isStarted;
}
// repaint();
}//实现转向
else if(keyCode == KeyEvent.VK_UP && !direction.equals("D")){
direction="U";
}else if(keyCode == KeyEvent.VK_DOWN && !direction.equals("U")){
direction="D";
}else if(keyCode == KeyEvent.VK_LEFT && !direction.equals("R")){
direction="L";
}else if(keyCode == KeyEvent.VK_RIGHT && !direction.equals("L")){
direction="R";
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
/*
* 1.定个闹钟
* 2.蛇移动
* 3.重画一次蛇
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
timer.start();
if(isStarted && !isFaild){
//移动身体
for(int i=len;i>0;i--){
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
//头移动
if(direction.equals("R")){
//横坐标+25
snakex[0] = snakex[0]+25;
if(snakex[0]>850) snakex[0] = 25;
}else if(direction.equals("L")){
//横坐标-25
snakex[0] = snakex[0]-25;
if(snakex[0]<25) snakex[0] = 850;
}else if(direction.equals("U")){
//纵坐标-25
snakey[0] = snakey[0]-25;
if(snakey[0]<75) snakey[0] = 650;
}else if(direction.equals("D")){
//纵坐标+25
snakey[0] = snakey[0]+25;
if(snakey[0]>650) snakey[0] = 75;
}
//吃食物
if(snakex[0] == foodx && snakey[0] == foody){
len++;
foodx = r.nextInt(34)*25+25;
foody = r.nextInt(24)*25+75;
}
//判断游戏失败
for(int i=1;i<len;i++){
if(snakex[0] == snakex[i] && snakey[0] == snakey[i]){
isFaild = true;
}
}
}
repaint();
}
}


白话机器学习
- 粉丝: 1w+
- 资源: 7628
最新资源
- 主动移频法AFD单相并网系统孤岛检测仿真模型与文档解析,主动移频法AFD单相并网系统孤岛检测仿真:理论与实践的完美结合说明文档,主动移频法AFD孤岛检测仿真 仿真为基于单相并网系统的孤岛检测,采用主动
- 基于Matlab Simulink的改进Ortega观测器永磁同步电机非线性磁链观测源代码及性能分析,基于Matlab Simulink的改进Ortega观测器永磁同步电机非线性磁链观测源代码:零速闭
- mysql-connector-java-8.0.16.jar和mysql-connector-java-8.0.19.jar
- 基于MATLAB的数字信号处理及数字滤波器设计与实现方法,基于MATLAB平台的数字信号处理技术研究:数字滤波器设计与实现的方法与探讨,基于MATLAB的数字信号处理、数字滤波器设计与实现 ,基于M
- 自动追频超声波发生器方案及半桥数码管显示技术,基于AVR单片机实现,自动追频超声波发生器方案及数码管显示技术-基于AVR单片机实现,自动追频超声波发生器,方案,资料 半桥数码管显示的方案,可直,留
- 基于前后双电机纯电动汽车的Cruise与Simulink联合仿真模型:驱动转矩控制策略及最优转矩分配系数研究,基于Cruise与Simulink联合仿真的前后双电机纯电动汽车转矩控制策略模型研究及最优
- 基于ATP-EMTP仿真的绝缘子串电位分布与冲击闪络特性分析:劣化绝缘子片对电压分布的影响研究,基于ATP-EMTP的绝缘子串电位分布及冲击闪络特性仿真研究:劣化绝缘子片对电压分布影响探究,基于ATP
- Comsol电磁仿真:复杂结构屏蔽效能分析、电磁耦合干扰研究及兼容性评估报告,电磁仿真专家解析:Comsol电磁场仿真技术,Comsol电磁场仿真 电磁耦合与干扰分析,复杂结构电磁屏蔽效能分析,电磁热
- Matlab与Simulink联合仿真实现自动驾驶的非线性MPC路径规划与线性MPC路径跟踪控制,自动驾驶规划控制:基于非线性MPC路径规划和线性MPC路径跟踪的Matlab与Simulink联合仿
- 深入解析Autoware.ai与Autoware.universe视频与PDF讲解:模块化细致解析与具体内容概览,深入理解Autoware.ai与Autoware.universe:模块化解析与视频详
- 基于1D-GAN的生成对抗网络数据生成方法及SVM分类器性能验证研究,基于1D-GAN与SVM的分类任务:数据生成与分类精度的实验研究,基于1D-GAN生成对抗网络的数据生成方法-Matlab代码 利
- ,Comsol中铌酸锂不同切向的归一化电场强度设置:电压影响折射率和反射率研究,Comsol铌酸锂不同切向设置 x切铌酸锂、z切铌酸锂 归一化电场强度设置、加电压计算折射率及反射率 ,Comsol
- 永磁同步电机矢量控制模型及三种控制策略比较:常规PI控制、滞环电流控制和滑膜速度控制,磁场定向控制FOC模型:常规PI、滞环电流、滑膜速度,控制效果出色,永磁同步电机矢量控制(磁场定向控制FOC)模型
- K近邻算法多变量时间序列预测,基于K近邻算法的多变量时间序列预测Matlab代码实现:不依赖工具箱,推荐使用2018B及以上版本,基于K近邻算法(KNN)的多变量时间序列预测 KNN多变量时间序列 m
- 基于MATLAB simulink与carsim联合仿真的车辆动力学模型质心侧偏角估计器研究与应用,MATLAB simulink联合carsim模型中的多维动态车辆质心侧偏角估计器:基于三自由度车辆
- 数据库管理领域中DM8-dmdbchk命令行工具的功能与参数详解及其用于数据文件完整性校验的技术指引
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


