贪吃蛇-JavaGUI实现
开发的大体思路
1.定义数据
2.画上面板(将数据进行初始化赋值)
3.监听事件
键盘监听
事件监听
游戏主界面代码
点击查看代码
package com.Tang.gui.snake;
import javax.swing.*;
//游戏主界面
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame();
//正常的游戏界面都在面板上
frame.add(new GamePanel());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setBounds(10,10,900,720);
frame.setResizable(false);//窗口大小不可变
frame.setVisible(true);
}
}
蛇头蛇身图片数据代码
点击查看代码
package com.Tang.gui.snake;
import javax.swing.*;
import java.net.URL;
public class Data {
//相对路径 tx.jpj
//绝对路径 / 相对于当前项目
//广告栏
public static URL headerURL = Data.class.getResource("statics/header.png");
public static ImageIcon header = new ImageIcon(headerURL);
//身体
public static URL bodyURL = Data.class.getResource("statics/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
//蛇头
public static URL upURL = Data.class.getResource("statics/up.png");
public static URL downURL = Data.class.getResource("statics/down.png");
public static URL leftURL = Data.class.getResource("statics/left.png");
public static URL rightURL = Data.class.getResource("statics/right.png");
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon left = new ImageIcon(leftURL);
public static ImageIcon right = new ImageIcon(rightURL);
//食物
public static URL foodURL = Data.class.getResource("statics/food.png");
public static ImageIcon food = new ImageIcon(foodURL);
}
游戏面板代码
点击查看代码
package com.Tang.gui.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;
//游戏的面板
//ActionListener接口主要用于计时器的监听
public class GamePanel extends JPanel implements KeyListener, ActionListener {
//绘制面板,游戏中的所有东西都是用画笔来画
//定义蛇的数据结构
int length;
int[] snakeX = new int[600];
int[] snakeY = new int[500];
String fx;//蛇头的方向
//定义积分
int score;
//定义食物的坐标
int foodx;
int foody;
Random random = new Random();
//定时器以毫秒为单位1s = 1000ms
Timer timer = new Timer(100,this);//100毫秒执行一次,为小蛇移动的速度
//初始游戏状态
boolean isStart = false;//游戏初始默认为停止
//失败状态
boolean isFail = false;//初始默认不是失败的
public GamePanel() {
init();
//获取焦点和键盘监听事件
this.setFocusable(true);//获得焦点事件,就是当前运行进程为游戏窗口
foodx = 25 + 25*random.nextInt(34);//游戏界面宽度为850,蛇一节身体宽度为25(左边界的起始位置也为25),所以在横向上可以有850/25=34个位置可以产生食物
foody = 75 + 25*random.nextInt(24);//75为上边界的起始位置,游戏界面高度为600,蛇一节身体宽度为25,所以在纵向上可以有600/25=24个位置可以产生食物
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;//初始蛇第二节身体的位置
fx = "R";//初始方法向右
score = 0;//初始成绩为零
}
@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);
//将成绩给画上去
g.setColor(Color.white);//画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体
g.drawString("长度:"+ length ,750,35);
g.drawString("分数:"+ score ,750,60);
//将食物画入游戏界面中
Data.food.paintIcon(this,g,foodx,foody);
//将小蛇的初始状态放入游戏界面中
if(fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//需要通过方向指定蛇头的方向
}else if(fx.equals("L")){
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//将蛇头画入游戏界面指定位置
}else if(fx.equals("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//将蛇头画入游戏界面指定位置
}else if(fx.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]);
}
//若果游戏没有开始这显示按下空格开始游戏字体
if(isStart == false){
g.setColor(Color.white);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("按下空格键开始游戏",300,400);//设置画笔画下的文字,以及文字画入游戏界面的位置
}
//如果游戏失败则显示游戏结束,按下空格重新开始游戏字体
if(isFail){
g.setColor(Color.RED);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("游戏结束,按下空格重新开始",300,400);//设置画笔画下的文字,以及文字画入游戏界面的位置
}
}
//键盘监听事件
@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_UP){//当按下上键小蛇的头转向上
fx = "U";
}else if(keyCode == KeyEvent.VK_DOWN){//当按下下键小蛇的头转向下
fx = "D";
}else if(keyCode == KeyEvent.VK_LEFT){//当按下左键小蛇的头转向左
fx = "L";
}else if(keyCode == KeyEvent.VK_RIGHT){//当按下右键小蛇的头转向右
fx = "R";
}
}
//事件的监听,需要通过固定事件来刷新,1s=10次
@Override
public void actionPerformed(ActionEvent e) {
if(isStart && isFail == false){//如果游戏是开始状态并且没有失败,就让小蛇动起来
if(snakeX[0] == foodx && snakeY[0] == foody){//蛇头碰到食物后
length ++;//蛇身长度加一
//没吃到一个食物分数加一
score ++;
//再次随机生成食物
foodx = 25 + 25*random.nextInt(34);//游戏界面宽度为850,蛇一节身体宽度为25(左边界的起始位置也为25),所以在横向上可以有850/25=34个位置可以产生食物
foody = 75 + 25*random.nextInt(24);//75为上边界的起始位置,游戏界面高度为600,蛇一节身体宽度为25,所以在纵向上可以有600/25=24个位置可以产生食物
}
for (int i = length-1; i >0 ; i--) {//让蛇的后一节移动到前一节位置
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
if(fx.equals("R")){//如果此时蛇头向右
snakeX[0] += 25;//蛇头向右引领方向,蛇身大小为25
//边界判断
if(snakeX[0] > 850){//碰到游戏界面的右边界时
snakeX[0] = 25;//回到最左侧边界
}
}else if(fx.equals("L")){//如果此时蛇头向左
snakeX[0] -= 25;
//边界判断
if(snakeX[0] < 25){//碰到游戏界面的左边界时
snakeX[0] = 850;//回到最右侧边界
}
}else if(fx.equals("U")){//如果此时蛇头向上
snakeY[0] -= 25;
//边界判断
if(snakeY[0] < 75){//碰到游戏界面的上边界时
snakeY[0] = 650;//回到最下侧边界
}
}else if(fx.equals("D")){//如果此时蛇头向下
snakeY[0] += 25;
//边界判断
if(snakeY[0] > 650){//碰到游戏界面的下边界时
snakeY[0] = 75;//回到最上侧边界
}
}
//蛇头撞到自己则游戏失败
for (int i = 1; i < length; i++) {
if(snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){//如果蛇身与蛇头相遇则游戏失败
isFail = true;//游戏失败
}
}
repaint();//重画页面
}
timer.start();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
运行结果图
起初界面
运行中界面
失败界面
贪吃蛇-JavaGUI实现的更多相关文章
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- juery实现贪吃蛇的游戏
今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
- 原生JS制作贪吃蛇小游戏
感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
随机推荐
- SoftPool:基于Softmax加权的池化操作 | 2021新文
SoftPool使用softmax进行加权池化,能够保持特征的表达性并且是可微操作.从性能和准确率来看,SoftPool是目前的常规池化方法的一个不错的替代品 来源:晓飞的算法工程笔记 公众号 论 ...
- 安装与基本配置DHCP服务器
一,安装DHCP服务器角色 1,打开[开始]→[管理工具]→[服务器管理器]→"仪表板"选项的[添加角色和功能],持续单机[下一步]按钮, 直至出现下图所示的"选择服务器 ...
- 浅谈Nginx性能调优
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux系统参数优化 下文中提到的一些配置,需要较新的 ...
- Water 2.6.3 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...
- Ansible的参数介绍
安装完成ansible后查看ansible的参数:ansible -h ansible 命令格式:Usage: ansible <host-pattern> [options] ansib ...
- Springboot目录结构分析
1 src/main/java 存储源码 2 src/main/resource 资源文件夹 (1)src/main/resource/static 用于存放静态资源,如css.js.图片.文件 ...
- 【Java面试】简述一下你对线程池的理解?
到底是什么面试题, 让一个工作了4年的精神小伙,只是去参加了一场技术面试, 就被搞得精神萎靡.郁郁寡欢! 这一切的背后到底是道德的沦丧,还是人性的扭曲. 让我们一起揭秘一下这道面试题. 关于, &qu ...
- MUI+html5+javascript 点击事件触发页面间传值
关于如何进行页面转跳,请看 https://www.cnblogs.com/JUNELITTLEPANDA/p/15956176.html,以下跳转方法是采用的其中一种 1- 仅适用于移动端,pc端 ...
- 【freertos】010-消息队列概念及其实现细节
目录 前言 10.1 消息队列概念 10.2 消息队列的数据传输机制 10.3 消息队列的阻塞访问机制 10.4 消息队列使用场景 10.5 消息队列控制块 10.5.1 队列控制块源码 10.5.2 ...
- Bean Validator
Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...