当前位置: 首页 > news >正文

关于做营销型网站的建议淘宝关键词排名查询工具

关于做营销型网站的建议,淘宝关键词排名查询工具,深圳网站建设设计制作,西宁做网站_君博相约简介 简易贪吃蛇,使用 javax.swing 组件构建游戏界面,通过监听键盘按键实现游戏操纵。 功能设计 按1 - 开始游戏按2 - 重新开始按3 - 暂停/继续按Esc-退出游戏统计吃到的苹果个数(得分)难度控制,得分超过阈值时难度…

简介

简易贪吃蛇,使用 javax.swing 组件构建游戏界面,通过监听键盘按键实现游戏操纵。

功能设计

  • 按1 - 开始游戏
  • 按2 - 重新开始
  • 按3 - 暂停/继续
  • 按Esc-退出游戏
  • 统计吃到的苹果个数(得分)
  • 难度控制,得分超过阈值时难度增加(蛇身移动速度加快)

实现

定义 SnakeGame 类:
继承 JPanel 类, 重写其由 JComponent 类中继承的 paintComponent 方法,在此方法中进行图像的绘制。
实现 ActionListener 类, 实现其 actionPerformed 方法, 通过监听在 SnakeGame 类中的Timer 计时器步长内按键的输入完成对图像的操作。

public class SnakeGame extends JPanel implements ActionListener {//(timer = new Timer(delay, this)).start();public void paintComponent(Graphics g) {//在这里操作图像的绘制,蛇身和苹果等}public void actionPerformed(ActionEvent e) {//在这里通过对定时器的监听完成对图像的操作}}

自定义按键适配器, 将键盘输入转换为程序识别的方向值,同时记录键盘输入。


/*** 定义方向*/
public interface Direction {char LEFT = 'L';char RIGHT = 'R';char UP = 'U';char DOWN = 'D';}/*** 按键适配器,用于监听输入按键*/
public class MyKeyAdapter extends KeyAdapter {public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();eventKeyCode = e.getKeyCode();if ((keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) && direction != Direction.RIGHT) {direction = Direction.LEFT;} else if ((keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) && direction != Direction.LEFT) {direction = Direction.RIGHT;} else if ((keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) && direction != Direction.DOWN) {direction = Direction.UP;} else if ((keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) && direction != Direction.UP) {direction = Direction.DOWN;}}
}

在 paintComponent 和 actionPerformed 方法中实现游戏逻辑。

注意:

  • 对可用像素点的处理:可用像素点个数 = 屏幕长 * 屏幕宽 / 单位大小(苹果大小)。
  • 对蛇身初始坐标的处理: 存储蛇身的初始坐标须在可用像素点中。
  • 对苹果坐标的处理:需判断新的苹果坐标是否在蛇身内。
  • 对游戏是否存活的处理:蛇头撞到蛇身或者蛇头撞到边缘都应视为结束。
  • 对接收到的按键值的处理:除方向按键外,其余按键值使用完之后需做清除。

