开发的大体思路

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实现的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  3. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  4. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  5. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  6. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  7. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  8. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

  9. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

随机推荐

  1. linux下redis开机自启动

    将/usr/local/app/redis-4.0.8/redis.conf文件中daemonize no改为daemonize yes 在/etc目录下新建redis目录:mkdir /etc/re ...

  2. python学习-Day9

    目录 记忆不清点回顾 今日概要 今日内容 大作业讲解 字符编码实际应用 编码与解码 如何解决乱码的问题 文件操作简介 什么是文件 代码操作文件 代码操作文件的流程 基本语法结构 使用关键字打开文件 w ...

  3. matplotlib画图工具/绘制散点图

    绘制散点图 import matplotlib.pyplot as plt fig=plt.figure() ax = fig.add_subplot(111) ax.scatter(x,y, s,c ...

  4. PyScript:让Python在HTML中运行

    大家好,我是DD,已经是封闭在家的第51天了! 最近一直在更新Java新特性和IDEA Tips两个专栏,其他方向内容的动态关注少了.昨天天晚上刷推的时候,瞄到了这个神奇的东西,觉得挺cool的,拿出 ...

  5. 2022管家婆工贸版ERP T3 V22.0工厂管理软件单机网络版无限用户免狗软件可定制

    管家婆工贸版是一款针对国内中小加工企业开发的管理软件,软件以财务管理为核心,集采购.销售.存货.生产.工资.固定资产.账务管理等模块于一体,对企业的信息进行监控,实现对企业物流.资金流.信息流和生产成 ...

  6. 使用python获取交换机syslog日志并使用jQuery在html上展示

    需求 现网有部分pop点独立于海外,无法发送日志给内网日志服务器,同时最近网内有比较重要割接,所以临时写一个脚本来展示网内日志 思路 使用socket接收syslog数据,udp 514,数据部分格式 ...

  7. 877. Stone Game - LeetCode

    Question 877. Stone Game Solution 题目大意: 说有偶数个数字,alex和lee两个人比赛,每次轮流从第一个数字或最后一个数字中拿走一个(偶数个数字,所以他俩拿的数字个 ...

  8. drools中的条件 when

    目录 1.介绍 2.语法结构 3.模式例子 3.1 单个对象匹配 3.2 匹配任何对象 3.3 带条件匹配 3.3.1 注意事项 3.4 嵌套属性的匹配 3.4.1 访问单个嵌套属性 3.4.2 访问 ...

  9. Java概论——JavaSE基础

    Java概论 Java特性和优势 简单性 面向对象 可移植性 高性能:即时编译 分布式:可处理TCP/IP协议的一些东西 动态性:通过反射机制使其具有动态性 多线程:良好的交互性和实时性 安全性:防病 ...

  10. 小样本利器1.半监督一致性正则 Temporal Ensemble & Mean Teacher代码实现

    这个系列我们用现实中经常碰到的小样本问题来串联半监督,文本对抗,文本增强等模型优化方案.小样本的核心在于如何在有限的标注样本上,最大化模型的泛化能力,让模型对unseen的样本拥有很好的预测效果.之前 ...