GUI编程实战--贪吃蛇
GUI编程实战--贪吃蛇
参考:遇见狂神说
界面绘制
- 帧:如果时间片足够小,就是动画,一秒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编程实战--贪吃蛇的更多相关文章
- GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...
- 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏
详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客
- Linux Curses编程实现贪吃蛇
curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库 Linux ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现
这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { ) sna ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现
由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义
蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义
游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义
每个游戏都有一个很明确的目的或者说游戏主题,贪吃蛇的目的很明确:蛇找到并吃掉食物.只有目的是很无聊的,算不上一个好游戏.所以设计者增加了创意:1. 吃掉食物后蛇会增长:2. 吃掉食物后分数会增加.有些 ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- 第70讲:Scala界面GUI编程实战详解
今天又学习了王家林老师的scala学习讲座第70讲,关于scala的界面编程,让我们来初步学习一下scala中界面编程的过程. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号 ...
随机推荐
- Python 默认环境
查看pip默认安装目录 python -m site 查看已安装 pip list installed 查看安装位置 pip show PyMySQL
- C# 调用https接口 安全证书问题 解决方法
原文链接: https://blog.csdn.net/lizaijinsheng/article/details/127321758 说明: 如果是用https的话,由于没有证书,会报错:基础连接已 ...
- 【python】python,PyQt5以及Qt designer的使用_做界面(用vscode)
1.PyQt5和Qt designer准备 win+r cmd 输入以下 python -m pip install -i http://pypi.douban.com/sim ...
- Day11-数组的使用
数组的使用 一.数组的使用 package com.array; public class ArrayDemo03 { public static void main(String[] args) { ...
- Vue中的input输入框无法输入强制渲染
刚开始以为是键盘的问题,然后发现别的地方都可以输入,唯独这个input无法输入,可能因为我循环嵌套了三次,太深入无法渲染 后来我发现这个方法可以使用 1 <el-input 2 v-model= ...
- 将Vue项目部署到Nginx中,出现的400,405,200响应空等问题处理
最近用Vue3写了个项目,然后对接后台接口. 在本地vue配置文件中,配置了反向代理.成功请求了后端接口. 自测没有问题. 打包vue,发布到nginx中.运行nginx,成功显示了页面. 当点击页面 ...
- Linux的进程和线程关系
一.理解Linux的进程,线程,PID,LWP,TID,TGID 进程是资源分配的基本单位,线程是调度的基本单位进程是资源的集合,这些资源包括内存地址空间,文件描述符等等,一个进程中的多个线程共享这些 ...
- python之基本数据类型--数字类型
变量是为了让计算机像人一样的去记录事务的某种状态,那变量值就是用来存储事务的状态,在现实生活中事物状态明显的分为不同的种类,比如人类的年龄.身高.体重.工资.等等,所以变量也是有不同类型的,变量的几种 ...
- vue 同一个子组件,两次赋值不同,dom不更新
转自:https://blog.csdn.net/WO_JIAMIFENG/article/details/115250918 <div :key="inputkey"> ...
- 2020ccpc威海C.Rencontre题解(树形dp)
题目大意:给定一棵带边权树,给三份点的集合U1,U2,U3,求0.5*(E(dis(u1,u2))+E(dis(u1,u3))+E(dis(u2,u3))). 即,我们需要维护两份点的所有距离和.显然 ...