GUI编程实战--贪吃蛇

参考:遇见狂神说

https://space.bilibili.com/95256449

界面绘制

  • 帧:如果时间片足够小,就是动画,一秒30帧。连起来是动画,拆开是静态的图片
  • 键盘监听
  • 定时器 Timer

package com.ssl.Snake;

import javax.swing.*;

//游戏的主启动类
public class StartGame { public static void main(String[] args) {
JFrame frame = new JFrame("基于java-GUI的贪吃蛇小游戏"); frame.setBounds(50,50,900,800);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false); //大小不可变 //正常游戏界面都应该在面板上!
frame.add(new GamePanel());
}
}
package com.ssl.Snake;

import javax.swing.*;
import java.net.URL; //数据中心
public class Data { //相对定位 tx.jpg
//绝对定位 / 相当于当前项目
public static URL headerURL = Data.class.getResource("statics/header.png");
public static ImageIcon header = new ImageIcon(headerURL); public static URL headURL = Data.class.getResource("statics/head.png");
public static ImageIcon head = new ImageIcon(headURL);
public static URL leftURL = Data.class.getResource("statics/left.png");
public static ImageIcon left = new ImageIcon(leftURL); public static URL rightURL = Data.class.getResource("statics/right.png");
public static ImageIcon right = new ImageIcon(rightURL); public static URL upURL = Data.class.getResource("statics/up.png");
public static ImageIcon up = new ImageIcon(upURL); public static URL downURL = Data.class.getResource("statics/down.png");
public static ImageIcon down = new ImageIcon(downURL); public static URL foodURL = Data.class.getResource("statics/food.png");
public static ImageIcon food = new ImageIcon(foodURL); public static URL bodyURL = Data.class.getResource("statics/body.png");
public static ImageIcon body = new ImageIcon(bodyURL); }
package com.ssl.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.security.Key;
import java.util.Random; //游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener { //定义蛇的数据结构
int length; //蛇的长度
int[] snakeX = new int[600]; //蛇的x坐标 25*25
int[] snakeY = new int[500]; //蛇的y坐标 25*25 //脑袋的初始方向
String fx; //游戏当前状态 开始/停止
boolean isStart; //游戏速度
int speed = 100;
//定时器
Timer timer = new Timer(speed,this); //100ms执行一次 //食物的坐标 x:25:850 y:150:725
int foodx;
int foody; Random random = new Random(); //游戏失败
boolean isfall = false; //成绩
int score; //构造器
public GamePanel(){
init();
//获得焦点和键盘事件
this.setFocusable(true); //获得焦点事件
this.addKeyListener(this);
} public void init(){
//初始化长度为3
length=3;
snakeX[0]=100; snakeY[0]=200; //脑袋坐标
snakeX[1]=75; snakeY[1]=200; //第一个身体
snakeX[2]=50; snakeY[2]=200; //第二个身体
fx = "R";
isStart = false;
speed=100;
timer.start();//定时器 //把食物随机放上
foodx = 25 + 25 * random.nextInt(34);
foody = 150 +25 * random.nextInt(24); score = 0;
} //绘制面板,游戏中所用东西都用这个画笔来画。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏,不用会闪烁 //绘制静态的面板
this.setBackground(Color.WHITE);
Data.head.paintIcon(this,g,0,0); //广告栏 g.fillRect(25,150,850,600);//默认的游戏界面 //画积分
g.setColor(Color.BLACK);
//设置字体
g.setFont(new Font("微软雅黑",Font.BOLD,20)); //放入字
g.drawString("长度:"+length,750,50);
g.drawString("得分:"+score,750,100); //画食物
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){
g.setColor(Color.WHITE);
//设置字体
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //放入字
g.drawString("按下空格开始游戏",300,400);
} //如果游戏失败
if(isfall){
g.setColor(Color.RED);
//设置字体
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //放入字
g.drawString("游戏失败,按下空格重新开始",150,400);
} } @Override
public void keyTyped(KeyEvent e) { } //键盘的监听事件
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode(); //获得键盘的按键
if(keyCode == KeyEvent.VK_SPACE){ //如果按下的是空格键
if(isfall){
//重新开始
isfall = false;
init();
}else{
isStart = !isStart;
}
repaint();
}
//小蛇移动
if(keyCode == KeyEvent.VK_UP && (fx.equals("R")||fx.equals("L")) ){
fx="U";
}else if(keyCode == KeyEvent.VK_DOWN && (fx.equals("R")||fx.equals("L"))){
fx="D";
}else if(keyCode == KeyEvent.VK_LEFT && (fx.equals("U")||fx.equals("D")) ){
fx="L";
}else if(keyCode == KeyEvent.VK_RIGHT && (fx.equals("U")||fx.equals("D"))){
fx="R";
} } @Override
public void keyReleased(KeyEvent e) { } //事件监听 通过固定的事件刷新 1s 10次
@Override
public void actionPerformed(ActionEvent e) {
//如果游戏是开始状态,就让小蛇动起来
if(isStart && isfall == false){ //吃食物
if(snakeX[0]==foodx && snakeY[0]==foody){
length++;
foodx = 25 + 25 * random.nextInt(34);
foody = 150 +25 * random.nextInt(24);
//变速
speed= speed - 1;
score+=10;
} //身体的移动 后一节变到前一节
for(int i=length -1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//右移
if(fx.equals("R")){
snakeX[0]=snakeX[0]+25;
}else if(fx.equals("L")){
snakeX[0]=snakeX[0]-25;
}else if(fx.equals("U")){
snakeY[0]=snakeY[0]-25;
}else if(fx.equals("D")){
snakeY[0]=snakeY[0]+25;
} //边界判断
if(snakeX[0]>850){
snakeX[0]=25;
}
if(snakeX[0]<25){
snakeX[0]=850;
}
if(snakeY[0]>725){
snakeY[0]=150;
}
if(snakeY[0]<150){
snakeY[0]=725;
} //失败判定,撞到自己就算失败
for(int i=1;i<length;i++){
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i])
isfall=true;
} repaint(); }
if(speed<50){
speed=50;
}
timer.start();//定时器
}
}

