package snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;
public class SnakePanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
File highscorefile = new File("highscore");
Random r = new Random();
int a = r.nextInt(34)*25 + 25;
int b = r.nextInt(24)*25 + 75;
//生成食物对象
private Food newfood = new Food(a,b);
// 加载蛇头图片
ImageIcon up = new ImageIcon("up.jpg");
ImageIcon down = new ImageIcon("down.jpg");
ImageIcon left = new ImageIcon("left.jpg");
ImageIcon right = new ImageIcon("right.jpg");
// 加载其他图片
ImageIcon title = new ImageIcon("title.png");
ImageIcon food = new ImageIcon("food.png");
ImageIcon body = new ImageIcon("body.png");
ImageIcon wall = new ImageIcon("wall.png");
// 蛇的结构设计
static int[] snakex = new int[750];
static int[] snakey = new int[750];
static int len = 3;
static String direction = "R"; // R右 L左 U上 D下
// 游戏是否开始的标志
boolean isStarted = false;
// 游戏是否失败的标志
boolean isFaild = false;
//设置游戏障碍物的开关,默认为关
public static boolean condition = false;
public static boolean conditionUp = false;
// 设置游戏默认速度和困难等级
static int initialspeed = 200;
static int level = 1;
static int HighScore = 0;
//设置地图虫洞开
public static void setConditionUpOpen() {
conditionUp = true;
}
//设置地图虫洞关
public static void setConditionUpClose() {
conditionUp = false;
}
//设置地图障碍物开
public static void setConditionOpen() {
condition = true;
}
//设置地图障碍物关
public static void setConditionClose() {
condition = false;
}
//记录高分
public void rememberHighScore(int newscore){
if(HighScore<newscore)
HighScore = newscore;
}
//生成障碍物的方法
public void drawBarrier(Graphics g) {
for(int i=10;i<21;i++) {
g.setColor(Color.WHITE);
g.fillRect(10*25, i*25, 25, 25);
}
for(int i=10;i<21;i++) {
g.setColor(Color.WHITE);
g.fillRect(24*25, i*25, 25, 25);
}
}
//
//生产虫洞的方法
public void drawBarrierUp(Graphics g) {
g.setColor(Color.red);
g.fillRect(5*25, 5*25, 25, 25);
g.setColor(Color.red);
g.fillRect(5*25, 6*25, 25, 25);
g.setColor(Color.red);
g.fillRect(5*25, 7*25, 25, 25);
g.setColor(Color.red);
g.fillRect(30*25, 20*25, 25, 25);
g.setColor(Color.red);
g.fillRect(30*25, 19*25, 25, 25);
g.setColor(Color.red);
g.fillRect(30*25, 18*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(5*25, 20*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(5*25, 19*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(5*25, 18*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(30*25, 5*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(30*25, 6*25, 25, 25);
g.setColor(Color.yellow);
g.fillRect(30*25, 7*25, 25, 25);
}
//设置游戏难度
public static void setInitialSpeed(int newspeed) {
initialspeed = newspeed;
}
// 设置定时器的时长 进行actionPerformed()的方法
Timer timer = new Timer(initialspeed, this);
// Timer(delay, listener)
// delay 毫秒后执行 listener
// 分数统计
static int score = 0;
public SnakePanel() {
setFocusable(true); // 获取焦点进行操作
initSnake(); // 放置静态初始化的蛇
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if( keyCode == KeyEvent.VK_SPACE ) {
if( isFaild ) {
initialspeed = 200; //初始化游戏速度
initSnake(); // 游戏失败 重新开始
}
else{
isStarted = !isStarted; // 切换游戏状态 继续/暂停
}
repaint();
}
// 蛇头方向的改变
else if( keyCode == KeyEvent.VK_UP && !direction.equals("D")) {
direction = "U";
}
else if( keyCode == KeyEvent.VK_DOWN && !direction.equals("U")) {
direction = "D";
}
else if( keyCode == KeyEvent.VK_LEFT && !direction.equals("R")) {
direction = "L";
}
else if( keyCode == KeyEvent.VK_RIGHT && !direction.equals("L")) {
direction = "R";
}
}
});
}
public static void setScore() {
score = 0;
}
//添加设置蛇长方法
public static void setSnakeLength(int length) {
len = length;
}
// 初始化蛇
public void initSnake() {
repaint();
// 数据初始化
isStarted = false; // 状态判断初始化
isFaild = false; // 失败判断初始化
score = 0; // 得分初始化
level = 1; // 困难等级初始化
len = 3; // 蛇的长度初始化
direction = "R"; // 蛇头方向初始化
snakex[0] = 100; // 头的坐标位置初始化
snakey[0] = 100;
snakex[1] = 75; // 身体第一节的坐标初始化
snakey[1] = 100;
snakex[2] = 50; // 身体第二节的坐标初始化
snakey[2] = 100;
loadGame(highscorefile);//加载历史最高分
setScore();
if (!this.isFocusable())//确保面板处于聚焦状态
this.setFocusable(true);
timer.start();
}
public void paint(Graphics g) {
if (!this.isFocusable())//确保面板处于聚焦状态
this.setFocusable(true);
g.setColor(Color.WHITE);
g.fillRect(0, 0, 900, 720);
// 设置游戏区域的背景颜色
g.setColor(Color.BLACK);
// x的长为850( 34个格子 * 25格子边长 ) y的长为600( 24个格子 * 25格子边长 )
g.fillRect(25, 75, 850, 600);
// 设置标题框
title.paintIcon(this, g, 25, 11);
// 画出蛇头(根据位置和方向)
if( direction.equals("R")) {
right.paintIcon(this, g, snakex[0], snakey[0]);
}
else if( direction.equals("L") ) {
left.paintIcon(this, g, snakex[0], snakey[0]);
}
else if( direction.equals("U") ) {
up.paintIcon(this, g, snakex[0], snakey[0]);
}
else if( direction.equals("D") ) {
down.paintIcon(this, g, snakex[0], snakey[0]);
}
// 画出蛇身的每一节的位置,长度增加蛇身增加
for( int i=1; i<len; i++ ) {
body.paintIcon(this, g, snakex[i], snakey[i]);
}
// 画出食物
food.paintIcon(this, g, newfood.getfoodx(), newfood.getfoody());
//画出墙
if(condition==true) {
drawBarrier(g);
}
//画出虫洞
if(conditionUp==true) {
drawBarrierUp(g);
}
//当障碍物开关为打开状态时,蛇与生成障碍物相撞时,游戏结束
if(condition==true) {
for(int i=10;i<21;i++) {
if( 10*25 == snakex[0] && i*25 == snakey[0])
isFaild = true;
}
}
if(condition==true) {
for(int i=10;i<21;i++){
if( 24*25 == snakex[0] && i*25 == snakey[0])
isFaild = true;
}
}
//蛇身体与头部相撞时,游戏结束
for(int k=1;k<len;k++) {
if(snakex[k]==snakex[0]&&snakey[k]==snakey[0]) {
isFaild = true;
}
}
//当障碍物开关为打开状态时,蛇与生成障碍物相撞时,游戏结束
if(condition==true) {
for(int i=10;i<21;i++) {
if( 10*25 == snakex[0] && i*25 == snakey[0])
isFaild = true;
}
}
if(condition==true) {
for(int i=10;i<21;i++){
if( 24*25 == snakex[0] && i*25 == snakey[0])
isFaild = true;
}
}
//当虫洞开关为打开状态时,蛇进入虫洞,穿越
if(conditionUp==true) {
if( 5*25 == snakex[0] && 5*25 == snakey[0]) {
snakex[0]=30*25;
snakey[0]=20*25;
}
else if( 30*25 == snakex[0] && 20*25 == snakey[0]) {
snakex[0]=5*25;
snakey[0]=5*25;
}
}
if(conditionUp==true) {
if( 5*25 == snakex[0] && 6*25 == snakey[0]) {
snakex[0]=30*25;
snakey[0]=19*25;
}
else if( 30*25 == snakex[0] && 19*25 == snakey[0]) {
snakex[0]=5*25;
snakey[0]=6*25;
}
}
if(conditionUp==true) {
if( 5*25 == snakex[0] && 7*25 == snakey[0]) {
snakex[0]=30*25;
snakey[0]=18*25;
}
else if( 30*25 == snakex[0] && 18*25 == snakey[0]) {
snakex[0]=5*25;
snakey[0]=7*25;
}
}
//
if(conditionUp==true) {
if( 5*25 == snakex[0] && 20*25 == snakey[0]) {
snakex[0]=3
葡萄籽儿
- 粉丝: 721
- 资源: 2493
最新资源
- (Vim Linux)mamba-ssm-1.1.1-cp310-cp310-linux-x86-64.whl
- Mac软件工具Cisdem AppCrypt for Mac v7.9.0
- Adersoft.VbsEdit.v7.4261
- 基于C#开发的简易计算器
- 深度卷积神经网络(Deep Convolutional Network)在MNIST数据集上的应用(附数据集)
- AID 数据集 AID 是一个新的大规模航拍图像数据集
- Linux系统下Ubuntu 20.04 LTS的安装指南与初步配置教程
- update9-20250108.5.207.slice.img.7z.001.pd
- 判断正整数是否为平方数倍数的数学与编程实现方法解析
- Docker容器引擎详解: 容器化技术、特点及应用场景与操作命令
- 网页提取_QQ浏览器_20250108.pdf
- 先进有趣的科研工作室,致力于各种优化算法开发及其应用、机器学习、深度学习、数值计算、建模仿真、路径规划......并构建一站式学
- Matlab仿真实践任务书 - GUI计算器求解方程及方程组
- Matlab设计-A交通标志识别[语音播报,GUI界面,解析].zip
- Matlab设计- FIR滤波器语音降噪(GUI框架,可指导运行).zip
- Matlab设计-标志是识别系统(雾霾,曝光,雨雪场景,GUI界面).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