>  기사  >  Java  >  Java로 Snake War 미니 게임을 구현하는 방법

Java로 Snake War 미니 게임을 구현하는 방법

WBOY
WBOY앞으로
2023-04-26 08:55:061738검색

1. 개발 환경 및 게임 디스플레이

Snake Battle은 설계 및 실험 과정에서 Windows 10 시스템에서 수행되어야 하며, 개발 도구 IntelliJ IDEA Community Edition 2020.3.2(jdk-15)를 사용하여 완료됩니다. 코드 작성, 컴파일, 디버깅, 테스트 및 기타 작업. 뱀의 머리, 몸통, 배경 이미지 등 프로그램에 필요한 구성 요소는 모두 이미지 소프트웨어 Adobe Photoshop 2020을 사용하여 생성됩니다.

1.1 게임 메인 인터페이스

Java로 Snake War 미니 게임을 구현하는 방법

1.2 모바일 인터페이스

Java로 Snake War 미니 게임을 구현하는 방법

1.3 보상 인터페이스

1. 게임이 50점에 도달했습니다.

Java로 Snake War 미니 게임을 구현하는 방법

2. 100포인트 도달:

Java로 Snake War 미니 게임을 구현하는 방법

1.4 F 가속 기능 인터페이스

F를 누르면 속도가 100으로 증가합니다.

Java로 Snake War 미니 게임을 구현하는 방법

1.5 데스 인터페이스

Java로 Snake War 미니 게임을 구현하는 방법

2. 수요 분석

스네이크 게임은 사람들의 일상 여가, 오락 및 기타 시나리오에서 사용할 수 있는 작은 퍼즐 게임입니다. 이 게임 디자인에는 1차원 배열, Swing의 공통 구성 요소, GUI의 이벤트 처리(이벤트 리스너, 키보드 리스너), 클래스 캡슐화 및 상속, 정적 변수, 패키징 클래스, 난수 등에 대한 지식이 포함됩니다.

구체적인 요구 사항은 다음과 같습니다.

1. 초기화 인터페이스의 크기는 800×800이고, 게임 인터페이스는 화면 중앙에 유지되어야 하며, 창에는 "Snake"라는 단어가 있어야 합니다.

2. 게임 인터페이스에는 게임 점수와 뱀의 현재 속도를 알려주는 필수 프롬프트 텍스트가 있어야 합니다. 시작 인터페이스에는 작업 프롬프트 텍스트가 있어야 하며(게임을 시작/일시 중지하려면 스페이스 게임을 탭하고, 가속하려면 F를 길게 누르세요) 텍스트 색상이 아름다워야 합니다.

3 뱀의 위치를 ​​초기화합니다. 패널), 프로그램 방향의 뱀 위치(기본값 오른쪽), 뱀 길이(기본값 3), 음식 위치 초기화

4. 게임 시작 및 일시 중지 구현: 게임의 시작 및 일시 중지를 제어합니다.

5. 뱀 이동 기능 구현: W, S, A, D 또는 ↑, ←, →를 사용하여 뱀의 이동 방향을 위, 아래, 왼쪽으로 제어합니다.

6. 뱀 머리가 활동의 주변에 닿을 때 : 뱀의 머리가 인터페이스의 가장 오른쪽(왼쪽) 끝 부분에 닿으면 대칭적인 왼쪽(오른쪽) 끝에서 나타납니다. 뱀의 머리가 인터페이스의 가장 위쪽(아래쪽) 끝 부분에 닿으면 대칭 아래쪽(상단) 끝에서 나타납니다.

7. 뱀 음식 먹기 기능 구현: 게임 중 뱀 머리가 음식에 닿으면 음식을 먹습니다. 이때 뱀의 길이는 1씩, 속도는 10씩, 점수는 10씩 증가해야 하며, 음식의 위치는 새로 고쳐져야 합니다(임의의 위치). 뱀 가속 기능: "F" 키를 누르면 뱀이 가속되고, "F" 키를 놓으면 뱀이 기본 속도 10으로 돌아갑니다.

9. : 뱀의 머리가 뱀의 몸에 닿으면 뱀이 죽고 게임이 종료되며 인터페이스는 중앙 프롬프트에 가까워집니다. "당신의 작은 뱀이 죽었습니다. 다시 시작하려면 스페이스바를 누르세요!"; 게임의 보상 메커니즘: 점수가 10점일 때 게임은 "좋아요!"라는 메시지를 표시하고, 점수가 50점일 때 게임은 "좋아요!!!"라는 메시지를 표시합니다. "; 점수가 200에 도달하면 게임에서 "Unstoppable!!!"이라는 메시지가 표시됩니다. 위의 메시지는 모두 스네이크 헤드에 있습니다.