GUI编程实战--贪吃蛇的更多相关文章

  1. GUI简单实战——贪吃蛇

    将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...

  2. 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏

    详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客

  3. Linux Curses编程实现贪吃蛇

    curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库    Linux ...

  4. [C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现

    这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { ) sna ...

  5. [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现

    由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是 ...

  6. [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义

    蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...

  7. [C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义

    游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没 ...

  8. [C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义

    每个游戏都有一个很明确的目的或者说游戏主题,贪吃蛇的目的很明确:蛇找到并吃掉食物.只有目的是很无聊的,算不上一个好游戏.所以设计者增加了创意:1. 吃掉食物后蛇会增长:2. 吃掉食物后分数会增加.有些 ...

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

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

  10. 第70讲:Scala界面GUI编程实战详解

    今天又学习了王家林老师的scala学习讲座第70讲,关于scala的界面编程,让我们来初步学习一下scala中界面编程的过程. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号 ...

随机推荐

  1. git ssh 22 失效

    Host github.com User 2070152270@qq.com Hostname ssh.github.com PreferredAuthentications publickey Id ...

  2. 解决vuex 状态管理mutations报错为:"[vuex] unknown mutation type: VIWE_NAV"

    报错截图: 我的解决思路: 1.先检查gettes方向获取与actions提交是否畅通,同时专注检查code是否输错. 2.我查了别人多数是""在vuex中没有mutation,有 ...

  3. 解决未定义的count键“报错为:"Uncaught ReferenceError: count is not defined"

    报错: 源码:Vuex仓库.js let state = {     count } export default state   解决:未赋值的count键

  4. HTML——VSCODE配置笔记

    # 使用VSCODE编辑前端代码 ### 1.问题一:无法根据!快速生成html标准代码 (1).首先看文件命名是否出错,即文件名后缀名.html (2).第一步没出错,就在新建文件的编辑状态下拨动C ...

  5. python更改图片后缀名为jpg格式

    1 import os 2 import cv2 3 class GeneDataset(): 4 def __init__(self,rootdir): 5 self.rootdir = rootd ...

  6. jmeter dubbo测试

    一.环境准备 1.安装jmeter 2.安装dubbo插件,下载地址jmeter-plugins-dubbo, 将jar包放入${JMETER_HOME}\lib\ext路径下,重启即可 二.添加一个 ...

  7. nginx二进制安装脚本

    #!/bin/bash NGINX_FILE=nginx-1.22.0#NGINX_FILE=nginx-1.20.2#NGINX_FILE=nginx-1.18.0NGINX_URL=http:// ...

  8. C 语言 数制

    C 语言 数制 数制也称计数制,是指用一组固定的符号和统一的规则来表示数值的方法.计算机处理的信息必须转换成二进制形式数据后才能进行存储和传输.计算机中,经常使用的进制有二进制.八进制.十进制.十六进 ...

  9. Linux系统管理实战-软件包管理

    软件包管理 在Linux中,不同的发行版软件管理的方式可能不一样,具体来说,主要分为两大派: RPM: Rpm Package Manager CentOS系统软件安装三种方式 rpm:安装简单,可定 ...

  10. 字典:求和计数(return知识巩固)

    野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...