본문 바로가기

자바(java)

미로 탐험 게임: 미로 내에서 캐릭터를 움직여 목적지에 도달하는 게임을 제작합니다.

반응형

미로 탐험 게임: 자바 구현

1. 내용 설명

미로 탐험 게임은 플레이어가 미로를 통과하여 목적지에 도달해야 하는 게임입니다. 플레이어는 키보드 입력을 통해 캐릭터를 조종하며, 미로의 벽에 부딪히지 않고 길을 찾아야 합니다. 목적지에 도달하면 게임이 종료됩니다.

2. 프로그램 간 사용 함수 설명

  • createAndShowGUI(): 게임의 GUI를 생성하고 표시합니다.
  • initializeMaze(): 미로의 초기 상태를 설정합니다.
  • movePlayer(): 플레이어의 움직임을 처리합니다.
  • checkWinCondition(): 목적지에 도달했는지 확인합니다.

3. 코딩 내용

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MazeGame {
    private JFrame frame;
    private int[][] maze = {
        {1, 1, 1, 1, 1, 1, 1},
        {1, 0, 0, 0, 0, 0, 1},
        {1, 0, 1, 1, 1, 0, 1},
        {1, 0, 1, 0, 0, 0, 1},
        {1, 0, 1, 1, 1, 0, 1},
        {1, 0, 0, 0, 1, 0, 1},
        {1, 1, 1, 0, 1, 1, 1}
    };
    private Point playerPosition = new Point(1, 1);
    private Point goalPosition = new Point(5, 5);
    private JLabel[][] mazeLabels;

    public MazeGame() {
        createAndShowGUI();
    }

    private void createAndShowGUI() {
        frame = new JFrame("Maze Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLayout(new GridLayout(maze.length, maze[0].length));

        initializeMaze();
        frame.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                movePlayer(e.getKeyCode());
            }
        });

        frame.setFocusable(true);
        frame.setVisible(true);
    }

    private void initializeMaze() {
        mazeLabels = new JLabel[maze.length][maze[0].length];
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++) {
                JLabel label = new JLabel();
                label.setOpaque(true);
                label.setBackground(maze[i][j] == 1 ? Color.BLACK : Color.WHITE);
                mazeLabels[i][j] = label;
                frame.add(label);
            }
        }
        updatePlayerPosition(playerPosition);
    }

    private void movePlayer(int keyCode) {
        Point newPosition = new Point(playerPosition);
        switch (keyCode) {
            case KeyEvent.VK_UP:
                newPosition.translate(-1, 0);
                break;
            case KeyEvent.VK_DOWN:
                newPosition.translate(1, 0);
                break;
            case KeyEvent.VK_LEFT:
                newPosition.translate(0, -1);
                break;
            case KeyEvent.VK_RIGHT:
                newPosition.translate(0, 1);
                break;
        }
        if (isValidMove(newPosition)) {
            updatePlayerPosition(newPosition);
            checkWinCondition();
        }
    }

    private boolean isValidMove(Point newPosition) {
        return newPosition.x >= 0 && newPosition.x < maze.length
            && newPosition.y >= 0 && newPosition.y < maze[0].length
            && maze[newPosition.x][newPosition.y] == 0;
    }

    private void updatePlayerPosition(Point newPosition) {
       // Clear previous player position
       mazeLabels[playerPosition.x][playerPosition.y].setBackground(Color.WHITE);
    
       // Update to new position
       playerPosition.setLocation(newPosition);
       mazeLabels[playerPosition.x][playerPosition.y].setBackground(Color.BLUE);
    }

    private void checkWinCondition() {
        if (playerPosition.equals(goalPosition)) {
            JOptionPane.showMessageDialog(frame, "You win!");
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MazeGame());
    }
}

 

4. 전문용어

  • JFrame: 자바 Swing의 주요 창 컨테이너입니다.
  • GridLayout: 컴포넌트들을 격자 형태로 배치하는 레이아웃 관리자입니다.
  • KeyListener: 키보드 이벤트를 처리하기 위한 리스너 인터페이스입니다.
  • Point: 2D 좌표를 나타내는 클래스입니다.

5. 라이브러리 추가 및 실행 방법

  • 본 프로그램은 자바 표준 라이브러리의 Swing 컴포넌트를 사용합니다.

컴파일:
javac MazeGame.java

 

실행:
java MazeGame

반응형