#include "DxLib.h"

const int WIDTH = 960, HEIGHT = 640; // ウィンドウの幅と高さのピクセル数

const int CSIZE = 48; // 1マスの大きさ（ピクセル数）
const int ROW = 10; // 縦に並ぶマスの数
const int COL = 17; // 横に並ぶマスの数
char maze[ROW][COL] = { // 迷路の構造 0が床、1が壁
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1},
    {1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1},
    {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1},
    {1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1},
    {1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1},
    {1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
    {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
    {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

bool checkWall(int x, int y) { // ウィンドウ上の座標(x,y)が壁かを調べる関数
    int row = y / CSIZE; // 行のインデックス（添え字）
    int col = x / CSIZE; // 列のインデックス（添え字）
    if (maze[row][col] == 1) return true; // 座標(x,y)が壁ならtrueを返す
    return false; // 壁でなければfalseを返す
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // ＤＸライブラリを使用する準備
    SetWindowText("ゲーム開発のアルゴリズム"); // ウィンドウのタイトル
    SetGraphMode(WIDTH, HEIGHT, 32); // ウィンドウの大きさとカラービット数の指定
    ChangeWindowMode(TRUE); // ウィンドウモードで起動
    if (DxLib_Init() == -1) return -1; // ライブラリ初期化 エラーが起きたら終了
    SetBackgroundColor(0, 0, 0); // 背景色の指定
    SetDrawScreen(DX_SCREEN_BACK); // 描画面を裏画面にする

    int img_player = LoadGraph("image_Chapter12/dungeon/player.png"); // 変数にキャラクターの画像を読み込む
    int img_chip[2] = { // 配列にマップチップを読み込む
        LoadGraph("image_Chapter12/dungeon/floor.png"),
        LoadGraph("image_Chapter12/dungeon/wall.png")
    };

    int pl_x = 48; // ┬ キャラクターのx座標とy座標を代入する変数
    int pl_y = 48; // ┘ (pl_x, pl_y)が画像を表示する左上角の座標になる

    while (true) { // メインループ
        ClearDrawScreen(); // 画面をクリアする

        // カーソルキーでキャラクターを動かす
        if (CheckHitKey(KEY_INPUT_UP)) { // 上キー
            if (checkWall(pl_x, pl_y - 4) == false && checkWall(pl_x + 19, pl_y - 4) == false) pl_y -= 4;
        }
        if (CheckHitKey(KEY_INPUT_DOWN)) { // 下キー
            if (checkWall(pl_x, pl_y + 27) == false && checkWall(pl_x + 19, pl_y + 27) == false) pl_y += 4;
        }
        if (CheckHitKey(KEY_INPUT_LEFT)) { // 左キー
            if (checkWall(pl_x - 4, pl_y) == false && checkWall(pl_x - 4, pl_y + 23) == false) pl_x -= 4;
        }
        if (CheckHitKey(KEY_INPUT_RIGHT)) { // 右キー
            if (checkWall(pl_x + 23, pl_y) == false && checkWall(pl_x + 23, pl_y + 23) == false) pl_x += 4;
        }

        // 迷路を描く
        for (int y = 0; y < ROW; y++) { // 外側のfor
            for (int x = 0; x < COL; x++) { // 内側のfor
                int cx = x * CSIZE; // ウィンドウ上のx座標
                int cy = y * CSIZE; // ウィンドウ上のy座標
                DrawGraph(cx, cy, img_chip[maze[y][x]], FALSE); // マップチップを表示する
            }
        }
        DrawGraph(pl_x, pl_y, img_player, TRUE); // キャラクターを表示する
        DrawFormatString(0, 600, 0xffffff, "pl_x=%d", pl_x); // ┬ 座標を表示する
        DrawFormatString(0, 620, 0xffffff, "pl_y=%d", pl_y); // ┘

        ScreenFlip(); // 裏画面の内容を表画面に反映させる
        WaitTimer(33); // 一定時間待つ
        if (ProcessMessage() == -1) break; // Windowsから情報を受け取りエラーが起きたら終了
        if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break; // ESCキーが押されたら終了
    }

    DxLib_End(); // ＤＸライブラリ使用の終了処理
    return 0; // ソフトの終了
}