开发的大体思路

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. 《图解UE4渲染体系》Part 0 引擎基础

    在介绍UE4渲染体系前,我们有必要来先看一下UE4是用什么样的方式来构建游戏场景数据的. 1 Object 在UE4中当我们说Object,通常是指代引擎代码中的UObject类,它是引擎里管理绝大部 ...

  2. 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境

    一.服务器的购买 1.购买时间点:搞活动的时候.利用学生身份购买 (1)活动:想白嫖一台服务器 双十一,可以在双十一左右,时间提前一点,百度或B站,搜阿里云服务器.腾讯服务器(618可能也有) 一般, ...

  3. HashMap源码理解一下?

    HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...

  4. 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    背景 最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直没有触发监控报警,而 ...

  5. 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5.7.8 开始支持的.在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档. 相对字符类型,原生的 JSON 类型具有以下优 ...

  6. HandlerMethodArgumentResolver 自定义使用

    HandlerMethodArgumentResolver 自定义使用 1.HandlerMethodArgumentResolver 的应用场景 ​ HandlerMethodArgumentRes ...

  7. 记一次调试YOLOv5+DeepSort车辆跟踪项目的经过

    摘要:学习别人的开源项目是日常的一项必备技能,本文通过一个车辆跟踪(YOLOv5+DeepSort)的例子介绍如何配置和调试GitHub上的开源代码.以第一人称的视角给出本人调试代码的过程,包括项目r ...

  8. 论文阅读 DyREP:Learning Representations Over Dynamic Graphs

    5 DyREP:Learning Representations Over Dynamic Graphs link:https://scholar.google.com/scholar_url?url ...

  9. 6. ZigZag Conversion - LeetCode

    Question 6. ZigZag Conversion Solution 题目大意:将字符串按Z字型排列,然后再一行一行按字符输出 思路:按题目中的第一个例子,画出如下图,通过n的不同值,可以找出 ...

  10. 一文讲透为Power Automate for Desktop (PAD) 实现自定义模块 - 附完整代码

    概述 Power Automate for Desktop (以下简称PAD)是微软推出的一款针对Windows桌面端的免费RPA(机器人流程自动化)工具,它目前默认会随着Windows 11安装,但 ...