java贪吃蛇

使用双向链表实现贪吃蛇程序

1.链表节点定义:

package snake;public class SnakeNode {private int x;private int y;private SnakeNode next;private SnakeNode ahead;public SnakeNode() {}public SnakeNode(int x, int y) {super();this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public SnakeNode getNext() {return next;}public void setNext(SnakeNode next) {this.next = next;}public SnakeNode getAhead() {return ahead;}public void setAhead(SnakeNode ahead) {this.ahead = ahead;}}

主程序:

package snake;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.Random;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;/*** Created by hackcoder on 15-3-11.*/
public class Snake extends JFrame {private static final int rows = 60;private static final int columns = 80;// 方向private static final int UP = 1;private static final int RIGHT = 2;private static final int DOWN = 3;private static final int LEFT = 4;private static int DRIECTION_NOW = RIGHT;private static boolean isEat = false;private static int TAILX;private static int TAILY;private static SnakeNode snakeHeader = new SnakeNode();private static SnakeNode snakeTailer = snakeHeader;private static SnakeNode food = new SnakeNode();private static JLabel[] images = new JLabel[rows * columns];public static void main(String args[]) {snakeHeader.setX(new Random().nextInt(rows - 1));snakeHeader.setY(new Random().nextInt(columns - 1));Snake snake = new Snake();food = getFood();while (true) {try {next();// 吃到了食物if (food.getX() == snakeHeader.getX()&& food.getY() == snakeHeader.getY()) {addTail();isEat = true;}//吃到食物,又一次生成一个食物if (isEat) {food = getFood();}// 推断是否结束游戏if (judgeEND()) {JOptionPane.showMessageDialog(null, "游戏结束!", "游戏结束!",JOptionPane.ERROR_MESSAGE);break;}SnakeNode pNow = snakeHeader;while (pNow != null) {images[columns * pNow.getX() + pNow.getY()].setIcon(new ImageIcon("image/black.jpg", ""));pNow = pNow.getNext();}images[columns * food.getX() + food.getY()].setIcon(new ImageIcon("image/black.jpg", ""));Thread.sleep(100);// 清理pNow = snakeHeader;while (pNow != null) {images[columns * pNow.getX() + pNow.getY()].setIcon(new ImageIcon("image/white.jpg", ""));pNow = pNow.getNext();}images[columns * food.getX() + food.getY()].setIcon(new ImageIcon("image/white.jpg", ""));isEat = false;} catch (InterruptedException e) {e.printStackTrace();}}}public Snake() {init();this.setBounds(80, 80, 400, 400);this.setVisible(true);setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);// 加入全局键盘监听KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();manager.addKeyEventPostProcessor((KeyEventPostProcessor) this.getMyKeyEventHandler());}/*** 初始化地图*/public void init() {JPanel p = new JPanel(new GridLayout(rows, columns, 1, 1));setLayout(new BorderLayout());for (int x = 0; x < rows; x++) {for (int y = 0; y < columns; y++) {ImageIcon imageIcon;if (x == 0 || x == rows - 1 || y == 0 || y == columns - 1) {imageIcon = new ImageIcon("image/red.jpg", "");} else {imageIcon = new ImageIcon("image/white.jpg", "");}images[columns * x + y] = new JLabel(imageIcon);p.add(images[columns * x + y]);}}getContentPane().add(p, BorderLayout.CENTER);}/*** 键盘监听* * @return*/public KeyEventPostProcessor getMyKeyEventHandler() {return new KeyEventPostProcessor() {public boolean postProcessKeyEvent(KeyEvent e) {if (e.getID() != KeyEvent.KEY_PRESSED) {return false;}int keycode = e.getKeyCode();if (keycode == KeyEvent.VK_UP) {if (snakeHeader.getNext() != null) {// 推断方向是否可转int x1 = snakeHeader.getX();int y1 = snakeHeader.getY();int x2 = snakeHeader.getNext().getX();int y2 = snakeHeader.getNext().getY();if (y1 == y2 && x1 - x2 == 1) {return true;}}DRIECTION_NOW = UP;} else if (keycode == KeyEvent.VK_RIGHT) {if (snakeHeader.getNext() != null) {int x1 = snakeHeader.getX();int y1 = snakeHeader.getY();int x2 = snakeHeader.getNext().getX();int y2 = snakeHeader.getNext().getY();if (x1 == x2 && y2 - y1 == 1) {return true;}}DRIECTION_NOW = RIGHT;} else if (keycode == KeyEvent.VK_DOWN) {if (snakeHeader.getNext() != null) {int x1 = snakeHeader.getX();int y1 = snakeHeader.getY();int x2 = snakeHeader.getNext().getX();int y2 = snakeHeader.getNext().getY();if (y1 == y2 && x2 - x1 == 1) {return true;}}DRIECTION_NOW = DOWN;} else if (keycode == KeyEvent.VK_LEFT) {if (snakeHeader.getNext() != null) {int x1 = snakeHeader.getX();int y1 = snakeHeader.getY();int x2 = snakeHeader.getNext().getX();int y2 = snakeHeader.getNext().getY();if (x1 == x2 && y1 - y2 == 1) {return true;}}DRIECTION_NOW = LEFT;}return true;}};}/*** 计算贪吃蛇的方向及位移* * @param header*/public static void next() {if (snakeHeader == null)return;TAILX = snakeTailer.getX();TAILY = snakeTailer.getY();SnakeNode pNow = snakeTailer;while (pNow != null) {if (pNow == snakeHeader) {break;}pNow.setX(pNow.getAhead().getX());pNow.setY(pNow.getAhead().getY());pNow = pNow.getAhead();}if (DRIECTION_NOW == RIGHT) {snakeHeader.setY(snakeHeader.getY() + 1);} else if (DRIECTION_NOW == LEFT) {snakeHeader.setY(snakeHeader.getY() - 1);} else if (DRIECTION_NOW == UP) {snakeHeader.setX(snakeHeader.getX() - 1);} else if (DRIECTION_NOW == DOWN) {snakeHeader.setX(snakeHeader.getX() + 1);}}public static void addTail() {SnakeNode tail = new SnakeNode(TAILX, TAILY);snakeTailer.setNext(tail);tail.setAhead(snakeTailer);snakeTailer = snakeTailer.getNext();}public static SnakeNode getFood() {SnakeNode food = new SnakeNode();boolean flag = true;while (true) {int x = new Random().nextInt(rows);int y = new Random().nextInt(columns);if (x == 0 || x == rows - 1 || y == 0 || y == columns - 1) {continue;}SnakeNode pNow = snakeHeader;while (pNow != null) {if (x == pNow.getX() && y == pNow.getY()) {flag = false;}pNow = pNow.getNext();}if (flag) {food = new SnakeNode(x, y);break;}}return food;}public static boolean judgeEND() {//碰墙推断if (snakeHeader.getX() == 0 || snakeHeader.getX() == rows - 1|| snakeHeader.getY() == 0 || snakeHeader.getY() == columns - 1) {return true;}//碰身体推断SnakeNode pNow = snakeHeader.getNext();while (pNow != null) {if (snakeHeader.getX() == pNow.getX()&& snakeHeader.getY() == pNow.getY()) {System.out.println("=========碰到身体===========");return true;}pNow = pNow.getNext();}return false;}}


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

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

相关文章

【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

前面四篇文章都是分析 Bean 默认标签的解析过程&#xff0c;包括基本属性、六个子元素&#xff08;meta、lookup-method、replaced-method、constructor-arg、property、qualifier&#xff09;&#xff0c;涉及内容较多&#xff0c;拆分成了四篇文章&#xff0c;导致我们已经忘…

Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程

前言 我个人觉得在当前 MVC 流行的架构下&#xff0c;要想去了解一个框架&#xff0c;或者是一个基于此架构下的应用程序&#xff0c;最好的入手方式就是先看路由&#xff0c;虽然路由不是 MVC 里的任何一个&#xff0c;但是知道了路由的来龙去脉就知道了整个框架或者是应用的结…

固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异

听说固态硬盘是高富帅的必备神器&#xff0c;本人为了提升工作效率和提高工作速度 这个月节衣缩食&#xff0c;终于也决定买了一块三星固态硬盘120G容量 这个固态硬盘拿在手里轻飘飘的&#xff0c; 好像里面什么东西都没有似的 废话少说&#xff0c;先上图 开机速度20秒左右 测…

大文件读写效率比较

之前做到一个大日志文件&#xff08;size > 1G&#xff09;解析的项目&#xff0c;在此记录下对于大文本解析方式的效率比较。不同方式的性能差别很大&#xff0c;那个项目的日志解析时间能从原来的超过36小时优化到只需要2分钟&#xff0c;awk功不可没。 bash 比较 bash脚本…

python装饰器执行顺序

2019独角兽企业重金招聘Python工程师标准>>> 1、单个装饰器执行 上来先看代码&#xff1a; import timedef deco(func):functools.wraps(func)def _wrapper():startTime time.time()print "start"func()print "end"endTime time.time()msecs …

tomcat限制用域名访问 禁止 ip访问

有时候会遇到服务器网站。只可以通过域名访问。而不允许ip访问。防止域名恶意解析&#xff0c;tomcat可以实现这个简单功能。1&#xff0c;禁止ip访问项目 2&#xff0c;只允许绑定域名访问环境&#xff1a;tomcat7 外网地址&#xff1a;114.113.100.166 域名&#xff1a;bi…

Object关于属性property的静态方法

Object.defineProperty Object.defineProperty(obj, prop, { value: undefined, enumerable: true, writable:true, get: function() {return value}, set: function(newValue) {value newValue;} }) 当时配置了set和get时&#xff0c;则不能配置value。 Object.getOwnPropert…

99. Recover Binary Search Tree

一、题目 1、审题 2、分析 给出一个二叉查找树&#xff0c;其中有两个元素的位置弄错了&#xff0c;写算法将其恢复。 二、解答 1、思路&#xff1a; 方法一、 通过中序遍历可以确定一棵二叉查找树由小到大的顺序。 所以在此错位的查找树中查找到的节点中有 1 个比后续节点值大…

myeclipse+git pull项目报错

2019独角兽企业重金招聘Python工程师标准>>> 1.在本地工程目录(.git)找到config文件&#xff1b; 2.修改config文件内容为&#xff1a; [core] repositoryformatversion 0 filemode false logallrefupdates true [branch "master"] remote origin m…

luoguP4755 Beautiful Pair

https://www.luogu.org/problemnew/show/P4755 考虑分治&#xff0c;在 [l, r] 区间中用线段树找到最大的一个点&#xff0c;处理经过它的可行数对的个数&#xff0c;统计个数可以离线树状数组处理 因为最多被分成 2n 个区间&#xff08;像线段树一样&#xff09;&#xff0c;对…

如何关掉macbook的开机声音

1、系统偏好设置->声音 2、关掉“启动时播放声音” 这样设置之后&#xff0c;macbook再开机就没有“咚”的那个声音了

oatdata结构详解

段名称 文件内偏移段大小ELF头部0x000000000x00001000oatdata0x000010000x027b8000oatexec0x027b90000x01ed69ecELF尾部0x046900000x00001000OatHeader&#xff1a; 0x00001000 | 6F 61 74 0A 30 33 39 00 77 40 00 B1 03 00 00 00 | 0x00001010 | 01 00 00 00 19 00 00 00 00…

【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...

(跃迁之路)专栏 实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己为实验对象。我将开源我的学习方法&#xff0c;方法不断…

开源 java CMS - FreeCMS2.6 Web页面信息采集

2019独角兽企业重金招聘Python工程师标准>>> java开源论坛系统http://javabbs.javaz.cn 项目地址&#xff1a;http://www.freeteam.cn/ Web页面信息采集 从FreeCMS 2.1开始支持 通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&…

PropertySource和ConfigurationProperties

https://blog.csdn.net/u013725455/article/details/79352459转载于:https://www.cnblogs.com/qunincey/p/9721364.html

ORACLE关于段的HEADER_BLOCK的一点浅析

在学习段&#xff08;segment&#xff09;、区间&#xff08;extent&#xff09;时&#xff0c;对段的HEADER_BLOCK有一些疑问&#xff0c;本文记录一下探究的实验过程以及相关总结&#xff0c;&#xff0c;如有不对的地方&#xff0c;敬请指出。以SCOTT.EMP表为例&#xff08;…

【源码探索】.NET中的List,为什么即有Count属性又有Count()方法

“优秀的程序员的标准之一是&#xff1a;编写更易于扩展的代码”图片&#xff1a;奥森公园的向日葵 拍摄于2022年7月23日01—问题缘起上一篇中&#xff0c;我们知道List<T>的是基于数组实现的可变长度的列表。很多小伙伴发现&#xff0c;List<T>即有Count属性又有C…

使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET

1、AdRotator广告控件的所有属性都是可选的&#xff0c;XML文件中可以包含如下表所示的属性&#xff08;XML文件的广告属性&#xff09;。 属性 说明 ImageUrl 要显示的图像的URL NavigateUrl 单击AdRotator控件时要转到的网页URL AlternateText 图像不可用时现实的问…

vim编辑和命令模式、实践

2019独角兽企业重金招聘Python工程师标准>>> 9月29日任务 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 Vim编辑模式 进入编辑模式 操作 说明 i 在光标所在字符前插入内容 I 在光标所在行行首插入内容 a 在光标所在字符后插入内容 A 在光标所在行行尾插入…

英语自动提取高频词_斑马英语提分营免费体验课

斑马英语电脑版是一款专业可靠的英语学习软件&#xff0c;斑马英语官方版可以帮助孩子学习纯正的英语口语发音&#xff0c;以讲故事的形式让孩子学习单词及口语练习&#xff0c;斑马英语电脑版针对儿童语言特征设计的智能口语测评系统&#xff0c;能够自动识别发音和评分&#…