package test;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class SnakeGame extends JFrame implements Runnable {
/**
*
*/
private static final long serialVersionUID = 1L;
//创建存放整个窗口坐标及其颜色的集合
private TreeMap<MyPoint, Color> tree;
//创建存放贪吃蛇坐标的集合
private LinkedList<MyPoint> list;
private MyPoint head;
private MyPoint foodPoint;
public final static int UP = 1;
public final static int DOWN = 2;
public final static int LEFT = -1;
public final static int RIGHT = -2;
private int direction;
public static void main(String[] args) {
new Thread(new SnakeGame()).start();
}
//控制贪吃蛇自动移动的线程
public void run() {
while (true) {
try {
Thread.sleep(400);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
move(direction);
}
}
//初始化显示窗口,贪吃蛇,食物及蛇移动方向
public SnakeGame() {
direction = RIGHT;
tree = new TreeMap<MyPoint, Color>();
list = new LinkedList<MyPoint>();
for (int x = 10; x < 400; x += 10) {
for (int y = 30; y < 420; y += 10) {
if (x == 10 || x == 390 || y == 30 || y == 410)
tree.put(new MyPoint(x, y), Color.BLACK);
else
tree.put(new MyPoint(x, y), Color.WHITE);
}
}
head = new MyPoint(200, 210);
MyPoint body1 = new MyPoint(190, 210);
MyPoint body2 = new MyPoint(180, 210);
list.add(0, head);
list.add(1, body1);
list.add(2, body2);
tree.put(head, Color.BLUE);
tree.put(body1, Color.GREEN);
tree.put(body2, Color.GREEN);
food();
//贪吃蛇手动控制处理
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
switch (ch) {
case 'w':
if (directionControl(UP))
break;
move(UP);
break;
case 's':
if (directionControl(DOWN))
break;
move(DOWN);
break;
case 'a':
if (directionControl(LEFT))
break;
move(LEFT);
break;
case 'd':
if (directionControl(RIGHT))
break;
move(RIGHT);
break;
}
}
});
setLocation(500, 150);
setSize(410, 430);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
//移动计算,注意声明为同步方法
private synchronized void move(int d) {
direction = d;
switch (direction) {
case UP:
list.addFirst(new MyPoint((int) head.getX(), (int) head.getY() - 10));
head = new MyPoint((int) head.getX(), (int) head.getY() - 10);
break;
case DOWN:
list.addFirst(new MyPoint((int) head.getX(), (int) head.getY() + 10));
head = new MyPoint((int) head.getX(), (int) head.getY() + 10);
break;
case LEFT:
list.addFirst(new MyPoint((int) head.getX() - 10, (int) head.getY()));
head = new MyPoint((int) head.getX() - 10, (int) head.getY());
break;
case RIGHT:
list.addFirst(new MyPoint((int) head.getX() + 10, (int) head.getY()));
head = new MyPoint((int) head.getX() + 10, (int) head.getY());
break;
}
gameOver();
isEatFood();
tree.put(list.getFirst(), Color.BLUE);
for (int i = 1; i < list.size(); i++) {
tree.put(list.get(i), Color.GREEN);
}
Graphics g = getGraphics();
paint(g);
}
//方向判断
private boolean directionControl(int d) {
if (direction * d <= 0)
return false;
else
return true;
}
//产生食物
private void food() {
int x = 0, y = 0;
boolean flag = true;
outer: while (true) {
Random r = new Random();
x = (r.nextInt(37) + 2) * 10;
y = (r.nextInt(37) + 4) * 10;
Iterator<MyPoint> it = list.iterator();
if (!flag) {
break outer;
}
inner: while (flag = it.hasNext()) {
MyPoint p = it.next();
if (x != p.getX() && y != p.getY())
continue inner;
}
}
foodPoint = new MyPoint(x, y);
tree.put(foodPoint, Color.RED);
}
//吃到食物处理
private void isEatFood() {
if (!(list.getFirst().equals(foodPoint))) {
tree.put(list.getLast(), Color.WHITE);
list.removeLast();
} else {
food();
}
}
//判断游戏是否结束
private void gameOver() {
for (int i = 1; i < list.size(); i++) {
if (list.getFirst().equals(list.get(i))) {
JOptionPane.showMessageDialog(null, "撞到自己了游戏结束", "提示信息",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
int x = (int) list.getFirst().getX();
int y = (int) list.getFirst().getY();
if (x == 10 | x == 390 || y == 30 || y == 410) {
JOptionPane.showMessageDialog(null, "撞到墙了游戏结束", "提示信息",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
//根据Map集合存储的坐标及对应的颜色绘图
public void paint(Graphics g) {
Set<Entry<MyPoint, Color>> entryTree = tree.entrySet();
Iterator<Entry<MyPoint, Color>> it = entryTree.iterator();
while (it.hasNext()) {
Entry<MyPoint, Color> entry = it.next();
MyPoint p = entry.getKey();
Color c = entry.getValue();
g.setColor(c);
g.fillRect((int) p.getX(), (int) p.getY(), 10, 10);
}
}
}
//自定义坐标类继承Comparable
class MyPoint extends Point implements Comparable<MyPoint> {
/**
*
*/
private static final long serialVersionUID = 1L;
public MyPoint(int x, int y) {
super(x, y);
}
public int compareTo(MyPoint point) {
if (this.equals(point))
return 0;
if ((int) this.getX() != (int) point.getX()) {
return (int) this.getX() - (int) point.getX();
} else {
return (int) this.getY() - (int) point.getY();
}
}
}
分享到:
相关推荐
一个自己用java实现的贪吃蛇 因为没有美工丑了一点 适合新手 大神就绕道吧 不要喷了 自己配置好java环境双击打开就可以了 要看源代码 解压就可以 新手可以留言加个还有讨论
通过阅读和理解这个简单的贪吃蛇源码,初学者可以深入学习Java语法、面向对象编程以及Swing组件的使用。同时,源码中的注释可以帮助理解代码的工作原理。如果遇到问题,可以通过调试工具逐行执行,观察变量的变化,...
【简易贪吃蛇】是一款基于Android平台开发的经典游戏,它以简单的编程逻辑和直观的游戏界面重现了经典的贪吃蛇玩法。在这个项目中,开发者通过Java语言实现了游戏的主要功能,包括蛇的移动、食物生成、碰撞检测以及...
【标题】"java贪吃蛇简易好用版" 涉及的知识点主要集中在Java编程语言上,特别是针对Java Standard Edition(J2SE)的基础应用。这个项目是使用Java实现的一个经典游戏——贪吃蛇,这为我们提供了一个学习和理解Java...
java代码实现,无需其他库文件引用。简单易上手,有相关搭建步骤,实现从0到1完整步骤内容展示。Swing库基础内容,包括开发思路信息。博客地址:https://blog.csdn.net/weixin_42378614/article/details/137212624。...
一个由eclipse下写的贪吃蛇程序.界面还算可以,大小是1000*1000px,蛇的头部和身体可以设置颜色,可以设置背景颜色,可以设置网格线和网格线颜色,可以设置周围石块颜色,可以设置食物颜色,可以设置贪吃蛇速度,计分板功能...
这是一个使用Java编写的简易贪吃蛇游戏项目。该资源包含了完整的源代码和必要的资源文件,适合初学者学习和理解Java编程基础以及游戏开发的基本原理。在这个项目中,玩家通过键盘控制贪吃蛇移动的方向,目标是吃掉...
在《传智播客_贪吃蛇游戏程序与API包》中,很可能包含了完整的源代码和相关API文档,可以帮助学习者理解和实现贪吃蛇游戏。通过阅读和分析这些代码,你可以更好地掌握游戏开发中的关键概念和技术,同时也能提升自己...
【标题】:“java版本 简单贪吃蛇” 这个项目是基于Java编程语言实现的一个经典游戏——贪吃蛇。贪吃蛇游戏以其简单而趣味性强的特点,深受程序员和游戏爱好者的喜爱,作为编程学习中的一个实践案例,它能够帮助...
【Java贪吃蛇课程设计】是一门以Java编程语言为基础,教授学生如何开发经典小游戏——贪吃蛇的实践性教学项目。在这个课程设计中,学生将深入理解面向对象编程的概念,掌握事件处理、图形用户界面(GUI)设计以及...
【Java贪吃蛇游戏程序设计】是一个典型的计算机编程项目,主要使用Java语言实现。这个程序设计涉及到了多个关键的编程概念和技术,对于学习和理解Java编程以及游戏开发有着重要的实践意义。下面将详细阐述其中涉及的...
java小项目-贪吃蛇简易版源码,附带可执行jar文件(点击可直接运行)、这是自己刚学java时做的一个小项目,主要运用图形界面、线程知识点,代码都是自己一行一行码上去,界面有点丑,但是背景什么的可以自己更换,如有...
老师写的小程序,相关远代码什么的都有 简单易懂,供基础人学习
Java贪吃蛇是一款基于Java编程语言开发的简易游戏,它利用Java Swing库来构建用户界面。Swing是Java提供的一个轻量级组件库,用于创建桌面应用程序,提供了丰富的组件和功能,使得开发者可以方便地构建图形用户界面...
### 使用Java编写的简易贪食蛇游戏解析 #### 游戏概述 本篇文章将深入解析一个基于Java语言编写的简易贪食蛇游戏。该程序利用了Java AWT库中的类来构建界面,并通过多线程技术实现了蛇的移动以及与食物的交互。玩家...
【Java 贪吃蛇游戏源码】是一个典型的基于JAVA编程语言实现的简易版贪吃蛇游戏项目。这个游戏是许多初级或中级Java开发者用来学习面向对象编程、事件处理、图形用户界面(GUI)设计以及游戏逻辑实现的常见案例。下面...
Java 编写简易贪吃蛇游戏 本文主要向大家详细介绍了 Java 编写简易贪吃蛇游戏的实现过程。通过对游戏的代码分析和实例分享,读者可以学习到 Java 编写游戏的基本思路和方法。 游戏概述 贪吃蛇游戏是一种经典的...
在本文中,我们将深入探讨如何实现一个简单的Java版本的贪吃蛇游戏,基于提供的标题“贪吃蛇java源代码”和描述“简易java版贪吃蛇,实现了贪吃蛇的移动,吃到墙壁,吃到自己死亡”。贪吃蛇游戏是一款经典的电子游戏...