Java crazy god says snake code

Main program

//主程序
package SNAKE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class snake {
    
    

	public static void main(String[] args) {
    
    
		// 绘制一个静态窗口
		JFrame frame = new JFrame("贪吃蛇小游戏");
		frame.setBounds(10, 10, 900, 720);
		frame.setResizable(false);//窗口大小不可变
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭事件
		
		//2.面板
		frame.add(new GamePanel());
		frame.setVisible(true);
	}

}

Main frame

//主框架在这里
package SNAKE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener{
    
    
//面板
	static int code;
	int length;//蛇的长度
	int [] snakeX = new int [600];//蛇的身体
	int [] snakeY = new int [500];
	String fx; 
	boolean isStart = false;//游戏是否开始
	Timer timer = new Timer( 50, this);//每隔多少秒执行一次//要监听谁
	
	//定义一个食物
	int foodx;
	int foody;
	Random random = new Random();
	
	//添加死亡判断
	boolean isFail = false;
	
	//积分系统
	int score;
	
	public GamePanel(){
    
    
		init();
		
		//获取键盘的监听事件
		this.setFocusable(true);//让焦点聚集在游戏上
		this.addKeyListener(this);
		timer.start();
	}
	
	public void init(){
    
    

		length = 3;//初始长度为3
		snakeX[0] = 100;snakeY[0] =100;//设置初始位置(头部坐标)
		snakeX[1] = 75;snakeY[1] =100;//第一个身体
		snakeX[2] = 50;snakeY[2] =100;//第二个身体
		fx = "R"; //默认方向为右
	
		foodx = 25 + 25*random.nextInt(34);
		foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子
		score = 0;
	}
	
//画板;画界面;画蛇
	protected void paintComponent(Graphics g){
    
    
		super.paintComponent(g);//调用父类方法来清楚屏幕
		this.setBackground(Color.WHITE);
		
		//绘制广告栏
		Data.header.paintIcon(this, g,25,11);
		
		//绘制游戏区域,画一个矩形
		g.fillRect(25, 75, 850, 600);
		
		//画一条静态小蛇
		if(fx.equals("R")){
    
    //根据不同方向,画不同方向的小蛇的头部
			Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
		}else if(fx.equals("L")){
    
    
			Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
		}else if(fx.equals("U")){
    
    
			Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
		}else if(fx.equals("D")){
    
    
			Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
		}
		for(int i = 1;i<length;i++){
    
    //循环打印身体长度
			Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
		}
		
		
		//画食物
		Data.food.paintIcon(this, g, foodx, foody);
		
		//画积分
		g.setColor(Color.WHITE);//设置画笔颜色
		g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体样式,粗体,和大小
		g.drawString("长度"+length, 750, 30);//画字体
		g.drawString("分数"+score, 750,55);//画字体
		
		//开始提示
		if(isStart==false){
    
    
			//画一个文字
			g.setColor(Color.WHITE);//设置画笔颜色
			g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
			g.drawString("按下空格开始游戏", 300, 300);//画字体
		}
		
	
	
	//失败 
	if(isFail){
    
    
		//画一个文字
		g.setColor(Color.WHITE);//设置画笔颜色
		g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
		g.drawString("游戏失败,按下空格重新开始", 300, 300);//画字体
	}
}	
	//接受键盘的输入:监听
@Override
public void keyPressed(KeyEvent e) {
    
    
		// TODO Auto-generated method stub
		//键盘按下的监听事件
	
	//获取按下的键盘是哪一个键
	 int keyCode = e.getKeyCode();
	 
	 if((keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A)&&fx=="R"){
    
    
		 keyCode=KeyEvent.VK_RIGHT;
	 }else if((keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D)&&fx=="L"){
    
    
		 keyCode=KeyEvent.VK_LEFT;
	 }else if((keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W)&&fx=="D"){
    
    
		 keyCode=KeyEvent.VK_DOWN;
	 }else if((keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S)&&fx=="U"){
    
    
		 keyCode=KeyEvent.VK_UP;
	 }
	 
	//如果按下的是空格,启动或暂停
	 if(keyCode==KeyEvent.VK_SPACE){
    
    
		 if(isFail){
    
    //失败,游戏再来一遍
			 isFail = false;
			 init();//重新初始化
		 }else{
    
    
		 isStart = !isStart;
		 }
		 repaint();//刷新界面
	 }
	if(keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){
    
    
		fx = "L";
	}
	
	if(keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D){
    
    
		fx = "R";
	}
	
	if(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){
    
    
		fx = "U";
	}
	
	if(keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){
    
    
		fx = "D";
	}
	
 }



//定时器,监听时间
@Override
public void actionPerformed(ActionEvent e) {
    
    
	// 执行定时操作
	
	//如果游戏处于开始状态,而且游戏没有结束
	if(isStart&&isFail==false){
    
    
		
		for(int i = length-1; i > 0; i--){
    
    //除了脑袋身体都向前移动
			snakeX[i] = snakeX[i-1];
			snakeY[i] =  snakeY[i-1];
		}
	
		//控制方向头部移动
		if(fx.equals("R")){
    
    
			snakeX[0] = snakeX[0] + 25;
			//边界判断
			if(snakeX[0]>850){
    
    
				snakeX[0] = 25;//回到原始位置
			}
		}else if(fx.equals("L")){
    
    
			snakeX[0] = snakeX[0] - 25;
			//边界判断
			if(snakeX[0]<25){
    
    
				snakeX[0] = 850;//回到原始位置
			}
		}else if(fx.equals("U")){
    
    
			snakeY[0] -= 25;
			//边界判断
			if(snakeY[0]<75){
    
    
				snakeY[0] = 650;//回到原始位置
			}
		}else if(fx.equals("D")){
    
    
			snakeY[0] += 25;
			//边界判断
			if(snakeY[0]>650){
    
    
				snakeY[0] = 75;//回到原始位置
			}
		}
		
		
		//如果吃到食物:坐标重合
		if(snakeX[0]==foodx&&snakeY[0]==foody){
    
    
			//长度加一
			
			score +=10 ;
			//重新生成食物
			foodx = 25 + 25*random.nextInt(34);
			foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子
			length += 1;
		}
		
		//结束判断
		for(int i = 1;i < length;i++){
    
    
			if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
    
    
				isFail = true;//设置失败
			}
		}
		
		
		//移动完要刷新界面
		repaint();
	}
	
	//让计时器动起来
	timer.start();
}

