【GUI】-- 12 贪吃蛇小游戏之让小蛇动起来

GUI编程

04 贪吃蛇小游戏

4.3 第三步:让小蛇动起来(键盘控制)

首先,在构造器中要获取焦点事件、键盘监听事件并加入定时器(定时器定义需要实现ActionListener接口并重写actionPerformed方法):

//构造器public GamePanel() {init();this.setFocusable(true);  //获取焦点事件this.addKeyListener(this);  //获取键盘监听事件timer.start();  //游戏一开始,定时器就启动}

然后,在键盘监听事件中,通过定时器来实现监听(即通过固定的时间进行刷新),并加入对上下左右按键的判断,以实现改变小蛇身体的对应走向:

//键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();  //获取键盘按键if (keyCode == KeyEvent.VK_SPACE) {isStart = !isStart;repaint();}//键盘监听到按键后画上对应方向的蛇头if (keyCode == KeyEvent.VK_UP) {direction = "U";} else if (keyCode == KeyEvent.VK_DOWN) {direction = "D";} else if (keyCode == KeyEvent.VK_LEFT) {direction = "L";} else if (keyCode == KeyEvent.VK_RIGHT) {direction = "R";}}

下面对实现ActionListener接口的actionPerformed方法进行重写:

//事件监听需要定时器来实现,即通过固定的时间进行刷新(例如1s=10次)@Overridepublic void actionPerformed(ActionEvent e) {if (isStart) {//小蛇身体右移for (int i = length - 1; i > 0; i--) {  //后一节身体移动至前一节 snakeX[1] = snakeX[0]snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}//判断蛇头走向switch (direction) {case "R":snakeX[0] += 25;//边界判断if (snakeX[0] > 850) {snakeX[0] = 25;}break;case "L":snakeX[0] -= 25;//边界判断if (snakeX[0] < 25) {snakeX[0] = 850;}break;case "U":snakeY[0] -= 25;//边界判断if (snakeY[0] < 75) {snakeY[0] = 650;}break;case "D":snakeY[0] += 25;//边界判断if (snakeY[0] > 650) {snakeY[0] = 75;}break;}repaint();}timer.start();}

综上,GamePanel类中代码如下:

package com.duo.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.Objects;//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {//定义蛇的数据结构int length;  //小蛇总长int[] snakeX = new int[600];  //蛇的X坐标 25*25int[] snakeY = new int[500];  //蛇的Y坐标 25*25String direction;  //蛇头方向boolean isStart = false;  //默认未开始游戏//定时器Timer timer = new Timer(250, this);  //100ms执行一次//构造器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;  //第二节身体的坐标direction = "R";  //蛇头初始向右}//绘制静态面板@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);  //起到清屏的作用Data.header.paintIcon(this, g, 25, 11);  //将广告栏画入面板g.fillRect(25, 75, 850, 600);  //默认的游戏界面(黑色区域)this.setBackground(Color.white);//将小蛇画入面板中的游戏区域,且蛇头部分需要判断方向switch (direction) {case "R":Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "L":Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "U":Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "D":Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);break;}//画小蛇的身体部分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, 300);}}//键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();  //获取键盘按键if (keyCode == KeyEvent.VK_SPACE) {isStart = !isStart;repaint();}//键盘监听到按键后画上对应方向的蛇头if (keyCode == KeyEvent.VK_UP) {direction = "U";} else if (keyCode == KeyEvent.VK_DOWN) {direction = "D";} else if (keyCode == KeyEvent.VK_LEFT) {direction = "L";} else if (keyCode == KeyEvent.VK_RIGHT) {direction = "R";}}//事件监听需要定时器来实现,即通过固定的时间进行刷新(例如1s=10次)@Overridepublic void actionPerformed(ActionEvent e) {if (isStart) {//小蛇身体右移for (int i = length - 1; i > 0; i--) {  //后一节身体移动至前一节 snakeX[1] = snakeX[0]snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}//判断蛇头走向switch (direction) {case "R":snakeX[0] += 25;//边界判断if (snakeX[0] > 850) {snakeX[0] = 25;}break;case "L":snakeX[0] -= 25;//边界判断if (snakeX[0] < 25) {snakeX[0] = 850;}break;case "U":snakeY[0] -= 25;//边界判断if (snakeY[0] < 75) {snakeY[0] = 650;}break;case "D":snakeY[0] += 25;//边界判断if (snakeY[0] > 650) {snakeY[0] = 75;}break;}repaint();}timer.start();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}
}

