import java.awt.Button;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class HungrySnake extends JPanel implements Runnable {
class Point {
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
private HungrySnake getOuterType() {
return HungrySnake.this;
}
}
Button[][] buttonArray = new Button[20][20];
LinkedList<Point> snake = new LinkedList<Point>();
Direction currentDirection = Direction.up;
boolean pause = true;
Point food = new Point(8,
;
private void init() {
GridLayout gl = new GridLayout(20, 20);
this.setLayout(gl);
for (int i = 0; i < buttonArray.length; i++) {
for (int j = 0; j < buttonArray[i].length; j++) {
Button bt = new Button();
bt.setEnabled(false);
buttonArray[i][j] = bt;
bt.setLabel(i + "" + j);
bt.setBackground(Color.BLUE);
this.add(bt);
}
}
snake.add(new Point(5, 5));
this.setVisible(true);
this.setBackground(Color.gray);
}
public void setPause(boolean b) {
pause = b;
}
public Direction getDirection() {
return currentDirection;
}
public void setDirection(Direction d) {
currentDirection = d;
}
public HungrySnake() {
init();
}
public enum Direction {
up, down, right, left;
}
private void paintSnake() {
for (int i = 0; i < buttonArray.length; i++) {
for (int j = 0; j < buttonArray[i].length; j++) {
buttonArray[i][j].setBackground(Color.gray);
}
}
for (Point snakePoint : snake) {
buttonArray[snakePoint.x][snakePoint.y].setBackground(Color.WHITE);
}
buttonArray[food.x][food.y].setBackground(Color.ORANGE);
}
public void restart() {
snake.clear();
snake.add(new Point(5, 5));
currentDirection = Direction.up;
food = new Point(8,
;
paintSnake();
pause = true;
}
private void moveSnake() {
Point first = snake.getFirst();
// Point last = snake.getLast();
Point newPoint = new Point(first.x, first.y);
if (currentDirection == Direction.up) {
newPoint.x = first.x - 1;
}
if (currentDirection == Direction.down) {
newPoint.x = first.x + 1;
}
if (currentDirection == Direction.left) {
newPoint.y = first.y - 1;
}
if (currentDirection == Direction.right) {
newPoint.y = first.y + 1;
}
// out of field or touch itself
if (newPoint.x < 0 || newPoint.x > buttonArray.length || newPoint.y < 0 || newPoint.y > buttonArray.length || snake.contains(newPoint)) {
JOptionPane.showMessageDialog(this.getParent(), "总共吃了"+(snake.size()-1)+"个食物,"+"任务失败,重新开始!", "Failed", JOptionPane.ERROR_MESSAGE);
restart();
}
else {
// eat food
if (newPoint.x == food.x && newPoint.y == food.y) {
eatFood();
}
// only move
else {
snake.removeLast();
snake.addFirst(newPoint);
}
paintSnake();
}
}
private void eatFood() {
snake.addFirst(food);
genFood();
}
private void genFood() {
while (true) {
Random random = new Random();
int x = random.nextInt(9);
int y = random.nextInt(9);
Point genPoint = new Point(x, y);
if (snake.contains(genPoint)) {
continue;
} else {
food = genPoint;
break;
}
}
}
public void run() {
paintSnake();
while (true) {
if (pause == false) {
moveSnake();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
final HungrySnake hs = new HungrySnake();
frame.add(hs);
frame.setTitle("Hungry Snake");
frame.setBounds(100, 100, 800, 800);
frame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
if(hs.getDirection() != Direction.down)
hs.setDirection(Direction.up);
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
if(hs.getDirection() != Direction.up)
hs.setDirection(Direction.down);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
if(hs.getDirection() != Direction.left)
hs.setDirection(Direction.right);
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
if(hs.getDirection() != Direction.right)
hs.setDirection(Direction.left);
}
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
hs.setPause(!hs.pause);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
frame.show();
JOptionPane.showMessageDialog(frame, "按空格键开始或暂停。游戏规则很简单,不能碰边,不能碰自己,用方向键控制蛇前进方向。", "Start",JOptionPane.INFORMATION_MESSAGE);
Thread t = new Thread(hs);
t.start();
}
}
分享到:
相关推荐
《C语言实现简易贪食蛇》 贪食蛇是一款经典的电子游戏,它的基本玩法是控制一个不断移动的小蛇,通过吃食物来增长身体长度。在C语言中实现这款游戏,可以帮助初学者更好地理解程序设计的基本原理,包括循环、条件...
在这个“简易贪食蛇游戏”中,我们主要关注的是游戏的基本结构和实现方式。 首先,我们要了解贪食蛇游戏的基本原理。游戏的核心是一个二维网格,蛇在其中移动,吃食物并增长。当蛇头碰到自己的身体或游戏边界时,...
**MFC简单贪食蛇详解** MFC(Microsoft Foundation Classes)是微软开发的一个C++类库,用于构建Windows应用程序。它提供了对Windows API的封装,使得开发者能够更方便地使用面向对象的方式进行Windows编程。本篇...
"Protues 7.6仿真的430 + LCD 简易贪食蛇c源码" 这个标题揭示了我们将会讨论一个基于Microchip的MSP430微控制器的项目,该项目使用了Protues 7.6仿真软件进行模拟。"LCD"指的是液晶显示器,它是显示贪食蛇游戏画面的...
QT简易贪食蛇是一款基于QT框架开发的简单游戏,展示了QT在图形用户界面(GUI)编程中的应用。QT是一个跨平台的C++库,用于创建桌面、移动和嵌入式应用程序。它提供了丰富的API,使得开发者可以快速构建功能丰富的、...
该程序是用MFC实现的简易贪食蛇游戏, 算法简单易懂,适合初学者学习参考。 snake2在snake1的基础上作了很大的改进: 1、增加了背景音乐 该背景音乐利用了多线程的知识,新建了一个线程与主线程并行执行,所以背景...
《汇编语言编写的简易贪食蛇游戏》 在计算机科学的世界里,汇编语言是一种低级编程语言,它直接对应于计算机硬件的指令集。本项目以汇编语言为工具,开发了一款简易版的贪食蛇游戏,充分展示了汇编语言在控制硬件和...
**VC MFC实现的简单贪食蛇** 在计算机编程领域,VC++(Visual C++)是一种集成开发环境,由微软公司推出,用于编写C++语言的程序。MFC(Microsoft Foundation Classes)是微软为简化Windows应用程序开发而创建的一...
【基于MFC的简易贪食蛇程序源码】是一个典型的Windows桌面应用程序开发示例,它利用Microsoft Foundation Classes (MFC)库来实现。MFC是微软提供的一个C++类库,用于简化Windows API的使用,使得开发者能更容易地...
【C# 简单贪食蛇程序包】是一个基于C#编程语言开发的经典游戏——贪食蛇的实现。这个游戏的开发涉及到多个重要的C#编程和计算机图形学的知识点,让我们一起深入探讨。 首先,我们要了解C#的基础语法和面向对象编程...
【简易贪食蛇游戏机设计】 简易贪食蛇游戏机是一种基于数字电路与VHDL语言设计的实验项目,旨在帮助学习者掌握VHDL编程语言和EDA工具的使用,理解状态机的设计原理,以及体验自顶向下的设计方法。在本试验中,主要...
### 使用Java编写的简易贪食蛇游戏解析 #### 游戏概述 本篇文章将深入解析一个基于Java语言编写的简易贪食蛇游戏。该程序利用了Java AWT库中的类来构建界面,并通过多线程技术实现了蛇的移动以及与食物的交互。玩家...
【标题】"用C#写的简单贪食蛇"是一个基于C#编程语言开发的简易游戏项目,主要展示了如何利用C#的基本语法和面向对象编程(OOP)思想来实现经典的游戏——贪食蛇。这个项目对于初学者来说,是学习C#语言和理解OOP概念...
《使用Java编写的简单贪食蛇小游戏》 贪食蛇游戏是一款经典的电子游戏,它以其简单易懂的规则和无尽的游戏模式深受玩家喜爱。在Java编程语言中实现这款游戏,可以为初学者提供一个很好的实践平台,同时也适合作为...
在本项目中,"C++实现(基本是c实现)简单贪食蛇dos版本" 是一个基于DOS操作系统开发的简单游戏程序。虽然标题提到C++,但根据描述,代码可能更多地采用了C语言的风格,因为DOS环境通常与C语言更为兼容,而C++的某些...
### 使用Java实现简单贪食蛇游戏 #### 功能简介 贪食蛇游戏是经典的游戏之一,本项目使用Java语言实现了其基本功能,并增加了一些特色功能,使得游戏更加有趣且具有一定的挑战性。 - **加速与减速**:玩家可以...
【贪食蛇游戏简介】 贪食蛇是一款经典的电子游戏,起源于1976年的“Blockade”,后来在诺基亚手机上广为人知。在这个游戏中,玩家控制一条不断增长的蛇,目标是吃到食物,每次吃到食物后,蛇的长度会增加。如果蛇头...
【C++版贪食蛇】是一款基于MFC(Microsoft Foundation Classes)框架开发的简单游戏,其核心机制是利用双向链表来实现蛇的身体结构。在本文中,我们将深入探讨这款游戏的实现原理,以及如何利用C++和双向链表来创建...
总的来说,这个简单的贪食蛇游戏展示了JavaScript的实时更新能力、HTML的结构化描述和CSS的美化效果。开发者通过这三个技术的结合,创造出一个互动性强、用户体验良好的小游戏。对于学习JavaScript的初学者,这是一...