贪吃蛇小游戏代码
以下为贪吃蛇代码和简介
前言
提示:首先创建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;
}
运行结果
提示:显示分数
感悟
欢迎各位大佬提出意见