开发的大体思路

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. vscode 开发项目, Prettier ESLint的配置全攻略(基础篇)

    我们在做项目尤其是多人合作开发的时候经常会因为不同的开发规范和代码风格导致出现冲突, 为了能统一代码风格和规范我们需要使用到prettier和eslint,接下来就一vscode编辑器为例详细讲解下: ...

  2. Ubuntu22.04搭建PWN环境

    前言 最近尝试在Ubuntu最新的版本22.04版本上搭建PWN环境,有了之前在kali上搭建的经验,总的来说问题不大.但搭建的时候还是有不少地方出错了,好在搭建的过程中不断的拍摄快照,所以整个过程还 ...

  3. 攻防世界-MISC:stegano

    这是攻防世界新手练习区的第五题,题目如下: 点击附件1下载,得到一个pdf文件,打开后内容如下: 把pdf文件里的内容复制到记事本上,发现一串A和B的字符串,不知道是什么(真让人头大) 参考一下WP, ...

  4. Water 2.6.3 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...

  5. 公众号走走看看——js

    1.数字转换字符串/字符串转换数字 2.短循环 3.性能测试(执行时间) 4.交换值 5.合并数组(IE不兼容) 6.数组去重 7.判断给定参数是否是数字 8.获取最大最小值.取随机数(arr.len ...

  6. 用crash tool观察ARM64 Linux地址转换

    初学者学习Linux系统地址转换时,如果只是学习理论,又或者研读代码,那可能感觉比较枯燥.此时如果可以利用某些工具实际观察一下地址转换的过程,那可能会给枯燥的内核学习带来些微的乐趣.crash too ...

  7. mysql allow remote host

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEG ...

  8. Java基础(1)——ThreadLocal

    1. Java基础(1)--ThreadLocal 1.1. ThreadLocal ThreadLocal是一个泛型类,当我们在一个类中声明一个字段:private ThreadLocal<F ...

  9. 从单例谈double-check必要性,多种单例各取所需

    theme: fancy 前言 前面铺掉了那么多都是在讲原则,讲图例.很多同学可能都觉得和设计模式不是很搭边.虽说设计模式也是理论的东西,但是设计原则可能对我们理解而言更加的抽象.不过好在原则东西不是 ...

  10. 【clickhouse专栏】clickhouse性能为何如此卓越

    在<clickhouse专栏>上一篇文章中<数据库.数据仓库之间的区别与联系>,我们介绍了什么是数据库,什么是数据仓库,二者的区别联系.clickhouse的定位是" ...