贪吃蛇小游戏代码

3 篇文章 0 订阅
3 篇文章 0 订阅
本文详细介绍了如何使用Java构建贪吃蛇游戏,包括创建SnakePanel、Main类和Cell类的步骤,关键代码段展示了如何控制蛇的移动、绘制界面和食物生成。通过这个实例学习了Java基础语法、事件监听和游戏逻辑设计。
摘要由CSDN通过智能技术生成

贪吃蛇小游戏代码

以下为贪吃蛇代码和简介


前言

提示:首先创建Java项目,new一个包game,在new三个class,分别为SnakePanel、Main、Cell

引入库

SnakePanel代码如下(示例):

package game;

import javax.imageio.ImageIO;
//导入面板类
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Font;
//导入画笔类			提示的快捷键:alt+/
import java.awt.Graphics;
//导入随机数类
import java.util.Random;
import java.awt.event.KeyEvent;
//导入键盘监听器接口
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
//导入数组工具类
import java.util.Arrays;

/**
 * 蛇面板类
 * @author 
 */
/*继承:子类继承父类,子类拥有父类的方法和属性
 * 		子类可以重写和假期父类的方法
 * 	语法:子类extends 父类
 * 语法:子类extends父类
 * 接口:准则,标准
 * 键盘控制蛇,需要实现键盘监听器接口--KeyListener
 * 语法:实现类implements 接口
 */

public class SnakePanel extends JPanel implements KeyListener{
	
	//定义食物
	Cell food;
	//定义蛇
	Cell[] snake;
	/*定义四个方向:左,右,上,下
	 * 1、用数字代替方向,准确,方便,快
	 * 2、final:最终的,不可改变的,被final修饰的变量不可变
	 * 3、不可改变的量,同意用大写
	 */
	final int LEFT =-1;
	final int RIGHT = 1;
	final int UP = -2;
	final int DOWN = 2;
	//定义蛇的方向,默认向右
	int direction =DOWN ;
	
	//定义图片
	BufferedImage background;
	private boolean isStart;
	private boolean isFail;

	/*构造方法:给属性赋初始值
	 * 语法:
	 * 类名(){赋值的过程}
	 */
	
	SnakePanel(){
		//加载图片
		try{
			background = ImageIO.read(SnakePanel.class.getResource("background.jpg"));
				}catch (IOException e){
			e.printStackTrace();
		}
		//给food的赋值
		food = new Cell();
		//造随机数工具,变量ran
		Random ran = new Random();
		//给food的x和y赋值
		 food.x = ran.nextInt(20)*15;
		food.y = ran.nextInt(20)*15;
		//造格子数组,赋值给snake
		snake = new Cell[3];
		//for循环给snake数组元素赋值
		/*
		//造格子,赋值给snake的第0个元素
		snake[0] = new Cell();
		snake [0].x = 0;
		snake [0].y = 0;
		//造格子,赋值给snake的第1个元素
		snake[1] = new Cell();
		snake [1].x = 15;
		snake [1].y = 0;
		//造格子,赋值给snake的第2个元素
		snake[2] = new Cell();
		snake [2].x = 30;
		snake [2].y = 0;
		 */
		
		
		for(int i=0; i<snake.length; i++){
			snake[i] = new Cell();
			snake [i].x = i*15;
			snake [i].y = 0;
		}
	}
	
