質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

解決済

右のキーを押した際に配列で移動可能か判断して、一マス右に移動できるようにしたい。

carnage0216
carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

4回答

0評価

1クリップ

287閲覧

投稿2019/08/20 15:01

編集2019/08/22 02:48

環境

  • Windows10
  • visual studio 2019
  • DXライブラリ

行いたいこと
例えばプログラムに書いてある座標(nx,ny)=(2,2)に位置するキャラが右に動く際にnx=nx+1にnx=2を代入させて、idou[nx + 1][ny + 0] は
idou[3][2] となり、配列idou[5][5]よりidou[3][2] の座標の位置は0なので移動可能となり、キャラが描画できるというプログラムを作りたいです。
以上の説明はあくあで一例です。出来れば、以上をループのようにして、どの座標からでも右のキーを押すたびに配列idou[nx + 1][ny + 0]から右に移動可能か判断して右に一マス進むようにしたいです。

これは、自分なりに以下のようにプログラムを作りました。ですがうまく機能していません。
出来ればプログラムの原型を崩さずに右キーを押すたびに右に一マス動けるようにしたいです。

if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == idou[3][0]) {// 移動可能にして、その座標に移動する nx = nx + 1; nx == 3; idou[nx + 1][ny + 0] == idou[3][2]; playerphoto = gh[7]; }

そして、以下は全体のプログラムです。

#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(1600, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); int playerphoto; int nx=2, ny =2 ; // 最初のキャラのX座をdxとY座標をdyである。配列の真ん中の0を最初の座標としたため(2,2)となる if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //1. 3x3マスの2次元配列 int idou[5][5] = { {1,1,1,1,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,1,1,1,1 }, }; //DrawGraph(dx, dy, playerphoto, FALSE); //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);//画像読み込み SetDrawScreen(DX_SCREEN_BACK); while (ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) { DrawGraph(nx, ny, gh[5], FALSE);// プレイヤーの画像を描画 // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) { if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == idou[3][0]) {// 移動可能にして、その座標に移動する nx = nx + 1; nx == 3; idou[nx + 1][ny + 0] == idou[3][2]; playerphoto = gh[7]; } else if (nx == 1 && idou[nx + 1] == idou[2]) { // 移動不可能 playerphoto = gh[9]; } if (Key[KEY_INPUT_LEFT] == 1) { nx = nx - 1; playerphoto = gh[2]; } if (Key[KEY_INPUT_UP] == 1) { ny = ny + 1; playerphoto = gh[4]; } if (Key[KEY_INPUT_DOWN] == 1) { ny = ny - 1; playerphoto = gh[3]; } if (nx == 0 && ny == 0) { playerphoto = gh[7]; } ScreenFlip(); // 画面をクリア ClearDrawScreen(); DrawGraph(nx, ny, playerphoto, FALSE); } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }

編集が遅くなりました。すいません。jimbeさんのプログラムをそのまま入れてみました。ですが、思うように動きませんでした。もしかしたら組み込む場所が違ったのかもしれません。

#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(1600, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); int playerphoto; int nx=2, ny =2 ; // 最初のキャラのX座をdxとY座標をdyである。配列の真ん中の0を最初の座標としたため(2,2)となる if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //1. 3x3マスの2次元配列 int idou[5][5] = { {1,1,1,1,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,1,1,1,1 }, }; //DrawGraph(dx, dy, playerphoto, FALSE); //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);//画像読み込み SetDrawScreen(DX_SCREEN_BACK); while (ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) { DrawGraph(nx, ny, gh[5], FALSE);// プレイヤーの画像を描画 // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) { //①if (idou[ny + 1][nx + 1]) {nx==0,}//紙を読む nx==0でidou[nx + 1]がidou[1]の時移動可能にして、その座標に移動する、nx==1でidou[nx + 1]がidou[2]の時移動不可能と //①のidou[ny + 1][nx + 1]を利用してif文で書きたいが、idou[ny + 1][nx + 1]を単体でidou[ny + 1]として使えるか? if (idou[nx + 1][ny + 0] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx + 1; //移動 playerphoto = gh[7]; } else { // 移動不可能 playerphoto = gh[9]; } if (Key[KEY_INPUT_LEFT] == 1) { nx = nx - 1; playerphoto = gh[2]; } if (Key[KEY_INPUT_UP] == 1) { ny = ny + 1; playerphoto = gh[4]; } if (Key[KEY_INPUT_DOWN] == 1) { ny = ny - 1; playerphoto = gh[3]; } if (nx == 0 && ny == 0) { playerphoto = gh[7]; } ScreenFlip(); // 画面をクリア ClearDrawScreen(); DrawGraph(nx, ny, playerphoto, FALSE); } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }

編集
入門書を見るなりしてjimbeさんから頂いたコードを正しく使おうとやっているのですが
どうもうまくいきません。
条件文としては正しいと思うのですが
右のキーが押される&右のマスが0という条件で
写真[7]を表示するプログラムとして

if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx + 1; //移動 playerphoto = gh[7]; } else { // 移動不可能 playerphoto = gh[9]; } } と書いたんですが、うまくいきません。

jimbeさんのプログラム正しかったです。キャラの移動を50倍してみると正しく機能していることがわかりました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。