기본 작동 테이블은 다음과 같습니다.

3. 시스템 설계

3.1 전체 시스템 기능 설계Java로 Snake War 미니 게임을 구현하는 방법

이 Snake 프로그램은 일반적으로 Snake의 모바일 기능과 Snake의 주도권 가속 기능, 게임 규칙 판단 기능, 메인 인터페이스 제어 기능, 탐욕스러운 뱀 먹기 기능을 포함합니다. 그 중 뱀의 이동 기능에는 이동 방향의 주요 제어와 뱀의 자동 이동이 포함되며, 게임 규칙 판단 기능에는 뱀의 사망 판단, 게임 시작 및 일시 중지 판단, 경계 외 규칙이 포함됩니다. 주요 인터페이스 제어 기능에는 뱀의 초기화 및 음식 초기화가 포함됩니다. 탐욕스러운 뱀이 음식을 먹는 기능에는 뱀 몸 성장, 뱀 속도 증가, 포인트 증가 및 음식 새로 고침 위치가 포함됩니다. 구체적인 기능 구조 다이어그램은 다음과 같습니다.

3.2 전체 시스템 프로세스 설계

Snake 프로그램에 들어갈 때 먼저 스페이스바를 눌렀는지 확인합니다. 스페이스바를 누르면 게임이 시작됩니다. 게임이 시작된 후 키 입력이 있는지 여부를 판단합니다. 키 입력이 있으면 키 설정에 따라 뱀의 이동 방향이 변경되거나 가속됩니다. 키 조작이 없으면 뱀은 계속해서 움직입니다. 원래 방향. 뱀이 이동하는 동안 뱀이 음식을 먹었는지 여부가 판단됩니다. 음식을 먹으면 게임 점수가 10 증가하고, 뱀이 음식을 먹었는지 여부에 따라 뱀의 이동 속도도 증가합니다. 뱀이 죽으면 게임이 종료되고, 뱀이 죽지 않으면 계속해서 공백 입력이 있는지 판단하고, 그렇지 않으면 게임이 일시 중지됩니다. 계속해서 키를 판단하고, 키에 따라 뱀의 동작 상태를 변경하고, 뱀이 죽어 게임이 끝날 때까지 게임을 계속합니다.

Java로 Snake War 미니 게임을 구현하는 방법

4. 기능적 디자인

4.1 뱀의 움직임과 가속 기능 디자인

Snake의 움직임 기능은 주로 W, S, A, D 또는 &uarr ;, ↓, ←를 사용하는 선택문과 키보드 모니터에 의존합니다. → 뱀의 이동 방향을 상하좌우로 조절하여 게임을 즐겨보세요. F 키를 누르면 뱀이 가속됩니다.

Java로 Snake War 미니 게임을 구현하는 방법

4.2 욕심뱀 먹는 음식 가속 및 사망 판정 기능 설계

욕심뱀 먹는 음식 및 사망 판정 과정에서는 다음 매개변수가 사용됩니다.

  • Timer 클래스의 매개변수: int 유형 시간이 지나면 타이머의 매개변수를 변경하기 위해 프로그램에서 타이머.setDelay(time) 메소드가 호출됩니다(시간이 작을수록 뱀이 더 빠르게 움직입니다).

  • 뱀이 죽었는지 여부를 기록하는 매개변수: 부울 유형 isDied(true, 뱀이 죽습니다), false이면 뱀이 살아납니다. 기본값은 false입니다.

  • 뱀의 길이: int 유형 길이(초기 3)

  • 적분 매개변수: int 유형 점수(초기 0), 프로그램은 반복됩니다. 음식을 먹을 때마다 제어하여 10점을 추가합니다.

  • 뱀 머리의 좌표: int 유형의 snakeX[0] 및 snakeY[0]; 뱀 머리의 수평 및 수직 좌표 각각

  • 뱀 몸체의 좌표: int[] snakeX[i] 및 snakeY[i]를 입력하면 각각 각 뱀 몸체의 수평 및 수직 좌표(i≠0)가 저장됩니다.

  • 음식의 좌표: int 유형 foodX 및 foodY는 각각 음식의 가로 및 세로 좌표를 저장합니다. 좌표, foodX 및 foodY는 모두 Random 클래스의 nextInt() 메서드를 사용하여 생성된 난수이므로 좌표는 음식은 무작위입니다.