运行结果如下:

游戏未开始时:

图1

未按方向键,小蛇默认一直向右移动直到边界,满足边界判断条件并重新回到界面左端:

图2

按下下键,小蛇向下移动:

图3

至此,小蛇可根据键盘按键进行对应方向的移动。此时还未加入食物,且当蛇头触碰蛇身时并不会触发游戏失败,这将在下一篇内容中给出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jbase仪器接口设计

jbase的计划有借助虚拟M来实现连仪器&#xff0c;之前陆续写了些TCP逻辑&#xff0c;今天终于整理完成了仪器设计。首先用java的cs程序测试TCP的服务和客户端。 javafx的示例加强 package sample;import javafx.application.Application; import javafx.event.EventHandler; …

Web 自动化神器 TestCafe—页面基本操作篇

前 言 Testcafe是基于node.js的框架&#xff0c;以操作简洁著称&#xff0c;是web自动化的神器 今天主要给大家介绍一下testcafe这个框架和页面元素交互的方法。 一、互动要求 使用 TestCafe 与元素进行交互操作&#xff0c;元素需满足以下条件&#xff1a;☟ 元素在 body 页…

专访特斯拉工程师杨硕:跟着机器人上天入地、探索地外行星丨智源独家

导读 十几岁时&#xff0c;他痴迷《终结者》&#xff0c;曾在百科全书中窥见卡内基梅隆大学机械臂的介绍&#xff0c;从而得知了研究机器人「圣地」的存在。 在CMU&#xff0c;他深耕足式机器人感知定位算法&#xff0c;期待未来涉足太空&#xff0c;走上火星。 在大疆&#xf…

瑞格心理咨询系统设置多个管理员的操作方法

使用瑞格心理咨询系统&#xff0c;需要设置多个admin权限的管理员账号来管理&#xff0c;咨询厂家答复只能有1个管理员&#xff0c;个人觉得不可能&#xff0c;于是开始折腾。 解决办法&#xff1a; 在没有数据字典的情况下&#xff0c; 通过遍历数据库&#xff0c;发现用户信…

『 Linux 』使用fork函数创建进程与进程状态的查看

文章目录 &#x1f5a5;️ 前言 &#x1f5a5;️&#x1f5a5;️ 通过系统调用获取进程标识符 &#x1f5a5;️&#x1f4bb; 进程标识符PID&#x1f4bb; 父进程标识符PPID &#x1f5a5;️ 通过系统调用创建子进程 fork() &#x1f5a5;️&#x1f4bb; 那么为什么在fork()函…

线程池简介及其简单实现

如果需要频繁的创建销毁线程, 就需要想办法降低创建和销毁的开销, 而线程池就是一个很好的选择: 提前创建好一些线程, 等到需要使用线程的时候, 直接从池子里拿一个就好了, 当不再使用该线程时, 就放回到池子里. 那么此时就从 创建/销毁线程 -> 池子里取线程/将线程还到池子…

构建智能医患沟通:陪诊小程序开发实战

在医疗科技的浪潮中&#xff0c;陪诊小程序的开发成为改善医患沟通的创新途径之一。本文将介绍如何使用Node.js和Express框架构建一个简单而强大的陪诊小程序&#xff0c;实现患者导诊和医生咨询功能。 1. 安装Node.js和Express 首先确保已安装Node.js&#xff0c;然后使用以…

