计算机软件实习实验二

本文介绍了一个使用Java Swing框架开发的贪吃蛇游戏。游戏中,蛇可以通过键盘控制移动,吃到食物后会增长,碰到边界或自身会导致游戏结束。游戏界面包括开始、暂停和退出选项,同时支持分数显示和游戏速度设置。通过DATA类加载资源图片,gamePanel类处理游戏逻辑,Startgame类启动游戏界面。
摘要由CSDN通过智能技术生成

实验内容

1. 实现贪吃蛇游戏基本功能,屏幕上随机出现食物,上下左右控制蛇的移动,吃到豆子以后蛇的身体加长一点,得分增加,蛇碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计游戏界面,游戏结束界面。


2. 进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度等拓展元素。

实验准备 

java语言知识,用java swing框架来实现GUI。

代码实现

先建两个包come.hxy这个包存放代码  另外一个包statics存放贪吃蛇图片资源

在come.hxy包下建三个类DATA   gamePanel   Startgame

DATA类

package come.hxy;

import javax.swing.*;
import java.net.URL;

public class DATA {
    public static URL headURL =DATA.class.getResource("/statics/TITLE.png");
    public static ImageIcon head = new ImageIcon(headURL);
    public static URL upUrl =DATA.class.getResource("/statics/4.png");
    public static URL downUrl =DATA.class.getResource("/statics/2.png");
    public static URL leftUrl =DATA.class.getResource("/statics/3.png");
    public static URL rightUrl=DATA.class.getResource("/statics/1.png");
    public static ImageIcon down=new ImageIcon(downUrl);
    public static ImageIcon up=new ImageIcon(upUrl);
    public static ImageIcon left=new ImageIcon(leftUrl);
    public static ImageIcon right=new ImageIcon(rightUrl);
    public static URL bodyUrl=DATA.class.getResource("/statics/身体.png");
    public static ImageIcon body=new ImageIcon(bodyUrl);
    public static URL foodUrl=DATA.class.getResource("/statics/5.png");
    public static ImageIcon food=new ImageIcon(foodUrl);

}

gamePanel类

package come.hxy;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class gamePanel extends JPanel implements KeyListener, ActionListener {
    int length;
    int[] snakeX=new int[600];
    int[] snakeY=new int[500];
    String fx;
    boolean isStart=false;
    Timer timer=new Timer(100,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;
        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;    
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);
        DATA.head.paintIcon(this, g, -40, -20);
        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]);
        }
        g.setColor(Color.BLACK);
        g.setFont(new Font("微软雅黑", Font.BOLD,18));
        g.drawString("分数"+score,750,50);
        g.drawString("长度"+length,750,35);
        
        DATA.food.paintIcon(this, g, foodx, foody);
        
if (isStart==false){
    g.setColor(Color.WHITE);
    g.setFont(new Font("微软雅黑", Font.BOLD,40));
    g.drawString("按下空格开始游戏",300,300);
}
if(isFail) {
     g.setColor(Color.RED);
        g.setFont(new Font("微软雅黑", Font.BOLD,40));
        g.drawString("GG,按下空格remake",200,300);
}
    }

    @Override
    public void keyPressed(KeyEvent e) {
      int keyCode=e.getKeyCode();
      if (keyCode==KeyEvent.VK_SPACE){
          if(isFail) {
              isFail=false;
              init();
          }else {         
          isStart=!isStart;}    
          repaint();
      }
      if (keyCode==KeyEvent.VK_LEFT) {
          fx="L";
      }else if(keyCode==KeyEvent.VK_RIGHT) {
          fx="R";
      }else if(keyCode==KeyEvent.VK_UP) {
          fx="U";
      }else if(keyCode==KeyEvent.VK_DOWN) {
          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]=snakeY[0]-25;
            if(snakeY[0]<75){snakeY[0]=650;}
        }else if (fx.equals("D")){
            snakeY[0]=snakeY[0]+25;
            if(snakeY[0]>650){snakeY[0]=75;}
        }
        if(snakeX[0]==foodx&&snakeY[0]==foody) { 
            length++;    
            score=score+10;
             foodx=25+25*random.nextInt(34);
             foody=75+25*random.nextInt(24);
        }
          for(int i=1;i<length;i++) {
              if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]) {
                  isFail=true; 
              }
          }
       
        repaint();
    }
    timer.start();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }


}

Startgame类

package come.hxy;

import javax.swing.*;

public class Startgame {
    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);
        frame.add(new gamePanel());
        frame.setVisible(true);
    }
}
 

这是图片资源命名

 

运行结果

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值