아래에서 위의 매개변수를 사용할 때는 자세히 설명하지 않겠습니다.

4.2.1 욕심쟁이 뱀의 먹이 먹기 가속 기능 설계

뱀 머리 snakeX[0], snakeY[0]의 좌표가 각각 foodX, foodY의 좌표와 같을 때 점수는 10씩 증가하고, 뱀 몸의 길이가 증가합니다. 1. 뱀이 음식을 먹은 후 추가 포인트를 완료하고 뱀 몸을 늘리며 기능을 가속화하려면 타이머 매개변수 시간을 10씩 줄입니다. 이 기능의 흐름 설계도는 다음과 같습니다.

Java로 Snake War 미니 게임을 구현하는 방법

4.2.2 뱀 사망 판정 기능의 설계

욕심 많은 뱀이 스스로 먹으면 뱀이 죽습니다. 즉, 뱀 머리는 snakeX[0]을 좌표화하고 snakeY[0] 뱀 몸체 좌표 snakeX[i] 및 snakeY[i]와 각각 같으면 뱀은 죽습니다. 현재 isDied=! 사망했습니다.

Java로 Snake War 미니 게임을 구현하는 방법

4.3 스네이크의 능동 가속 기능 설계

스네이크의 능동 가속 기능은 게임 중에 F 키를 누르고 있으면 뱀이 더 빠르게 움직인다는 의미입니다. 더 빠르게 기본값을 복원합니다. 이는 주로 GUI의 키보드 리스너를 통해 구현됩니다. 키보드 리스너의 두 가지 메서드인 keyPressed() 및 keyReleased()는 각각 F 키를 누르고 F 키를 놓는 작업을 모니터링합니다. 둘째, 타이머의 빈도를 변경하기 위해 타이머.setDelay(time) 메소드(타이머는 Timer 클래스의 객체)를 호출하여 프로그램에서 시간 값을 변경하여 다음과 같은 효과를 얻습니다. 뱀의 속도를 높입니다.

Java로 Snake War 미니 게임을 구현하는 방법

4.4 Snake Reward 메커니즘 기능 설계

Snake Reward 메커니즘 기능은 주로 PaintComponent(Graphics g) 메서드에서 선택 구조와 브러시 도구를 사용하여 구현됩니다. 게임이 특정 점수에 도달하면 프로그램은 브러시 도구에서 g.drawString("XXX", snakeX[0], snakeY[0]) 메서드를 호출하여 뱀 머리 위치에 프롬프트 텍스트를 그립니다.

Java로 Snake War 미니 게임을 구현하는 방법

5. 프로젝트 구조 및 프로젝트 구현

5.1 프로젝트 구조 및 클래스 간의 관계

Java로 Snake War 미니 게임을 구현하는 방법

Java로 Snake War 미니 게임을 구현하는 방법

5.2 프로젝트 전체 소스 코드

5.2.1 이미지 클래스

이 클래스는 Snake 컴포넌트의 그림 객체를 주로 저장하는 정적 클래스입니다.

package snakegame;

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

//Images类用于封装图片路径以及获取图片(使用静态对象便于用类名直接访问)
public class Images {
    //将图片的路径封装成一个对象
    public static URL bodyURL=Images.class.getResource("/snake_images/body.jpg");
    public static URL backURL=Images.class.getResource("/snake_images/back.jpg");
    public static URL snakeDownURL=Images.class.getResource("/snake_images/snakeDown.jpg");
    public static URL snakeLeftURL=Images.class.getResource("/snake_images/snakeLeft.jpg");
    public static URL snakeRightURL=Images.class.getResource("/snake_images/snakeRight.jpg");
    public static URL snakeUpURL=Images.class.getResource("/snake_images/snakeUp.png");
    public static URL foodURL=Images.class.getResource("/snake_images/food.jpg");
    //将图片封装为程序中的对象
    public static ImageIcon bodyImg=new ImageIcon(bodyURL);
    public static ImageIcon backImg=new ImageIcon(backURL);
    public static ImageIcon snakeDownImg=new ImageIcon(snakeDownURL);
    public static ImageIcon snakeUpImg=new ImageIcon(snakeUpURL);
    public static ImageIcon snakeRightImg=new ImageIcon(snakeRightURL);
    public static ImageIcon snakeLeftImg=new ImageIcon(snakeLeftURL);
    public static ImageIcon foodImg=new ImageIcon(foodURL);
}

