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. [状压DP]吃奶酪

    吃 奶 酪 吃奶酪 吃奶酪 题目描述 房间里放着 n n n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 ( 0 , 0 ) (0,0) (0,0)点处. 输入 第一行有一个整 ...

  2. lms框架分布式事务使用简介

    lms框架的分布式事务解决方案采用的TCC事务模型.在开发过程中参考和借鉴了hmily.使用AOP的编程思想,在rpc通信过程中通过拦截器的方式对全局事务或是分支事务进行管理和协调. 本文通过lms. ...

  3. 【软件推荐】使用Cmder替换Windows自带的控制台

    安装地址 进入cmder官网,下载相应版本. 如果本地已经安装了git,可以选择mini版本. 将 λ 替换为 $ 当前cmder默认的提示符是λ,看上去总是有点不习惯. 打开cmder目录下的ven ...

  4. Spring (二)SpringIoC和DI注解开发

    1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...

  5. 防火墙双出口环境下私网用户通过NAPT访问Internet

    组网图形 组网需求 如图1所示,某企业在网络边界处部署了FW作为安全网关,并分别从运营商ISP1和ISP2处购买了宽带上网服务,实现内部网络接入Internet的需求. 具体需求如下: 研发部门和市场 ...

  6. Lua OpenResty容器化(考古历程)

    原文地址:Lua OpenResty容器化(考古历程) 背景 公司有几个"远古时期"的项目,一直都相对较为稳定,但是项目每天总会在一些时段,请求每分钟QPS到达峰值800K左右,导 ...

  7. Linux pgrep命令

    1 pgrep pgrep是一个根据名称查找进程ID的命令,返回的是进程ID,若存在当个进程,则分为不同的行返回ID(默认实现). 2 示例 查找java进程: pgrep java 上图还显示了ps ...

  8. HTTP/1.1、HTTP/2、HTTP/3 演变

    HTTP/1.1 相比 HTTP/1.0 提高了什么性能? 针对 HTTP/1.1 的性能瓶颈,HTTP/2 做了什么优化? HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化? HTTP/1.1 ...

  9. k8s新手必看

    转载自https://juejin.im/post/6844903840139968520 Kubernetes零基础快速入门!初学者必看! 起源 Kubernetes 源自于 google 内部的服 ...

  10. MySQL数据库干货分享!mysql每月自动创建表结构

    如果你刚好在学MySQL,博主推荐一套很详细的MySQL教程 主要详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如 ...