package snack;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
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;
/**
* 贪吃蛇
*
* @author anduo
*
*/
public class Snack extends JFrame implements KeyListener, Runnable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int WIDTH = 20;
private static final int HEIGHT = 20;
private static final int SIZE = 20;
/**
* UP和DOWN是偶数,RIGHT和LEFT是奇数
*/
private static final int UP = 2;
private static final int DOWN = 4;
private static final int LEFT = 1;
private static final int RIGHT = 3;
private int direction = 1;
// 线程的休眠时间
private int time = 300;
// 一个linkedlist用于储存蛇节点
private LinkedList<Point> snack = new LinkedList<Point>();
// 食物节点
private static Point food = new Point();
Random rand = new Random();
public Snack()
{
// 初始化蛇身
int x = WIDTH / 2;
int y = HEIGHT / 2;
for (int i = 0; i < 3; i++)
{
Point p = new Point();
p.x = x++;
p.y = y;
snack.add(p);
}
// 初始化食物
food.x = rand.nextInt(18) + 1;
food.y = rand.nextInt(17) + 2;
setTitle("贪吃蛇");
this.addKeyListener(this);
setDefaultCloseOperation(3);
setBounds(getToolkit().getScreenSize().width / 2 - 150, getToolkit()
.getScreenSize().height / 2 - 150, 450, 460);
this.repaint();
setVisible(true);
}
/**
* 重写print方法
*/
public void paint(Graphics g)
{
// 绘制界面
// g.fill3DRect(0, 0, this.getWidth(), this.getHeight(), true);
g.setColor(Color.green);
for (int i = 0; i < WIDTH; i++)
{// 绘制了400个方格,背景
for (int j = 0; j < HEIGHT; j++)
{
g.fill3DRect(i * SIZE + 20, j * SIZE + 40, SIZE, SIZE, true);
}
}
// 绘制 蛇
g.setColor(Color.red);
for (Point p : snack)
{
g.fillRect(p.x * SIZE, p.y * SIZE, SIZE, SIZE);
}
// 绘制食物
g.setColor(Color.black);
g.fill3DRect(food.x * SIZE, food.y * SIZE, SIZE, SIZE, true);
}
/**
* 把蛇头跟蛇身的其他所有节点比较,如果相同,就死掉,否则不死
*
* @return
*/
public boolean isDead()
{
boolean dead = false;
Point head = snack.getFirst();
for (int i = 1; i < snack.size(); i++)
{
if (head.equals(snack.get(i)))
{
dead = true;
}
}
return dead;
}
/**
* 构造一个新的蛇 添加一个蛇头,然后删除蛇尾
*
* @param direction
*/
private void move(int direction)
{
// if ((newDirection + this.direction) == 0)
// {
// }
Point p = snack.getFirst();
int x = p.x;
int y = p.y;
switch (direction)
{
// 到达顶端时,从最下方出来;
// 到达底端时,从最上方出来;
// 到达左端时,从最右方出来;
// 到达右端时,从最左方出来;
case UP:
y--;
if (y == 1)
y = 21;
break;
case DOWN:
y++;
if (y == 22)
y = 2;
break;
case LEFT:
x--;
if (x == 0)
x = 20;
break;
case RIGHT:
x++;
if (x == 21)
x = 1;
break;
}
if (this.isDead())
{
JOptionPane.showConfirmDialog(this, "GAME OVER!");
System.exit(0);
}
// 如果蛇不出界,构造新蛇
if (x < WIDTH + 1 && y < HEIGHT + 2 && x >= 1 && y >= 2)
{
p = new Point(x, y);
if (p.equals(food))
{// 吃食物,然后把食物点加为头结点
while (true)
{// 让食物不出现在蛇的身上
food.x = rand.nextInt(18) + 1;
food.y = rand.nextInt(17) + 2;
if (!snack.contains(food))
break;
}
snack.add(food);
time -= 10;
}
snack.addFirst(p);
snack.removeLast();
this.repaint();
}
}
/**
* 改变蛇的行进方向
*
* @param newDirection
*/
public void changeDirection(int newDirection)
{
if (this.direction % 2 != newDirection % 2)// 避免冲突
{
this.direction = newDirection;
}
}
/**
* 从键盘获取UP、DOWN、LEFT、RIGHT 调用move方法处理蛇的移动
*/
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
switch (code)
{
case KeyEvent.VK_UP:
this.changeDirection(UP);
break;
case KeyEvent.VK_DOWN:
this.changeDirection(DOWN);
break;
case KeyEvent.VK_LEFT:
this.changeDirection(LEFT);
break;
case KeyEvent.VK_RIGHT:
this.changeDirection(RIGHT);
break;
}
}
/**
* 线程方法,用一个while循环线程时间,让蛇可以按指定方向自动行走
*/
public void run()
{
while (true)
{
try
{
Thread.sleep(time);
this.move(this.direction);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
new Thread(new Snack()).start();
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}
}
- 大小: 9.4 KB
- 大小: 11.1 KB
分享到:
相关推荐
要不就自己客户端约定好,特殊的字符串表示特殊操作,比如下面小明要举个例子: 有两个客户端A、B,客户端都是一模一样的,里面资源实现存放好10张图片,并且约定:发送消息为“@”的时候,这个字符串后边会跟着一...
在本篇文章中,我们将深入探讨如何在Java Swing应用程序中使用DatePicker,以及相关的实现方法。 一、JCalendar库的使用 1. 添加依赖:为了在Swing应用中使用DatePicker,可以引入JCalendar库,这是一个包含日期...
1class weiqiang//围墙类 ,这个类中的数据包括一个二维数组(这个数组要记录蛇身,食物,及围墙的位置),且这个类中的数据都为公用的(这样做的目的是为了让后边其它类中的函数可以直接访问),该类中包含两个函数...
Java 操作 Solr 实现查询功能的实例 Solr 是一个基于 Lucene 的搜索服务器,提供了强大的搜索功能。Java 操作 Solr 可以实现高效的查询功能,本文将介绍一个 Java 操作 Solr 实现查询功能的实例。 Solr 查询方法 ...
1. **Java基础**:理解面向对象编程的基本概念,如类、对象、继承、封装和多态。 2. **图形用户界面(GUI)设计**:使用Java的Swing或JavaFX库创建游戏界面,包括棋盘的绘制、棋子的放置等。 3. **事件处理**:监听...
Java 实现调用 Jython 执行 Python 文件的方法 本文主要介绍了 Java 实现调用 Jython 执行 Python 文件的方法,结合实例形式分析了 Java 调用 Jython 执行 Python 文件的常见操作技巧及相关问题解决方法。 Title ...
修改 set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_172 后边路径为自己的jdk安装路径,双击运行即可实现java环境变量的配置
在Java开发中,处理Excel文件是一项常见...综上所述,Java处理Excel文件上传和模板操作涉及到Web开发、文件读写、数据处理等多个方面,通过熟练掌握Apache POI库和相关的编程技巧,可以高效地实现各种复杂的Excel功能。
该游戏为扫雷小游戏,已经实现类似电脑的扫雷基本功能。 扫雷游戏操作主要用鼠标操作,可以使用左键,右键和左右键同时按下,一般是开始时是从四个角先用左键点开,这样的话在游戏后期的不容易被四个角卡死。 游戏中...
4. JAVA语言的发展:JAVA语言最初是面向Internet应用程序设计的。 5. JDK版本:最新的JDK版本是Java SE 15。 6. 编译命令:使用javac命令可以将java源文件编译生成字节码文件/类文件/class文件。 7. 运行命令:使用...
java常用类的讲解,这些类是javase 以及后边的javaee中的常用的java类,是学习java的基础。
在软件实现中,可以使用软件来实现CRC算法,例如使用C语言或Java语言来实现CRC算法。 在CRC算法实现中,需要了解生成多项式的概念。生成多项式是指在CRC算法中用来产生CRC码的多项式。例如,CRC-ITU的生成多项式为...
Java 语言作为一门广泛使用的面向对象的编程语言,其语法严谨且强大,尤其在流程控制方面提供了丰富的结构。本教学单元主要围绕Java的运算符和分支语句展开,旨在帮助学生掌握基本的Java编程技能。 首先,Java...
2 面向对象的编程思维 32 三 包 33 四 Java Doc注释 35 第八章 数组 37 一 数组: 37 二 描述数组: 38 三 使用数组的步骤: 38 四 排序: 40 五 冒泡排序: 41 第九章 字符串 42 一 定义字符串 42 二 如何...
JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是指任何有能力...
在微信小程序中实现滑动放大缩小效果主要依赖于swiper组件,这是微信小程序中一个用于轮播展示图片或者其他内容的组件。通过合理配置swiper组件的属性和绑定事件,可以实现用户在滑动时图片放大缩小的交互效果。 ...
在C#编程中,多线程是实现并发执行任务的关键技术。当一个线程执行完毕后,有时我们需要在主线程中获取线程的结果或者进行一些后续处理,这就需要用到委托和回调函数。本篇将深入探讨如何在C#中实现线程结束后的委托...
1.1 C++面向对象特性 1 实例1:实现C++类的多重继承 1 实例2:使用虚函数实现运行时多态 3 实例3:使用操作符重载实现编译多态——复数的加法运算 6 实例4:使用函数模板实现不同数据类型的极值函数 7 . . . ...
1.1 C++面向对象特性 1 实例1:实现C++类的多重继承 1 实例2:使用虚函数实现运行时多态 3 实例3:使用操作符重载实现编译多态——复数的加法运算 6 实例4:使用函数模板实现不同数据类型的极值函数 7 . . . ...