5.2.2 HighestScore

이 클래스는 역사상 가장 높은 점수 기능을 구현합니다.

package snakegame;

import org.w3c.dom.Text;

import java.io.*;

//该类用于给游戏添加历史最高分功能
public class HighestScore {
    static int score = 0;//最高分的存储

    public void highest() throws IOException {
        //得分为最高分时存储
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(String.valueOf(Text.class.getResourceAsStream("贪吃蛇大作战/score.txt"))));
        if (GamePanel.score > score) {
            score = GamePanel.score;
            String s1 = String.valueOf(score);
            bos.write(s1.getBytes());
        }
        bos.close();
    }

    //用于游戏开始时从文件读取最高分的值
    public void readHighest() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(String.valueOf(Text.class.getResourceAsStream("贪吃蛇大作战/score.txt"))));
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            System.out.print(new String(bys, 0, len));//测试用
            String s2 = new String(bys, 0, len);
            score = Integer.valueOf(s2);
        }
        bis.close();
    }
}

5.2.3 GamePanel 클래스

이 클래스는 Snake 게임 패널을 그리고 게임의 특정 논리 기능을 구현하는 데 사용됩니다.

package snakegame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.Random;

//贪吃蛇游戏面板的绘制
public class GamePanel extends JPanel {
    Timer timer;
    int time=100;
    static int score;//记录游戏分数
    //蛇属性部分
    boolean isDied;
    int length;//设置蛇长
    String direction;//蛇头朝向
    //分别储存蛇身的X,Y坐标
    int[] snakeX=new int[300];
    int[] snakeY=new int[300];
    //判断游戏是否开始
    boolean isStart=false;
    int foodX,foodY;//食物的X,Y坐标
    //贪吃蛇初始化方法
    public void init(){
        length=3;
        snakeX[0]=175;
        snakeY[0]=275;
        snakeX[1]=150;
        snakeY[1]=275;
        snakeX[2]=125;
        snakeY[2]=275;
        foodX=300;
        foodY=400;
        score=0;
        isDied=false;//蛇默认状态为活着
        direction="R";//U,D,L,R分别表示蛇头朝向上,下,左,右
    }