	/*paint方法:专门画画的方法,在这里画画板,食物,蛇
	 * int a :声明整型变量a
	 * Graphics g:声明画笔类变量g,g就是画笔
	 */
	public void paint(Graphics g){
		//擦干净面板,暂时理解为固定的写法
		super.paint(g);
		//画笔画游戏面板
		g.drawRect(0, 0, 300, 300);
		//画游戏背景图片
		g.drawImage(background,0, 0, null);
		//画食物
		g.fillRect(food.x, food.y, food.width, food.height);
		//画分数
	g.drawString("SCORE:"+(snake.length-3)*10,10, 20);
		//画蛇
		//练习,吧画蛇的代码改成for循环
		for(int i=0; i<snake.length; i++){
			//设置画笔的颜色
			if(i%3==0){//如下标为偶数,红色
				g.setColor(Color.red);
			}else if(i%3==1){//如下标为奇数,黄色
				g.setColor(Color.yellow);
			}else{//如下标%3=2,蓝色
				g.setColor(Color.blue);
			}
			g.fillRect(snake[i].x, snake[i].y, snake[i].width, snake[i].height);
		}
		//游戏提示
        if (isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            g.drawString("按下空格开始游戏!",100,300);
        }
        //失败判断
        if (isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            g.drawString("失败, 按下空格重新开始",100,300);
        }

    }
	
	
	//run方法负责蛇的移动
	public void run(){
		//while循环让蛇不断移动
		while(true){
			//1改变坐标
			for(int i =0; i<=snake.length-2; i++){
				snake[i] = snake[i+1];
			}
			
			//新建格子,装入蛇头
			snake[snake.length-1] =new Cell();
			/*如果向右移动
			 * 蛇头的x等于倒数第二格子的x+15
			 * 蛇头的y等于倒数第二格子的y
			 */
			if(direction==RIGHT){
			snake[snake.length-1].x = snake[snake.length-2].x+15;
			snake[snake.length-1].y = snake[snake.length-2].y;
			}
			/*如果向左移动
			 * 蛇头的x等于倒数第二格子的x-15
			 * 蛇头的y等于倒数第二格子的y
			 */
			if(direction==LEFT){
				snake[snake.length-1].x = snake[snake.length-2].x-15;
				snake[snake.length-1].y = snake[snake.length-2].y;
				}
			/*如果向下移动
			 * 蛇头的x等于倒数第二格子的x
			 * 蛇头的y等于倒数第二格子的y+15
			 */
			if(direction==DOWN){
				snake[snake.length-1].x = snake[snake.length-2].x;
				snake[snake.length-1].y = snake[snake.length-2].y+15;
				}
			/*如果向上移动
			 * 蛇头的x等于倒数第二格子的x
			 * 蛇头的y等于倒数第二格子的y-15
			 */
			if(direction==UP){
				snake[snake.length-1].x = snake[snake.length-2].x;
				snake[snake.length-1].y = snake[snake.length-2].y-15;
			}
			/*
			 * 如果蛇头的x==300
			 * 或者蛇头的x==-15
			 * 或者蛇头的y==300
			 * 或者蛇头的y==-15
			 * 则蛇停止移动
			 */
			if(snake[snake.length-1].x==300||
			   snake[snake.length-1].x==-15||
			   snake[snake.length-1].y==300||
			   snake[snake.length-1].y==-15){
				break;
			}
			
			/*
			 * 蛇吃到食物
			 * 条件:蛇头的坐标等于食物的坐标
			 * 结果:
			 * 1给蛇数组扩容一个位置
			 * 2吧食物装进蛇
			 * 3再造食物
			 */
			if(snake[snake.length-1].x==food.x &&
				snake[snake.length-1].y==food.y){
				//1给蛇数组扩容一个位置
				snake = Arrays.copyOf(snake, snake.length+1);
				//2吧食物装进蛇头
				snake[snake.length-1]=food;
				//3再造食物
				//给food的赋值
				food = new Cell();
				//造随机数工具,变量ran
				Random ran = new Random();
				//给food的x和y赋值
				 food.x = ran.nextInt(20)*15;
				food.y = ran.nextInt(20)*15;
			}
			
			/*
			 * 蛇咬到自己,停止运行
			 * 1、for循环出每个格子,(除了倒数4个格子外)
			 * 2、对比蛇头和身体的格子的坐标,如果相等,则停止运行
			 */
			//定义开关,默认是关的
			boolean flag = false;
			for(int i=0; i<=snake.length-5; i++){
				if(snake[snake.length-1].x==snake[i].x&&
					snake[snake.length-1].y==snake[i].y){
					flag =true;//咬到了,开关打开
					break;
				}
			}
			//判断开关,如果flag为true,则打开开关,释放break,中断循环
			if(flag){
				break;
			}
		
			//2擦干净面板,重画
			repaint();
			//3控制速度
			/*Thread:暂时理解为程序,在这里指代贪吃蛇游戏
			 * sleep(500):程序休眠500毫秒,蛇每走一步,停顿500毫秒
			 */
			try {
				//定义速度
				int speed=400;
				//如果设的长度大于等于20,则speed=50
				if(snake.length>=20){
					speed=50;
				}
				//如果设的长度大于等于15,小于20,则speed=100
				if(snake.length>=15 && snake.length<20){
					speed=100;
				}
				//如果设的长度大于等于10, 小于15 ,则speed=200
				if(snake.length>=10 && snake.length<15){
					speed=200;
				}
				//如果设的长度大于等于5,小于10, 则speed=300
				if(snake.length>=5 && snake.length<10){
					speed=300;
				}
				Thread.sleep(speed);
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			}
		}
		
		
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	/*
	 * KyePresed:按键方法,通过按下某个键实现特定的功能
	 * KeyEvent e:声明键盘事件,也就是按下键盘这个事情,
	 * 				也是对象,调用e的方法,获取按键编码
	 */
	@Override
	public void keyPressed(KeyEvent e) {
		//获取按键的编码
		int code = e.getKeyCode();
		//System.out.println(code);
		/*如果code==37并且原来的方向不等于右,那么蛇向左移动
		 * 如果code==38并且原来的方向不等于下,那么蛇向上移动
		 * 如果code==39并且原来的方向不等于左,那么蛇向右移动
		 * 如果code==40并且原来的方向不等于上,那么蛇向下移动
		 */
		if(code==37 && direction !=RIGHT){
			direction=LEFT;
		}
		if(code==38 && direction !=DOWN){
			direction=UP;
		}
		if(code==39 && direction !=LEFT){
			direction=RIGHT;
		}
		if(code==40 && direction !=UP){
			direction=DOWN;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
}

Main代码如下(示例):

 package game;

import java.awt.Window;

//导入窗口类
import javax.swing.JFrame;

/**
 * 这是游戏的主运行文件,启动游戏在本文件启动
 * @author 
 *
 */

public class Main {
	//这是入口
	public static void main(String[] args) {
		//造窗口,变量名window
		JFrame window = new JFrame();
		
		//设置窗口大小
		window.setSize(400,500);
		//设置窗口居中
		window.setLocationRelativeTo(null);
		//设置默认关闭操作
		window.setDefaultCloseOperation(3);
		//造面板,变量名panel
		SnakePanel panel = new SnakePanel();
		//窗口添加面板
		window.add(panel);
		
		//设置窗口可见
		window.setVisible(true);
		
		//窗口添加键盘监听器
	   window.addKeyListener(panel);
	   //面板添加键盘监听器
		panel.addKeyListener(panel);
		//调用run方法
		panel.run();
	}

}


Cell代码如下(示例):

package game;

/**
 * 格子类,用于造食物和蛇
 * @author 
 *
 */
public class Cell {

	//格子的宽
	int width = 15;
	//格子的高
	int height = 15;
	//格子的X坐标
	int x;
	//格子的Y坐标
	int y;
}

运行结果

提示:显示分数
在这里插入图片描述

感悟

欢迎各位大佬提出意见

学习内容:

1、 搭建 Java 开发环境 2、 掌握 Java 基本语法 3、 掌握条件语句 4、 掌握循环语句
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值