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. 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock)

    一.前言 优秀的源码就在那里 经过了前面两章的铺垫,终于要切入正题了,本章也是整个AQS的核心之一 从本章开始,我们要精读AQS源码,在欣赏它的同时也要学会质疑它.当然本文不会带着大家逐行过源码(会有 ...

  2. 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!

    GitHub 20k Star 的Java工程师成神之路,不来了解一下吗! GitHub 20k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 20k Star 的Java工 ...

  3. Typora标题自动编号+设定快捷键技巧

    Typora标题自动编号 提示:要了解将这些CSS片段放在哪里,请参阅添加自定义CSS. 打开Typora偏好设置,打开主题文件夹,在主题文件夹中创建base.user.css文件,放置以下内容,则T ...

  4. [Azure Devops] 获取单元测试的代码覆盖率

    1. 获取代码覆盖率 上一篇文章里,我们在 Pipeline 中插入一个单元测试并把所有单元测试都通过作为 Pipeline 通过的硬性要求.除此以外,我们还可以获取单元测试的代码覆盖率,用作衡量代码 ...

  5. D. 【例题4】字符串环

    解析 字符串的操作,可以用函数解决这个问题 s 2. f i n d ( s 1. s u b s t r ( i , j ) ) s2.find~(s1.substr~(i,~j)) s2.find ...

  6. Myabtis-Plus之QueryWrapper常用方法

    AbstractWrapper 下的方法及使用 方法名 说明 使用 allEq(Map<R, V> params) 全部 =(或个别 isNull) allEq(params,true) ...

  7. 源码篇:Handler那些事

    前言 Handler属于八股文中非常经典的一个考题了,导致这个知识点很多时候,考官都懒得问了:这玩意很久之前就看过,但是过了一段时间,就很容易忘记,但是处理内存泄漏,aidlHandler之类的考点答 ...

  8. Java JVM 启动参数

    JVM 启动参数 java -Xmx4096m // 设置JVM最大可用内存为4096m. -Xms4096m // 设置JVM促使内存为4096m.此值可以设置与-Xmx相同,以避免每次垃圾回收完成 ...

  9. docker 容器重启策略

    查看docker 容器重启策略 docker inspect 容器ID docker run -d --restart=always bba-208 docker run -d --restart=o ...

  10. 条件分支if与else的用法小结

    条件分支 今天写一写条件分支结构(if.....else),在其他的语言中条件分支结构其实不止有if --else--结构,还有swich语句(例如在C语言,Java语言).但是python中只有if ...