**環境**  
Visual Studio 2019  
DXライブラリ  
C言語、C++

```

    #include "DxLib.h"
    
    int Key[256]; // キーが押されているフレーム数を格納する
    
    // キーの入力状態を更新する
    int gpUpdateKey() {
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
    
        for (int i = 0; i < 256; i++) {
            if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
                Key[i]++;     // 加算
            }
            else {              // 押されていなければ
                Key[i] = 0;   // 0にする
            }
        }
        return 0;
    }
    
    // プログラムは WinMain から始まります
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        SetGraphMode(1300, 680, 32); // ウィンドウの大きさを指定
        ChangeWindowMode(TRUE);
    
        if (DxLib_Init() == -1)        // ＤＸライブラリ初期化処理
        {
            return -1;            // エラーが起きたら直ちに終了
        }
    
        //キー取得用配列
        //char key[256];
        //1. 3x3マスの2次元配列
        int pos[][3] = {
            {0, 0, 0 },
            {0, 0, 0 },
            {0, 0, 0 }
        };
    
        int playerX = 0; // キャラのX座標
        int playerY = 300; // キャラのY座表
        //double a[2][2];//移動制限のための配列の変数
        int x = 0;
        int y = 0;
    
        //グラフィックハンドル格納用配列
        int gh[12];
        LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
        DrawGraph(playerX, playerY, gh[8], FALSE);// プレイヤーの画像を描画
    
        while (ScreenFlip() == 0 && ProcessMessage() == 0&& gpUpdateKey() == 0) {
    
            int 加算=70;
            int b = 70;
    
            // カーソルキーの右が押されている
            if (Key[KEY_INPUT_RIGHT]==1) {
    
                playerX = playerX + 加算; // プレイヤーのX座標を加算//左だけplayerX2とするとfor文ではないので、一回しか起きない、playerXだとplayerX = playerX + 加算より、加算されたあとのplayerXが再び右辺のplayerXに入り加算されるを繰り返すため∞に右に行けるのだ
                // 画面に出力
                ScreenFlip();
                // 画面をクリア
                ClearDrawScreen();
                // プレイヤーの画像を描画
    
                DrawGraph(playerX, playerY, gh[2], true);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。
            }
    
            else { while (DrawGraph(playerX, playerY, gh[8], true)); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
    
            if (Key[KEY_INPUT_UP] == 1) {
                playerY = playerY - b; // プレイヤーのY座標を加算
    
                // 画面に出力
                ScreenFlip();
                // 画面をクリア
                ClearDrawScreen();
                // プレイヤーの画像を描画
                DrawGraph(playerX, playerY, gh[5], true);
            }
    
            if (Key[KEY_INPUT_LEFT] == 1){
                playerX = playerX - 加算; // プレイヤーのX座標を加算
    
                // 画面をクリア
                ClearDrawScreen();
                // プレイヤーの画像を描画
                DrawGraph(playerX, playerY, gh[1], true);
    
            }
    
            if (Key[KEY_INPUT_DOWN] == 1) {
                playerY = playerY + b; // プレイヤーのY座標を加算
    
                // 画面に出力
                ScreenFlip();
                // 画面をクリア
                ClearDrawScreen();
                // プレイヤーの画像を描画
                DrawGraph(playerX, playerY, gh[11], true);
            }
    
        }
    
        DxLib_End();                // ＤＸライブラリ使用の終了処理
    
        return 0;                // ソフトの終了 
    
    }
    
```

**実行したいこと**  
ロックマンエグゼのようにキャラクターを3＊3マスを自由に移動できるようなプログラムをfor (y = 0;y < 3; y++) {  
for (x = 0; x < 3; x++) {を用いて可能にしようと思うのですが、どのようにして関数if
(Key[KEY_INPUT_RIGHT]==1) {}に加えればよいか悩んでいます。

以下に間違ってはいますが、私なりに書いたプログラムを書かせて頂きます。

```

    // カーソルキーの右が押されている
    if (Key[KEY_INPUT_RIGHT]==1) {
        playerX = playerX + 加算; 
        double[1][1]=playerX;
        // 画面に出力
        ScreenFlip();
        // 画面をクリア
        ClearDrawScreen();
        // プレイヤーの画像を描画
        DrawGraph(double[1][1], playerY, gh[2], true);
    }
    
```

右キーによりキャラが座標[1][1]に移動して、座標[1][1]での描画される画像は gh[2]となる。ことを表したプログラムです。これにfor (y =
0;y < 3; y++) {  
for (x = 0; x < 3; x++) {を加えれば、解決するのではないかと思っていたりします。  
以上のプログラムにおいて、なぜそのように置けないのか、もしプログラムのまま置くとしたら何が必要かを是非教えてほしいです。というのも今後の自己解決力を高めるためです。ご協力お願いいたします。

**もしforの文と配列で今回行いたいことを全コードを書いていただけるならば、なぜそのようにおけるのか引数を使う場合は（）、どんな処理をさせたいかは｛｝を使うなどのように細かく解説して頂けると今後の自己解決力に繋がるのでよろしくお願いいたします。**
CC BY-SA 4.0
2019-08-09T15:52:24.417
57278
2020-04-20T14:06:05.630
2019-08-10T06:45:40.470
3060
27296
question
c++ c cocos2d-x
ロックマンエグゼのような3＊3マスを移動できるようにしたい
質問の内容を理解できていなかったら申し訳なのですが、おそらくやりたいのは下のようなことでしょうか？

```

    if(Key[KEY_INPUT_LEFT] == 1){
      playerX = std::clamp(playerX + 加算, 0 * 加算, 2 * 加算);  //playerXは0*加算~2*加算の間を移動
    }
    
```

既にplayerX、playerYにはキャラの3*3マス上の座標を保持してありますよね。  
おそらくそれだけで十分なのであって、配列に入れる必要がないと思います。  
もしもプレイヤーが3*3マス上のどこにいるのかを知りたいのであれば、(playerX / 加算)で求まります。  
3*3の配列を使いたいのであれば、double型ではなくbool型やint型を使用して、プレイヤーのいる場所だけtrueにする（または1にする）みたいなのが有効かと思います。  
そしてif文を抜けてからDrawGraph、ScreenFlipをしましょう。  
ちなみにScreenFlipした後にすぐにClearDrawScreenすると何も表示されない気がします。画面に出力してすぐにクリアしているので。
CC BY-SA 4.0
2020-02-24T05:50:13.573
63316
2020-02-24T05:50:13.573
37855
57278
answer