#include "DxLib.h"
#include <stdlib.h> // rand()を使用する

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

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); // 描画面を裏画面にする

    const int OBJ_MAX = 100; // 物体の数
    int obj_x[OBJ_MAX], obj_y[OBJ_MAX]; // 物体の座標を代入する配列
    int obj_vx[OBJ_MAX], obj_vy[OBJ_MAX]; // x軸方向の速さ、y軸方向の速さを代入する配列
    int obj_col[OBJ_MAX]; // 色の値を代入する配列
    for (int i = 0; i < OBJ_MAX; i++) { // 座標、速さ、色を乱数で決める
        obj_x[i] = rand() % WIDTH;
        obj_y[i] = rand() % HEIGHT;
        obj_vx[i] = rand() % 11 - 5;
        obj_vy[i] = rand() % 11 - 5;
        int r = rand() % 192 + 64;
        int g = rand() % 192 + 64;
        int b = rand() % 192 + 64;
        obj_col[i] = GetColor(r, g, b);
    }

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

        for (int i = 0; i < OBJ_MAX; i++) { // forと配列でデータをまとめて処理する
            obj_x[i] = obj_x[i] + obj_vx[i]; // x座標を変化させる
            obj_y[i] = obj_y[i] + obj_vy[i]; // y座標を変化させる
            if (obj_x[i] < 0) obj_vx[i] = 5;       // 画面左端に達した時
            if (obj_x[i] > WIDTH) obj_vx[i] = -5;  // 画面右端に達した時
            if (obj_y[i] < 0) obj_vy[i] = 5;       // 画面上端に達した時
            if (obj_y[i] > HEIGHT) obj_vy[i] = -5; // 画面下端に達した時
            DrawCircle(obj_x[i], obj_y[i], 30, obj_col[i], TRUE); // 円を描く
        }

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

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