게임 프로그래밍 : C++에서 15 퍼즐을 만들어 보았습니다.

개요



네, 전회에 계속해서 콘솔 게임 프로그래밍이군요.
이번에는 더 간단합니다.
htps : // 코 m / 쵸모 ㎅ g 마 / ms / 52bd8b133b747cb603에 7

다음을 참고하면서 15퍼즐을 만들었습니다.
관장, 감사합니다! ! !
htps //w w. 요츠베. 이 m/와 tch? v = 요 Qt9RHy8 등

우선 잘 동작하고 있다고 합니다.
우선 15퍼즐로 놀던 적이 없었기 때문에, 이 게임의 조작법이나 공략법에 고전했습니다.
게임 플레이어로서 미숙한데 개발측으로 돌았습니다, 정말 죄송합니다.


16칸에 셔플 된 15개의 숫자를...


정렬!

소감



생각했습니다만, 톱다운에(설계→실장)이라고 하는 것이, 역시 깨끗한 코드 쓸 수 있는 생각이 듭니다.
상향식이라면 잠깐 움직이면서 즐길 수 있습니다만, main 함수에 있는 긴 것 같은 처리를 추출해, 함수화한다고 하는 것이 귀찮게 느낍니다(웃음)
「이제 움직이니까 좋잖아!」같은・・・
자신이 워터폴밖에 경험한 적이 없었기 때문에, 이런 것은 신선했습니다.
16칸의 범위 밖에 액세스하는 것에 대한 방어적 프로그래밍이라고 하는 것은, 곧바로 떠오릅니다만, 그러한 이시바시를 두드려 건너는 스타일이라면, 움직이는 곳까지 찾아가기 어려운 것일지도, 조금 생각해 봅니다 했다.

코드



모처럼이므로 코드를 게시합니다.
자유롭게 시험해 주세요.
정말은 코멘트라든지 네이밍이라도 조금 생각해, 초학자쪽을 알도록(듯이) 하고 싶습니다만・・・

C++적으로 기술되어 있지 않은 곳도 많다(구조체 사용한다면 클래스 사용할 수 있어!) 때문에, 조금 좀 수정해 가려고 생각합니다.
회귀 테스트하지 않는 아칸으로! ! !

※코드 리뷰 코멘트 받을 수 있으면 다행입니다

source.cpp
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

static const int BOARD_WIDTH = 4;
static const int BOARD_HEIGHT = 4;
static const int BLANK_NUMBER = 16;

int board[BOARD_HEIGHT][BOARD_WIDTH];

struct Vec2
{
    int x;
    int y;
};

Vec2 getBlankPosition();
void moveBlank(Vec2 argMovePosition);

int main()
{
    for (int y = 0; y < BOARD_HEIGHT; ++y)
    {
        for (int x = 0; x < BOARD_WIDTH; ++x)
        {
            board[y][x] = y * BOARD_HEIGHT + x + 1;
        }
    }

    srand(static_cast<int>(time(NULL)));

    for (int i = 0; i < 1000; ++i)
    {
        Vec2 blankPosition = getBlankPosition();
        Vec2 movePosition = blankPosition;

        switch (rand() % BOARD_HEIGHT)
        {
        case 0:
            ++(movePosition.y);
            break;
        case 1:
            --(movePosition.y);
            break;
        case 2:
            ++(movePosition.x);
            break;
        case 3:
            --(movePosition.x);
            break;
        }

        moveBlank(movePosition);
    }

    while (1)
    {
        system("cls");
        std::cout << "+--+--+--+--+" << std::endl;
        for (int y = 0; y < BOARD_HEIGHT; ++y)
        {
            for (int x = 0; x < BOARD_WIDTH; ++x)
            {
                if (BLANK_NUMBER == board[y][x])
                {
                    std::cout << "|  ";
                }
                else
                {
                    std::cout << "|" << std::setw(2) << board[y][x];
                }
            }
            std::cout << "|" << std::endl;
            std::cout << "+--+--+--+--+" << std::endl;
        }

        bool isClear = true;
        for (int y = 0; y < BOARD_HEIGHT; ++y)
        {
            for (int x = 0; x < BOARD_WIDTH; ++x)
            {
                if (board[y][x] != y * BOARD_HEIGHT + x + 1)
                {
                    isClear = false;
                }
            }
        }

        if (true == isClear)
        {
            std::cout << "Clear!" << std::endl;
        }

        Vec2 blankPosition = getBlankPosition();
        Vec2 movePosition = blankPosition;

        switch (_getch())
        {
        case 'w':
            ++(movePosition.y);
            break;
        case 's':
            --(movePosition.y);
            break;
        case 'a':
            ++(movePosition.x);
            break;
        case 'd':
            --(movePosition.x);
            break;
        }

        moveBlank(movePosition);

    }
    _getch();
    return 0;
}

Vec2 getBlankPosition()
{
    Vec2 blankPosition = { -1, -1 };

    for (int y = 0; y < BOARD_HEIGHT; ++y)
    {
        for (int x = 0; x < BOARD_WIDTH; ++x)
        {
            if (BLANK_NUMBER == board[y][x])
            {
                blankPosition = { x ,y };
            }
        }
    }

    return blankPosition;
}

void moveBlank(Vec2 argMovePosition)
{
    if (argMovePosition.x < 0 || argMovePosition.x >= BOARD_WIDTH || argMovePosition.y < 0 || argMovePosition.y >= BOARD_HEIGHT)
    {
        return;
    }

    Vec2 blankPosition = getBlankPosition();

    // swapping
    int tempBlank = board[blankPosition.y][blankPosition.x];
    board[blankPosition.y][blankPosition.x] = board[argMovePosition.y][argMovePosition.x];
    board[argMovePosition.y][argMovePosition.x] = tempBlank;
}

좋은 웹페이지 즐겨찾기