    //构造方法
    public GamePanel() throws IOException {
        init();

        if(GamePanel.score>HighestScore.score){
            new HighestScore().highest();
        }
        //焦点定位到当前面板
        this.setFocusable(true);
        //监听器的实现部分
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                //按下空格以开始游戏,以及方向键的控制
                if (keyCode == KeyEvent.VK_SPACE) {
                    if(isDied){
                        init();
                    }else {
                        isStart = !isStart;
                        repaint();//重绘
                    }
                } else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {
                    direction = "U";
                } else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) {
                    direction = "D";
                } else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {
                    direction = "L";
                } else if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {
                    direction = "R";
                }
            }
        });
        //贪吃蛇加速功能的实现
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode=e.getKeyCode();
                if(keyCode==KeyEvent.VK_F){
                    time=10;
                    timer.setDelay(time);//按下F时加速
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
                int keyCode=e.getKeyCode();
                if(keyCode==KeyEvent.VK_F){
                    time=100;
                    timer.setDelay(time);//松开F键减速恢复默认速度
                }
            }
        });
        //对定时器进行初始化,并实现监听器
            timer = new Timer(time, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //当游戏处于开始状态且蛇活着时蛇活动,且后一节身子到前一节身子的位置上(每一节身子为25乘25像素)
                    if (isStart && isDied == false) {
                        //蛇身运动部分
                        for (int i = length - 1; i > 0; i--) {
                            snakeX[i] = snakeX[i - 1];
                            snakeY[i] = snakeY[i - 1];
                        }
                        //蛇头运动部分
                        if ("D".equals(direction)) {
                            snakeY[0] += 25;
                        }
                        if ("U".equals(direction)) {
                            snakeY[0] -= 25;
                        }
                        if ("L".equals(direction)) {
                            snakeX[0] -= 25;
                        }
                        if ("R".equals(direction)) {
                            snakeX[0] += 25;
                        }
                        //防止超出边界
                        if (snakeX[0] > 750) {
                            snakeX[0] = 25;
                        }
                        if (snakeX[0] < 25) {
                            snakeX[0] = 750;
                        }
                        if (snakeY[0] < 100) {
                            snakeY[0] = 725;
                        }
                        if (snakeY[0] > 725) {
                            snakeY[0] = 100;
                        }
                        //吃食物的动作,吃食物加10分且蛇身变长,蛇的速度提升10
                        if ((snakeX[0] == foodX && snakeY[0] == foodY)) {
                            length++;//蛇身长度加1
                            foodX = (new Random().nextInt(30) + 1) * 25;//随机生成X坐标[25,750]
                            foodY = (new Random().nextInt(26) + 4) * 25;//随机生成Y坐标[100,725]
                            score += 10;//吃一次食物积分加10
                            try {
                                new HighestScore().highest();
                            } catch (IOException ioException) {
                                ioException.printStackTrace();
                            }
                            if(time>10)
                                timer.setDelay(time-=10);//吃一次食物速度增加10
                        }
                        //蛇的死亡机制判定
                        for (int i = 1; i < length; i++) {
                            if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                                isDied = !isDied;
                            }
                        }
                        repaint();
                    }
                }
            });
            timer.start();//定时器启动
    }

    //绘制面板部分
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色
        this.setBackground(new Color(164, 219, 246));
        //绘制初始蛇头的图片(默认右方朝向)
        Images.backImg.paintIcon(this,g,10,10);
        //调整画笔的颜色并绘制一个矩形面板
        g.setColor(new Color(219,226,219));
        g.fillRect(10,70,770,685);
        //蛇头的绘制;上下左右不同情况
        if("L".equals(direction)){
            Images.snakeLeftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("R".equals(direction)){
            Images.snakeRightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.snakeUpImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.snakeDownImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        //蛇身的绘制
        for(int i=1;i<length;i++) {
            Images.bodyImg.paintIcon(this, g, snakeX[i], snakeY[i]);
        }
        //食物绘制
       Images.foodImg.paintIcon(this,g,foodX,foodY);
        //游戏的文字提示语
        if(!isStart&&!isDied){
            g.setColor(new Color(12, 191, 222));
            g.setFont(new Font("楷体",Font.BOLD,40));
            g.drawString("轻按空格以开始/暂停游戏!",150,330);
            g.setColor(new Color(246, 2, 31));
            g.setFont(new Font("宋体",Font.CENTER_BASELINE,30));
            g.drawString("按住F以加速",300,380);
        }
        //游戏的得分显示
        g.setColor(new Color(248, 4, 74));
        g.setFont(new Font("楷体",Font.BOLD,30));
        g.drawString("得分:"+score,420,90);
        //游戏的最高分展示模块
        try {
            new HighestScore().readHighest();
        } catch (IOException e) {
            e.printStackTrace();
        }
        g.setColor(new Color(183, 25, 238));
        g.setFont(new Font("楷体",Font.BOLD,30));
        g.drawString("历史最高分:"+HighestScore.score,10,90);
        //蛇的速度提示
        g.setColor(new Color(248, 136, 36));
        g.setFont(new Font("楷体",Font.BOLD,30));
        g.drawString("当前速度:"+String.valueOf(110-time),550,90);
        //游戏的奖励鼓励机制
        if(score==10){
            g.setColor(new Color(127, 232, 20));
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("Good!",snakeX[0],snakeY[0]);
        }
        else if(score==50){
            g.setColor(new Color(17, 231, 250));
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("Good!!!",snakeX[0],snakeY[0]);
        }else if(score==100){
            g.setColor(new Color(248, 196, 6));
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("Perfect!!!",snakeX[0],snakeY[0]);
        }else if(score==200){
            g.setColor(new Color(248, 245, 26));
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("无人能挡!!!",snakeX[0],snakeY[0]);
        }
        //小蛇死亡时面板的绘制
        if(isDied){
            g.setColor(new Color(6, 115, 248));
            g.setFont(new Font("微软雅黑",Font.BOLD,30));
            g.drawString("你的小蛇已经死亡,按下空格重新开始!",170,330);
        }
    }
}

5.2.4 수업 시작

페이지의 전체적인 레이아웃과 프로그램의 입구입니다.

아아아아

위 내용은 Java로 Snake War 미니 게임을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제