게임 개발 채널

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>


#define MAP_SIZE_X 20

#define MAP_SIZE_Y 20

#define NUM_WALLS 0

#define NUM_ROOMS 8

#define MAX_ROOM_SIZE 6

#define MIN_ROOM_SIZE 4


typedef struct {

    int x;

    int y;

} Position;


typedef struct {

    int width;

    int height;

    Position position;

} Room;


typedef struct {

    char symbol;

    Position position;

} Entity;


typedef struct {

    char map[MAP_SIZE_X][MAP_SIZE_Y];

    Entity player;

    Entity enemy;

    Position stairs;

    Position walls[NUM_WALLS];

    Room rooms[NUM_ROOMS];

    int currentFloor;

} Game;


void initializeGame(Game* game) {

    // 맵 초기화

    for (int x = 0; x < MAP_SIZE_X; x++) {

        for (int y = 0; y < MAP_SIZE_Y; y++) {

            if (x == 0 || y == 0 || x == MAP_SIZE_X - 1 || y == MAP_SIZE_Y - 1) {

                game->map[x][y] = '#';

            }

            else {

                game->map[x][y] = '.';

            }

        }

    }


    // 방 초기화

    srand(time(NULL));

    for (int i = 0; i < NUM_ROOMS; i++) {

        int roomWidth = rand() % (MAX_ROOM_SIZE - MIN_ROOM_SIZE + 1) + MIN_ROOM_SIZE;

        int roomHeight = rand() % (MAX_ROOM_SIZE - MIN_ROOM_SIZE + 1) + MIN_ROOM_SIZE;

        int roomX = rand() % (MAP_SIZE_X - roomWidth - 2) + 1;

        int roomY = rand() % (MAP_SIZE_Y - roomHeight - 2) + 1;

        game->rooms[i].width = roomWidth;

        game->rooms[i].height = roomHeight;

        game->rooms[i].position.x = roomX;

        game->rooms[i].position.y = roomY;


        // 방 내부를 '.'으로 채우기

        for (int x = roomX; x < roomX + roomWidth; x++) {

            for (int y = roomY; y < roomY + roomHeight; y++) {

                game->map[x][y] = '.';

            }

        }

    }


    // 플레이어 초기화

    game->player.symbol = '@';

    game->player.position.x = game->rooms[0].position.x + game->rooms[0].width / 2;

    game->player.position.y = game->rooms[0].position.y + game->rooms[0].height / 2;

    game->map[game->player.position.x][game->player.position.y] = game->player.symbol;


    // 적 초기화

    game->enemy.symbol = rand() % 9 + 1 + '0'; // 1부터 9까지 랜덤한 숫자로 적의 텍스트 지정

    game->enemy.position.x = game->rooms[NUM_ROOMS - 1].position.x + game->rooms[NUM_ROOMS - 1].width / 2;

    game->enemy.position.y = game->rooms[NUM_ROOMS - 1].position.y + game->rooms[NUM_ROOMS - 1].height / 2;

    game->map[game->enemy.position.x][game->enemy.position.y] = game->enemy.symbol;


    // 계단 초기화

    int randomRoomIndex = rand() % NUM_ROOMS;

    int randomX = rand() % (game->rooms[randomRoomIndex].width - 2) + game->rooms[randomRoomIndex].position.x + 1;

    int randomY = rand() % (game->rooms[randomRoomIndex].height - 2) + game->rooms[randomRoomIndex].position.y + 1;

    game->stairs.x = randomX;

    game->stairs.y = randomY;

    game->map[randomX][randomY] = '>';


    // 현재 층 초기화

    game->currentFloor = 1;

}


void printMap(Game* game) {

    printf("Current Floor: %d\n", game->currentFloor);

    for (int y = 0; y < MAP_SIZE_Y; y++) {

        for (int x = 0; x < MAP_SIZE_X; x++) {

            printf("%c ", game->map[x][y]);

        }

        printf("\n");

    }

}


void movePlayer(Game* game, int dx, int dy) {

    // 이동할 위치 계산

    int new_x = game->player.position.x + dx;

    int new_y = game->player.position.y + dy;


    // 이동 가능한지 체크

    if (game->map[new_x][new_y] != '#') {

        // 플레이어 이동

        game->map[game->player.position.x][game->player.position.y] = '.';

        game->player.position.x = new_x;

        game->player.position.y = new_y;


        // 계단에 도착했는지 체크

        if (new_x == game->stairs.x && new_y == game->stairs.y) {

            game->currentFloor++;

            initializeGame(game);

            return;

        }


        game->map[game->player.position.x][game->player.position.y] = game->player.symbol;

    }

}


void displayInventory() {

    printf("인벤토리\n");

    printf("아이템 1\n");

    printf("아이템 2\n");

    printf("아이템 3\n");

}


void displayPlayerInfo() {

    printf("내 정보\n");

    printf("레벨: 10\n");

    printf("체력: 100/100\n");

    printf("공격력: 50\n");

    printf("방어력: 30\n");

}


void displayOpeningScreen() {

    printf("=== 게임 오프닝 화면 ===\n");

    printf("게임을 시작하려면 아무 키나 누르세요.\n");

    getch();

}


int main() {

    displayOpeningScreen();


    Game game;

    initializeGame(&game);


    while (1) {

        printMap(&game);


        // 플레이어 입력 받기

        char input = getch();


        // 종료 조건 확인

        if (input == 'Q' || input == 'q') {

            break;

        }

        else if (input == 'E' || input == 'e') {

            displayInventory();

            displayPlayerInfo();

        }


        // 플레이어 이동 처리

        switch (input) {

            case 'W':

            case 'w':

                movePlayer(&game, 0, -1);

                break;

            case 'A':

            case 'a':

                movePlayer(&game, -1, 0);

                break;

            case 'S':

            case 's':

                movePlayer(&game, 0, 1);

                break;

            case 'D':

            case 'd':

                movePlayer(&game, 1, 0);

                break;

            default:

                printf("잘못된 입력입니다.\n");

                break;

        }

    }


    return 0;

}


ai가 틀 짜준거 수정중...


피드백 받음