@Override
public void keyTyped(KeyEvent e) {
    
    
	// TODO Auto-generated method stub
	//键盘按下,弹起
}

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

}

Image resource loading

//这是一些图片资源
package SNAKE;

import java.net.URL;

import javax.swing.ImageIcon;

public class Data {
    
    //存放数据的类
	//广告图片 URL
	public static URL headreURL = Data.class.getResource("/statics/header.png");
	public static ImageIcon header = new ImageIcon(headreURL);
	
	//头部图片
	public static URL upURL = Data.class.getResource("/statics/up.png");
	public static ImageIcon up = new ImageIcon(upURL);
	public static URL downURL = Data.class.getResource("/statics/down.png");
	public static ImageIcon down = new ImageIcon(downURL);
	public static URL leftURL = Data.class.getResource("/statics/left.png");
	public static ImageIcon left = new ImageIcon(leftURL);
	public static URL rightURL = Data.class.getResource("/statics/right.png");
	public static ImageIcon right = new ImageIcon(rightURL);
	
	//身体
	public static URL bodyURL = Data.class.getResource("/statics/body.png");
	public static ImageIcon body = new ImageIcon(bodyURL);
	
	//食物
	public static URL foodURL = Data.class.getResource("/statics/food.png");
	public static ImageIcon food = new ImageIcon(foodURL);
}

Guess you like

Origin blog.csdn.net/qq_45911278/article/details/112570829