Java开发—贪吃蛇小游戏笔记(一)


b站狂神说Java一小时开发贪吃蛇游戏


事前准备

新建一个snake java project
在snake中新建一个statics包存放素材
素材

静态页面绘制

运用到GUI编程知识

  1. 绘制一个JFrame窗口
    设置窗口大小时要注意

    public class Lsnake {
    
        public static void main(String[] args) {
      	// TODO Auto-generated method stub
    	
          JFame frame = new JFrame("贪吃蛇小游戏"); //绘制一个静态窗口 JFrame
          frame.setBounds(x:10, y:10, width:900,height:720);
       //设置了一个距离起点为(10,10)的,宽为900,高为720的静态窗口
       }
     }
    

    起点(0,0)是屏幕左上角

  2. 设置可视化和设置可关闭

    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
绘制游戏面板
  1. Graphics g: 画笔
    所有东西都要通过g绘画上去
  2. 新建一个面板
     public class MPanel extends JPanel{
     	public void paintComponent(Graphics g) {
     		super.paintComponents(g);  //清屏
     		this.setBackground(Color.WHITE); //设置白色的背景
    
  3. JPanel添加到JFrame中
    frame.add(new MPanel());
    
  4. 新建一个类存放外部数据
    public class Data {
    
     // 顶部的图片
     public static URL headURL = Data.class.getResource("/statics/title.jpg");
     public static ImageIcon header = new ImageIcon(headURL);
    
     // 头部
     public static URL upURL = Data.class.getResource("/statics/up.png");
     public static URL downURL = Data.class.getResource("/statics/down.png");
     public static URL rightURL = Data.class.getResource("/statics/right.png");
     public static URL leftURL = Data.class.getResource("/statics/left.png");
     public static ImageIcon up = new ImageIcon(upURL);
     public static ImageIcon down = new ImageIcon(downURL);
     public static ImageIcon right = new ImageIcon(rightURL);
     public static ImageIcon left = new ImageIcon(leftURL);
    
     // 身体
     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);
    }
    
  5. 在游戏面板中绘制
    //绘制顶部的广告栏
       	Data.header.paintIcon(this, g, 25, 11);
       	//离X轴25,离Y轴11的距离
       	
       	//绘制游戏区域
       	g.fillRect(25, 75, 850, 600);
    
  6. 画一条静态的蛇
    public class MPanel extends JPanel{
       int length; //蛇的长度
       int[] snakeX = new int[600];  //蛇的坐标X
       int[] snakeY = new int[600];  //蛇的坐标Y
       String fx ;
       }
       
       //初始化
      public void  init() {
    	length = 3;
    	snakeX[0] = 100;snakeY[0] = 100; //头部坐标
    	snakeX[1] = 75;snakeY[1] = 100; //第一个身体坐标
    	snakeX[2] = 50;snakeY[2] = 100; //第二个身体坐标
    	}
    	
    	for(int i = 1; i<length; i++) {
    			Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); //蛇的身体长度通过length来控制
    		}
     //画一条静态的小蛇
    		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]);
    		}
    
让小蛇动起来
  1. 定时器
    Timer timer = new Timer(100,this); //定时器 	
    
  2. 键盘监听
     // 构造器
    	public MPanel() {
    		init(); 
    		// 获取键盘的监听事件
    		this.setFocusable(true);
    		this.addKeyListener(this);
    		timer.start();  //让时间动起来
    	}
    	// 死亡判断
     boolean isFail = false;
    // 接收键盘的输入:监听
    	@Override
    	public void keyPressed(KeyEvent e) {
    		// TODO Auto-generated method stub
    		// 获取按下的键盘是哪个键
    		int KetCode = e.getKeyCode();
    		
    		if(KetCode==KeyEvent.VK_SPACE) { //如果按下空格键,启动
    			if(isFail) {
    				// 失败,游戏再来一遍
    				isFail = false;
    				init(); //重新初始化游戏
    			}else {
    				// 暂停游戏
    				isStart = !isStart;
    			}
    			
    			repaint(); //刷新界面
    		}```
    		
    
吃食物
    public void  init() {
 	  length = 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;
          //如果小蛇的头和食物坐标重合了
 			if(snakeX[0] == foodx && snakeY[0] == foody){
 				length++; //长度+1
 				   score = score+10;
 				   //重新生成食物
 				foodx = 25 + 25*random.nextInt(34);
 				foody = 75 + 25*random.nextInt(24);
 				}
死亡判断
 // 死亡判断
     boolean isFail = false;
public void paintComponent(Graphics g) {
                //结束判断
				for(int i = 1; i < length; i++) {
					if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]) {
						isFail = true;
					}
				}
				// 刷新界面
				repaint();			
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值