完整实现代码如下

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.Random;public class SnakeGame extends JPanel implements ActionListener {public interface Direction {char LEFT = 'L';char RIGHT = 'R';char UP = 'U';char DOWN = 'D';}public interface RunStatus {char READY = '0'; // 就绪char RUN = '1'; // 运行char OVER = '2'; // 失败char PAUSE = '3'; // 暂停/继续}final Random random = new Random();volatile int eventKeyCode;//记时步长volatile int delay = 150;Timer timer = null;//屏幕大小static final int SCREEN_WIDTH = 600;static final int SCREEN_HEIGHT = 600;//可用像素点static final int UNIT_SIZE = 25;static final int GAME_UNITS = (SCREEN_WIDTH * SCREEN_HEIGHT) / UNIT_SIZE;//蛇身volatile int bodyParts;int snakeBodyX[];int snakeBodyY[];//目标int appleX;int appleY;//得分volatile int applesEaten;volatile char direction;volatile char runStatus;SnakeGame() {this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));this.setFocusable(true);this.addKeyListener(new MyKeyAdapter());(timer = new Timer(delay, this)).start();init();}public void init() {bodyParts = 1;snakeBodyX = new int[GAME_UNITS];Arrays.fill(snakeBodyX, -1);snakeBodyX[0] = 0;snakeBodyY = new int[GAME_UNITS];Arrays.fill(snakeBodyY, -1);snakeBodyY[0] = 0;appleX = nextCoordinate(SCREEN_WIDTH, snakeBodyX);appleY = nextCoordinate(SCREEN_HEIGHT, snakeBodyY);applesEaten = 0;direction = Direction.RIGHT;runStatus = RunStatus.READY;timer.setDelay(delay);}public void paintComponent(Graphics g) {super.paintComponent(g);String tip = "" + applesEaten;int y = SCREEN_HEIGHT / 2 - 120;switch (runStatus) {case RunStatus.READY:drawing(g);g.setColor(Color.BLUE);g.setFont(new Font(null, Font.ITALIC, 20));g.drawString("按1-开始游戏", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));g.drawString("按2-重新开始", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));g.drawString("按3-暂停/继续", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));g.drawString("按Esc-退出游戏", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));break;case RunStatus.PAUSE:drawing(g);g.setColor(Color.BLUE);g.setFont(new Font(null, Font.ITALIC, 20));y = y + 80;g.drawString("按3-继续", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));g.drawString("按Esc-退出游戏", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));break;case RunStatus.RUN:drawing(g);g.setColor(Color.blue);g.setFont(new Font(null, Font.BOLD, 20));g.drawString(tip, (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, g.getFont().getSize());break;case RunStatus.OVER:g.setColor(Color.RED);g.setFont(new Font("Ink Free", Font.BOLD, 40));g.drawString("Game Over", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, y - 120);g.setFont(new Font(null, Font.ITALIC, 20));g.drawString("得分:" + applesEaten, (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, y - 60);g.setColor(Color.BLUE);g.drawString("按2-重新开始", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));g.drawString("按Esc-退出游戏", (SCREEN_WIDTH - getFontMetrics(g.getFont()).stringWidth(tip)) / 2, (y = y + 40));break;default:break;}}/*** 绘制蛇身和苹果** @param g*/public void drawing(Graphics g) {//苹果颜色g.setColor(Color.PINK);//画苹果g.fillOval(appleX, appleY, UNIT_SIZE, UNIT_SIZE);//蛇身颜色g.setColor(Color.RED);//填充蛇身for (int i = 0; i < bodyParts; i++) {g.fillRect(snakeBodyX[i], snakeBodyY[i], UNIT_SIZE, UNIT_SIZE);}}/*** 执行的动作* 会定时执行此方法** @param e*/public void actionPerformed(ActionEvent e) {//前置事件doSomeThing();if (runStatus == RunStatus.RUN) {move();//撞到边缘if (snakeBodyX[0] < 0 || snakeBodyX[0] > SCREEN_WIDTH || snakeBodyY[0] < 0 || snakeBodyY[0] > SCREEN_HEIGHT) {runStatus = RunStatus.OVER;}//蛇身相撞for (int i = bodyParts; i > 0; i--) {if ((snakeBodyX[0] == snakeBodyX[i]) && (snakeBodyY[0] == snakeBodyY[i])) {runStatus = RunStatus.OVER;}}//得分if ((snakeBodyX[0] == appleX) && (snakeBodyY[0] == appleY)) {applesEaten++;bodyParts++;//重新生成苹果appleX = nextCoordinate(SCREEN_WIDTH, snakeBodyX);appleY = nextCoordinate(SCREEN_HEIGHT, snakeBodyY);//预留难度设置的方法difficultySettings();}}//重新绘图, 执行 paintComponent 方法repaint();}/*** 蛇身移动*/private void move() {for (int i = bodyParts; i > 0; i--) {snakeBodyX[i] = snakeBodyX[(i - 1)];snakeBodyY[i] = snakeBodyY[(i - 1)];}switch (direction) {case Direction.UP:snakeBodyY[0] -= UNIT_SIZE;break;case Direction.DOWN:snakeBodyY[0] += UNIT_SIZE;break;case Direction.LEFT:snakeBodyX[0] -= UNIT_SIZE;break;case Direction.RIGHT:snakeBodyX[0] += UNIT_SIZE;break;default:break;}}private void doSomeThing() {if (KeyEvent.VK_ESCAPE == eventKeyCode) {System.out.println("退出程序");System.exit(0);return;}if (KeyEvent.VK_1 == eventKeyCode) {System.out.println("开始游戏");runStatus = RunStatus.RUN;}if (KeyEvent.VK_2 == eventKeyCode) {if (runStatus != RunStatus.RUN) {System.out.println("重新开始");init();}runStatus = RunStatus.RUN;}if (KeyEvent.VK_3 == eventKeyCode) {if (runStatus == RunStatus.RUN) {System.out.println("暂停");runStatus = RunStatus.PAUSE;eventKeyCode = -1;return;}if (runStatus == RunStatus.PAUSE) {System.out.println("继续");runStatus = RunStatus.RUN;eventKeyCode = -1;return;}}eventKeyCode = -1;}/*** 难度设置, 默认得分超过16的倍数时速度提升1/4*/private void difficultySettings() {//难度增加, 速度加快if (applesEaten % 16 == 0 && applesEaten != 0) {timer.setDelay(timer.getDelay() - timer.getDelay() / 4);}}/*** 下一个苹果坐标** @param randomFactorint* @param arr* @return*/synchronized private int nextCoordinate(int randomFactorint, int[] arr) {int coordinate = random.nextInt(randomFactorint / UNIT_SIZE) * UNIT_SIZE;for (int i = 0; i < arr.length; i++) {if (arr[i] == -1) {break;}if (coordinate == arr[i]) {nextCoordinate(randomFactorint, arr);}}return coordinate;}/*** 按键适配器,用于监听输入按键*/public class MyKeyAdapter extends KeyAdapter {public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();eventKeyCode = e.getKeyCode();if ((keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) && direction != Direction.RIGHT) {direction = Direction.LEFT;} else if ((keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) && direction != Direction.LEFT) {direction = Direction.RIGHT;} else if ((keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) && direction != Direction.DOWN) {direction = Direction.UP;} else if ((keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) && direction != Direction.UP) {direction = Direction.DOWN;}}}public static void main(String[] args) {JFrame frame = new JFrame();frame.setTitle("贪吃蛇");SnakeGame snake = new SnakeGame();frame.add(snake);frame.setResizable(false);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setVisible(true);}
}

效果展示

游戏启动

在这里插入图片描述

游戏暂停

在这里插入图片描述


文章转载自:
http://reclassify.c7500.cn
http://ventiduct.c7500.cn
http://bickiron.c7500.cn
http://studio.c7500.cn
http://circumvent.c7500.cn
http://redbird.c7500.cn
http://doable.c7500.cn
http://park.c7500.cn
http://moldingplane.c7500.cn
http://embrown.c7500.cn
http://farer.c7500.cn
http://megagamete.c7500.cn
http://postliminy.c7500.cn
http://quotation.c7500.cn
http://cystocele.c7500.cn
http://amygdalate.c7500.cn
http://pathetical.c7500.cn
http://admiring.c7500.cn
http://faradization.c7500.cn
http://proconsul.c7500.cn
http://hepatocele.c7500.cn
http://cantrail.c7500.cn
http://holla.c7500.cn
http://bowery.c7500.cn
http://surrejoinder.c7500.cn
http://nodal.c7500.cn
http://vettura.c7500.cn
http://wedeln.c7500.cn
http://univac.c7500.cn
http://chauvinistic.c7500.cn
http://computistical.c7500.cn
http://completeness.c7500.cn
http://glomerulate.c7500.cn
http://tribal.c7500.cn
http://secretive.c7500.cn
http://extravagancy.c7500.cn
http://thrust.c7500.cn
http://profanity.c7500.cn
http://frequency.c7500.cn
http://gelatin.c7500.cn
http://traitoress.c7500.cn
http://airily.c7500.cn
http://ssn.c7500.cn
http://toothpaste.c7500.cn
http://bacteriolytic.c7500.cn
http://openness.c7500.cn
http://keel.c7500.cn
http://renunciative.c7500.cn
http://teetotal.c7500.cn
http://graveness.c7500.cn
http://microhabitat.c7500.cn
http://woodcarving.c7500.cn
http://analysand.c7500.cn
http://immoralize.c7500.cn
http://diaplasis.c7500.cn
http://trapeziform.c7500.cn
http://sonless.c7500.cn
http://colonizer.c7500.cn
http://unprovoked.c7500.cn
http://testament.c7500.cn
http://warlike.c7500.cn
http://cardiology.c7500.cn
http://islander.c7500.cn
http://insightful.c7500.cn
http://only.c7500.cn
http://growlingly.c7500.cn
http://hurlbat.c7500.cn
http://picker.c7500.cn
http://vicinal.c7500.cn
http://spicous.c7500.cn
http://eaprom.c7500.cn
http://irrepatriable.c7500.cn
http://subassembly.c7500.cn
http://excepting.c7500.cn
http://indio.c7500.cn
http://lagend.c7500.cn
http://lonicera.c7500.cn
http://molechism.c7500.cn
http://ruttish.c7500.cn
http://extort.c7500.cn
http://cupreous.c7500.cn
http://winkle.c7500.cn
http://floccose.c7500.cn
http://ra.c7500.cn
http://doorless.c7500.cn
http://eath.c7500.cn
http://justification.c7500.cn
http://hashery.c7500.cn
http://reinsurance.c7500.cn
http://compo.c7500.cn
http://tarnishproof.c7500.cn
http://spado.c7500.cn
http://runproof.c7500.cn
http://hulda.c7500.cn
http://distomiasis.c7500.cn
http://desultoriness.c7500.cn
http://underlayment.c7500.cn
http://viselike.c7500.cn
http://famulus.c7500.cn
http://alembic.c7500.cn
http://www.zhongyajixie.com/news/84287.html

相关文章:

  • 做巧克力的网站网络营销推广方案论文
  • 做视频官方网站最近时事热点
  • 利用google地图标注做网站网址申请注册
  • 二手房地产中介网站建设长沙谷歌seo
  • 乡镇门户网站建设的现状及发展对策曲靖seo
  • 网站源码生成策划公司是做什么的
  • 宁波网站建设运营哪些平台可以免费发布产品
  • SEO案例网站建设网站seo关键词优化排名
  • 百度行发代理商关键词推广优化排名如何
  • 广元市住房和城乡建设局网站有域名有服务器怎么做网站
  • 用vs做网站表格向上居中windows7优化大师官方下载
  • 晋城住房保障和城乡建设管网站百度收录哪些平台比较好
  • 珠海 网站建设网站综合排名信息查询
  • wordpress做出影视网站网页设计欣赏
  • 网站用户体验设计公司排名seo
  • 网站设计时应考虑哪些因素关键词排名优化公司推荐
  • 一个网络空间如何做两个网站湖南网站seo推广
  • 做puzzle的网站微信怎么推广
  • 北京论坛建站模板seo内链优化
  • 给公司做门户网站 可以用凡客吗北京做网站的公司有哪些
  • 个人网站icp备案教程软件开发培训
  • 网站正在建设中永久网站建设是干嘛的
  • ui素材网站网站搭建公司
  • 怎么做网站备案百度公司地址在哪里
  • 做网站 bs cs文山seo
  • 杭州萧山网站开发做网络优化的公司排名
  • 怎么做一考试网站武汉排名seo公司
  • wordpress建社群seo广告优化
  • 做视频网站视频放在哪里如何在百度上做免费推广
  • 网站后台怎么做alt标签网站营销推广