Linux procps-ng - top

procps-ng 是一个开源的进程管理工具集&#xff0c;它提供了一系列用于监控和管理系统进程的命令行工具。它是 procps 工具集的一个分支&#xff0c;旨在改进和增强原有的 procps 工具。 procps-ng 包括了一些常用的命令行工具&#xff0c;例如&#xff1a; ps&#xff1a;用于…

机器学习笔记 - 创建CNN + RNN + CTC损失的模型来识别图像中的文本

我们将创建一个具有CTC损失的卷积循环神经网络来实现我们的OCR识别模型。 一、数据集 我们将使用 Visual Geometry Group 提供的数据。 Visual Geometry Group - University of OxfordComputer Vision group from the University of Oxfordhttps://www.robots.ox.ac.uk/~vgg/d…

最新AIGC创作系统ChatGPT系统源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图,图片对话理解功能

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

leetcode:415. 字符串相加(模拟竖式计算)

一、题目 链接&#xff1a; 415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;char* addStrings(char* num1, char* num2) 二、思路&#xff1a; 本题本质是将两个字符型数字相加&#xff0c;字符型数字相加就一定需要进行字符与数字的相互转换 详…

秋招JAVA面经总结

面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…

笔试强训2

目录 &#x1f449;&#x1f3fb;字符串反转&#x1f449;&#x1f3fb;公共子串计算 &#x1f449;&#x1f3fb;字符串反转 mycode:100% #include <iostream> #include<algorithm> using namespace std;int main() {string s;cin>>s;reverse(s.begin(),s.…

Java(五)(Object类,克隆,Objects类,包装类,StringBuilder,StringJoiner,BigDecimal)

目录 Object类 Object类的常见方法: 克隆 浅克隆 深克隆 Objects类 包装类 StringBuilder StringJoiner BigDecimal Object类 Object类是java中的祖宗类,因此,Java中所有的类的对象都可以直接使用object类提供的一些方法 Object类的常见方法: public String toStrin…

23111701[含文档+PPT+源码等]计算机毕业设计javaweb点餐系统全套餐饮就餐订餐餐厅

文章目录 **项目功能简介:****点餐系统分为前台和后台****前台功能介绍&#xff1a;****后台功能介绍&#xff1a;** **论文截图&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;77687156…

智能座舱架构与芯片- (8) 视觉篇

一、概述 相比起用于ADAS感知系统的摄像头&#xff0c;用于智能座舱内部的摄像头&#xff0c;其功能特性和性能要求相对简单。例如&#xff0c;OMS乘客监控摄像头&#xff0c;一般达到5MP即可有良好的效果。同时&#xff0c;OMS也可应用于车内会议系统&#xff0c;还应用于车内…

微服务 Spring Cloud 8,开源RPC框架如何选型?

目录 一、开源RPC框架有哪些&#xff1f;1、跟语言平台绑定的开源RPC框架2、跨语言平台的开源RPC框架 二、跟语言平台绑定的开源RPC框架 -- Dubbo1、Dubbo的架构主要包含四个角色2、Dubbo的调用框架是如何实现的&#xff1f; 三、如何选择&#xff1f;四、跨语言平台的开源RPC框…

UI for Apache Kafka

文章Overview of UI Tools for Monitoring and Management of Apache Kafka Clusters | by German Osin | Towards Data Science中介绍了8种常见的kafka UI工具,这些产品的核心功能对比信息如下图所示, 通过对比发现 UI for Apache Kafka 功能齐全且免费,因此可以作为我们的首…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术&#xff0c;而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术&#xff0c;而不是科学。 本文将带你深入理解容器探测[2]&#xff0c;并特别关注相对较…

Linux安装ErLang(亲测可用)

注&#xff08;我这里安装完成后显示的是中文&#xff0c;有的是显示的英文&#xff09; 1.下载er wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm2.安装er yum -y install epel-release截图截不全&#xff0c;就只截安装完成的部分了 rp…