Java GUI学习,贪吃蛇小游戏
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学习,贪吃蛇小游戏的更多相关文章
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- Java贪吃蛇小游戏
贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
- 用python+pygame写贪吃蛇小游戏
因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
随机推荐
- 认清 React 的useState逻辑
useState运行过程解析 function App() { const [n, setN] = useState(0); //使用 myUseState() return ( <div> ...
- Java之继承和抽象类
继承 继承的实现 继承通过extends实现 格式:class 子类 extends 父类 { } 举例:class Dog extends Animal { } 继承带来的好处 继承可以让类与类 ...
- Redis持久化——内存快照(RDB)
最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 最新:Redis持久化--内存快照(RDB) 一文回顾Redis五大对象(数据类型) Redis对象--有序集 ...
- kubernetes dashboard 2.0 部署
dashboard 可以从微软中国提供的 gcr.io :http://mirror.azure.cn/help/gcr-proxy-cache.html免费代理下载被墙的镜像 docker pull ...
- 基于ceph rbd 在kubernetes harbor 空间下创建动态存储
[root@bs-k8s-ceph ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: ...
- C++并发与多线程学习笔记--单例设计模式、共享数据分析
设计模式 共享数据分析 call_once 设计模式 开发程序中的一些特殊写法,这些写法和常规写法不一样,但是程序灵活,维护起来方便,别人接管起来,阅读代码的时候都会很痛苦.用设计模式理念写出来的代码 ...
- 远程线程注入dll,突破session 0
前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...
- 机器学习--如何理解Accuracy, Precision, Recall, F1 score
当我们在谈论一个模型好坏的时候,我们常常会听到准确率(Accuracy)这个词,我们也会听到"如何才能使模型的Accurcy更高".那么是不是准确率最高的模型就一定是最好的模型? 这篇博文会向大家解释 ...
- 使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题
在前篇随笔<使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理>中介绍了Vue-TreeSelect组件的使用,包括使用v-modal绑定值,normalizer ...
- Linux执行.sh文件,提示No such file or directory的问题
问题描述 在window平台下,写好shell脚本文件,迁移到linux平台,赋过可执行权限,执行该sh文件,却提示NO such file or directory 解决方案 难道是文件格式兼容性问 ...