JAVA GUI练习 贪吃蛇小游戏

前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方面逻辑层面还是很简单的,主要是GUI绘画,布局等等的学习,这里我也贴出我这里GUI练习写过的包点我下载,不过这个比较乱(前面基础的awt比较乱,没分包写,swing基本都分包写了还是不乱的),但你打开这个包,你idea也是能通过英文看出来什么意思的~~

贴一下贪吃蛇的代码吧~~

JavaDoc可以自己idea生成哦,别忘了设置字符编码防止中文乱码错误~~

package com.zaunekko.gui.game.snake;

import javax.swing.*;
//入口
public class StartGame {
public static void main(String[] args) {
JFrame jFrame = new JFrame(); jFrame.setBounds(50,50,915,738);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//添加JPanel
jFrame.add(new GamePanel()); jFrame.setVisible(true); } }
package com.zaunekko.gui.game.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; public class GamePanel extends JPanel implements KeyListener , ActionListener { //蛇
int length;
int[] snakeX = new int[900];
int[] snakeY = new int[900]; //食物
int foodX;
int foodY;
Random random; //成绩
int score; //键盘按键方向
String direction; //游戏是否开始
boolean isStart; //是否失败
boolean isFail; //定时器
//Timer timer; 如果在init()里初始化赋值会有bug,死亡之后会double timer,所以只能初始化一次
Timer timer = new Timer(500,this);//ms为单位
//构造器
public GamePanel(){
init(); //获得焦点和键盘事件
this.setFocusable(true);
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; random = new Random();
foodX = 25 + 25*random.nextInt(34);
foodY = 75 + 25*random.nextInt(24); score = 0; direction = "R";
isStart = false;
isFail = false; } //画笔
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); this.setBackground(Color.WHITE); Data.header.paintIcon(this,g,25,0);
g.fillRect(25,75,850,600); Data.food.paintIcon(this,g,foodX,foodY); switch (direction) {
case "R" -> Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
case "L" -> Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
case "U" -> Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
case "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]);
} g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度" + length,800,15);
g.drawString("分数" + score,800,45); if (!isStart && !isFail) {
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格开始游戏",300,300); }else if(isFail) {
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("失败!按下空格重新开始",300,300);
} } @Override
public void keyTyped(KeyEvent e) { } //键盘监听
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
if (isFail){
//死亡就初始化
repaint();
init();
}else {
isStart = !isStart;
repaint();
}
}else if (keyCode == KeyEvent.VK_UP){
if (isStart)//如果不加此句判断是否已经开始就可以更改方向,则bug:提示按空格时即可更改初始方向
direction = "U";
}else if (keyCode == KeyEvent.VK_DOWN){
if (isStart)
direction = "D";
}else if (keyCode == KeyEvent.VK_LEFT){
if (isStart)
direction = "L";
}else if (keyCode == KeyEvent.VK_RIGHT){
if (isStart)
direction = "R";
} } @Override
public void keyReleased(KeyEvent e) { } //事件监听
@Override
public void actionPerformed(ActionEvent e) {
if (isStart && !isFail){ //吃食物
if (snakeX[0] == foodX && snakeY[0] == foodY) {
++length;
foodX = 25 + 25*random.nextInt(34);
foodY = 75 + 25*random.nextInt(24); score += 10; } //蛇的第i个元素为上一个元素的位置
for (int i = length - 1; i > 0 ; --i){
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
} //方向以及越界判定
switch (direction) {
case "R" -> {
snakeX[0] += 25;
if (snakeX[0] >= 875) {
snakeX[0] = 25;
}
}
case "L" -> {
snakeX[0] -= 25;
if (snakeX[0] < 25) {
snakeX[0] = 850;
}
}
case "U" -> {
snakeY[0] -= 25;
if (snakeY[0] < 75) {
snakeY[0] = 650;
}
}
case "D" -> {
snakeY[0] += 25;
if (snakeY[0] >= 675) {
snakeY[0] = 75;
}
}
} //失败
for (int i = 1; i < length; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
isFail = true;
break;
}
} repaint();
}
timer.start(); }
}
package com.zaunekko.gui.game.snake;

import javax.swing.*;
import java.net.URL; public class Data { public static URL headerURL = Data.class.getResource("header.png");
public static URL upURL = Data.class.getResource("up.png");
public static URL downURL = Data.class.getResource("down.png");
public static URL leftURL = Data.class.getResource("left.png");
public static URL rightURL = Data.class.getResource("right.png");
public static URL foodURL = Data.class.getResource("food.png");
public static URL bodyURL = Data.class.getResource("body.png"); public static ImageIcon header = new ImageIcon(headerURL);
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 ImageIcon food = new ImageIcon(foodURL);
public static ImageIcon body = new ImageIcon(bodyURL); }

Java GUI学习,贪吃蛇小游戏的更多相关文章

  1. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  2. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  3. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  4. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  5. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  6. Java贪吃蛇小游戏

    贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...

  7. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  8. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

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

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

随机推荐

  1. LinkedList类详解

    LinkedList类中的方法与实现原理 目录 一.数据结构 二.类标题 三.字段 四.构造函数 五.方法分析 5.1 共有方法 public boolean add(Object o) public ...

  2. 一文读懂MySql主从复制机制

    作为一个关系型数据库,MySQL内建地提供数据复制机制,这使得在使用时,可以基于其复制机制实现高可用架构等高级特性,从而使得MySQL无需借助额外的插件或其他工具就具备适用于生产环境.这是MySQL得 ...

  3. 日志文件删除shell脚本

    大日志文件切割shell脚本 #!/bin/bash # --------------------------------------------------------------------- # ...

  4. 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...

  5. ES系列(二):基于多播的集群发现实现原理解析

    ES作用超强悍的搜索引擎,除了需要具有齐全的功能支持,超高的性能,还必须要有任意扩展的能力.一定程度上,它是一个大数据产品.而要做扩展性,集群自然少不了.然而单独的集群又是不够的,能够做的事情太少,所 ...

  6. (文字版)Qt信号槽源码剖析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...

  7. electron项目踩坑--A JavaScript error occurred in the main process:document is not defined

    前言 记录electron-vue项目开发中遇到的一个错误,运行时报错如图: 控制台报错如下: ReferenceError: document is not defined at Object.&l ...

  8. manjaro 手动调节屏幕亮度

    1 问题描述 manjaro版本20.0,桌面XFCE,设置之类的地方没有屏幕亮度调节的功能. 2 解决方案 解决方案来自arch wiki. 亮度由ACPI内核模块控制,这个模块的接口在以下位置: ...

  9. HTTP 基础(特性、请求方法、状态码、字段)

    1. HTTP 简介(含义.特性.缺点) 2. HTTP 报文 3. GET 和 POST 4. 状态码 5. HTTP 头字段 1. HTTP 简介 HTTP 的含义 HTTP (HyperText ...

  10. 博客之初体验-----python初了解

    ---恢复内容开始--- 1.python2.x与python3.x的区别 (1) 2.x的默认编码是ASSIC码,不支持中文 (2) 3.x的默认编码是UNICODE,支持中文 (3) 2.x版本与 ...