package SnakeControl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Random;
import java.util.Set;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import Map.Map;
import Snake.Snake;
import SnakeSetUp.SetUp;
public class SnakeControl extends JPanel implements Runnable, KeyListener,
ActionListener {
/**
*
*/
private static final long serialVersionUID = 2784000245943878227L;
// 计数器
int fenshu = 0;
int jibie = 1;
// 游戏时间
public static int mTime = 0;
public static int MTime = 0;
// 游戏状态
String condition = "关";
// 集合管理蛇身
LinkedList<Snake> lkl = new LinkedList<Snake>();
// 集合管理地图
LinkedList<Map> lklm = new LinkedList<Map>();
// 蛇身长度
int Length = 0;
// 创建Snake的引用
Snake sk;
// 创建蛇的线程的引用
Thread t1, t2;
TimePanel tp;
// 创建地图的引用
Map m;
// 定义一个开关
boolean start = false;
boolean start2 = false;
// 蛇死亡的标志
boolean isLive = true;
// 生成随机食物
Random rd = new Random();
int rx = 0;
int ry = 0;
// 弹窗结束
JDialog dg;
// 游戏整体速度
int speed = 0;
// logo动态
String str = null;
int changeLenth = 0;
// 定义方向 (1上 -1下 2左 -2右)
public final int up = 1;
public final int down = -1;
public final int left = 2;
public final int right = -2;
private int dircetion;
public int tempDircetion = 0;
// 特殊奖励
int bfx = 0;
int bfy = 0;
int bf = 0;
boolean bfTemp = false;
int bfTime = 60;
Image im = null;
int apples = 0;
//定义颜色
private Color color=null;
//游戏设置
SetUp su;
// 定义需要的组件
JButton jb_Start;
JButton jb_Sotp;
JButton jb_newGame;
JButton jb_RanMap;
JButton jb_default;
JButton jb_Ok;
JButton jb_setUp;
int h;
public SnakeControl(int h){
this.h=h;
}
public SnakeControl() {
color=new Color(255, 0, 0);
su=new SetUp();
su.setVisible(false);
// 创建Snake的对象
sk = new Snake(40, 30);
tp = new TimePanel();
// 创建Map对象
m = new Map(5, 5);
// 初始化LOGO
str = "贪 吃 蛇 ";
jb_newGame = new JButton("新游戏");
jb_newGame.addActionListener(this);
jb_newGame.setFont(new Font(null, 0, 13));
jb_newGame.setBounds(5, 315, 90, 25);
jb_newGame.setBackground(Color.yellow);
jb_Sotp = new JButton("暂停游戏");
jb_Sotp.setFont(new Font(null, 0, 13));
jb_Sotp.setBounds(109, 315, 90, 25);
jb_Sotp.setBackground(Color.yellow);
jb_Sotp.addActionListener(this);
jb_Sotp.setEnabled(false);
jb_Start = new JButton("继续游戏");
jb_Start.setFont(new Font(null, 0, 13));
jb_Start.setBounds(212, 315, 90, 25);
jb_Start.setBackground(Color.yellow);
jb_Start.setEnabled(false);
jb_Start.addActionListener(this);
jb_setUp = new JButton("游戏设置");
jb_setUp.setFont(new Font(null, 0, 13));
jb_setUp.setBounds(316, 315, 90, 25);
jb_setUp.setBackground(Color.yellow);
jb_setUp.addActionListener(this);
jb_RanMap = new JButton("加载第一张地图");
jb_RanMap.setFont(new Font(null, 0, 13));
jb_RanMap.setBounds(410, 315, 165, 25);
jb_RanMap.setBackground(Color.gray);
jb_RanMap.addActionListener(this);
jb_default = new JButton("加载默认的地图");
jb_default.setFont(new Font(null, 0, 13));
jb_default.setBounds(410, 315, 165, 25);
jb_default.setVisible(false);
jb_default.setBackground(Color.LIGHT_GRAY);
jb_default.addActionListener(this);
jb_Ok = new JButton("确定");
jb_Ok.addActionListener(this);
// 注册监听
this.addKeyListener(this);
this.add(jb_default);
this.add(jb_RanMap);
this.add(jb_Start);
this.add(jb_newGame);
this.add(jb_Sotp);
this.add(jb_setUp);
this.setFocusable(true);
this.setLayout(null);
this.setSize(590, 450);
this.setVisible(true);
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public void paint(Graphics g) {
super.paint(g);
// 画出范围
g.drawRect(this.getX() + 5, this.getY() + 5, 400, 300);
// 画出属性框
g.setColor(Color.gray);
g.fillRect(this.getX() + 410, this.getY() + 5, 165, 301);
// 画出计算器
g.setColor(Color.white);
g.setFont(new Font(null, 0, 13));
g.drawString("分数:" + fenshu, this.getX() + 420, this.getY() + 25);
g.drawString("级别:" + jibie, this.getX() + 420, this.getY() + 50);
g.drawString("蛇身长度:" + Length, this.getX() + 420, this.getY() + 75);
g.drawString("游戏用时:", this.getX() + 420, this.getY() + 100);
g.drawString(MTime + " 分", this.getX() + 485, this.getY() + 100);
g.drawString(mTime + " 秒", this.getX() + 519, this.getY() + 100);
g.drawString("游戏状态:", this.getX() + 420, this.getY() + 125);
g.drawString("" + condition, this.getX() + 485, this.getY() + 125);
g.setColor(Color.orange);
g.drawString("特殊奖励:", this.getX() + 420, this.getY() + 148);
g.drawRect(this.getX() + 487, this.getY() + 138, bfTime - 2, 10);
try {
im = ImageIO.read(new File("image//apple.png"));
} catch (IOException e) {
e.printStackTrace();
}
g.drawImage(im, this.getX() + 421, this.getY() + 158, 15, 15, this);
g.setColor(Color.white);
g.drawString("x " + apples, this.getX() + 440, this.getY() + 170);
// 画出logo
g.setColor(Color.pink);
g.setFont(new Font(null, 1, 20));
g.drawString(str.substring(0, changeLenth), this.getX() + 435,
this.getY() + 250);
// 分割线
g.setColor(Color.white);
g.drawLine(this.getX() + 410, this.getY() + 180, this.getX() + 575,
this.getY() + 180);
// 画出蛇
if (start == true) {
condition = "游戏ing...";
g.setColor(Color.blue);
for (int i = 0; i < lkl.size() - 1; i++) {
int temp = 10;
if (lkl.size() == temp) {
g.setColor(new Color(255, 50, 70));
temp = Length + 10;
}
try {
Image img = ImageIO.read(new File("image//bigfoot.png"));
g.drawImage(img, 5 + lkl.get(0).getX() * 10, 5 + lkl.get(0)
.getY() * 10, 10, 10, this);
} catch (IOException e) {
e.printStackTrace();
}
g.setColor(su.getColor());
g.fill3DRect(5 + lkl.get(i + 1).getX() * 10, 5 + lkl.get(i + 1)
.getY() * 10, 10, 10, false);
}
Length = lkl.size();
// 画出随机食物
g.setColor(Color.green);
g.fill3DRect(5 + rx * 10, 5 + ry * 10, 10, 10, false);
// 画出大食物
if (bfTemp) {
g.drawImage(im, 5 + bfx * 10, 5 + bfy * 10, 10, 10, this);
}
}
// 花随机地图
if (start2 == true) {
for (Map ms : lklm) {
g.setColor(Color.gray);
g.fill3DRect(5 + ms.getX() * 10, 5 + ms.getY() * 10, 10, 10,
false);
}
}
}
// 判断方向
public void changeDircetion(int dircetion) {
if (!(dircetion + this.dircetion == 0)) {
this.dircetion = dircetion;
}
}
// 初始化蛇身
public void init() {
int x = sk.getX() / 2;
int y = sk.getY() / 2;
for (int i = 0; i < 3; i++) {
lkl.add(new Snake(x--, y));
}
dircetion = left;
tempDircetion = 2;
System.out.println("集合添加3个蛇块成功!");
}
// 蛇的移动方法
public void move() {
lkl.removeLast();
int mx = lkl.getFirst().getX();
int my = lkl.getFirst().getY();
switch (dircetion) {
case up:
my--;
break;
case down:
my++;
break;
case left:
mx++;
break;
case right:
mx--;
break;
}
Snake newHend = new Snake(mx, my);
lkl.addFirst(newHend);
}
@Override
public void run() {
int temp = 50;
speed = 200;
while (start == true) {
switch (dircetion) {
case up:
move();
d
tcs.zip_java tcs
版权申诉
70 浏览量
2022-09-19
20:49:00
上传
评论
收藏 41KB ZIP 举报
刘良运
- 粉丝: 67
- 资源: 1万+
最新资源
- python代码案例详解-旅行商问题的多种求解算法.zip
- springcloud.rar
- 一键清理maven项目依赖下载失败生成的.lastUpdated文件, 以及解决无法连接远程仓库导致本地依赖找不到的批处理脚本
- C#+WPF开发IOC框架实战架构师课程
- 《JAVA WEB项目开发案例精粹》中的代码案例源文件(超全).rar
- 背景music,用作业网轮地址
- comment_6e56cd5d6e140046ef1cd248910ea5ca.png
- 基于卷积神经网络的自动驾驶系统的设计与实现
- MySQL的执行原理-2.md
- 基于 FCN 网络对无人机俯拍下的生活场景语义分割(12类别)【包含数据集、完整代码、训练好的结果、权重文件等等】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0