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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2900閲覧

加算をfor文で2回加え、結果を配列[2][0]に入れたい

carnage0216

総合スコア194

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/09 20:12

編集2019/08/09 21:51
#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); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { 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 加算=40; int b = 40; // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) { for (int x = 0; x < 3; x++) { playerX = playerX +加算; if (playerX == x && playerY == y) { // プレイヤーの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(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }

以上のプログラムは合っているかわかりませんが、何を行いたいのか明確に書かせて頂きます。
int型の関数aの横移動(横に40加算する)をfor(int x=0;x<3;x++)により横には2回しか[0][0]と[1][0]と進み、その先の[2][0]に演算後a(=80)を代入したいです。

どうもfor文のxを使い加算する回数を2回で、かつ、[0]〜[2]のx座標内の範囲に出来ないため困っています。
どうか教えてください。

編集
もしかしたらint 加算=40;なしに3*3のマスのプロラグムが作れるかもしれません。
要は画像の最初の位置は[1][1]なので、if (Key[KEY_INPUT_RIGHT] == 1)より右のキーが押されたら[2][1]に進むように作りたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/08/09 20:24

「aに加算=40」とはどのような操作でしょうか? たとえばa=0からスタートし、そのような操作を2回おこなうとaはいくつになりますか? 「aのある場所の座標を[2][0]にしたい」においてaのある場所とはどこのことでしょうか?
carnage0216

2019/08/09 20:34

わかりにくくてすいません。 配列を座標と見立てて、演算後のaを配列[2][0]に収納したいです。
gentaro

2019/08/09 20:57

文章が全般的に意味不明すぎてよくわかりませんでした。 ・例示されたコードに配列が登場しないのはなぜか ・「加算=40」とは何か(「加算」とは変数名のつもりなのか) ・「aのある場所の座標を[2][0]にしたい」とは「配列[2][0]にaを代入する」という意味なのか ・「if(a==x&& b==y)よりaが必ず[0]〜[2]のx座標内の範囲にある」とはどういう意味か ・「xを使い加算する回数を2回」というのは、単にxの二倍を加算するのとどう違うのか ・そもそもfor文を使いたい意図は何か 具体的な値と、各処理フローごとの値の変化を例示すればもうちょっとヒントになるかもしれませんけど…。
carnage0216

2019/08/09 21:06

すいません。 書き直します。
Zuishin

2019/08/09 21:53

WinMain で加算してもキャラは動きませんよ。キー入力を示すメッセージを受け取れるようにして受け取った時にそれに合わせて加算するんです。for は使いません。タイマーを使います。 はっきり言ってこれはあなたの理解できる範疇を大幅に超えているので、数当てゲームから作ったほうがいいと思いますね。
carnage0216

2019/08/09 22:11

forを使ってできると思ったのですが、残念です。
Zuishin

2019/08/09 23:11

for 以前の問題です。どこからコピペしてつなぎ合わせたのか知りませんが、使える部分がほとんどありません。最初から全部作り直しです。
jimbe

2019/08/10 03:11

> 何を行いたいのか明確に書かせて頂きます 残念ながら, carnage0216 さんの思っておられる動作の説明表現が独特で, 明確ではありません. 折角コードをご提示いただいているので, そのコードのどの部分で(どのタイミング)でどの変数がどういう値になって欲しいのか, ゲーム画面での縦横といった表現では無く, 変数の変化でご説明頂けないでしょうか. 最後に「int 加算=40;なしに 3x3 のマスのプログラムが」と言われていますが, もしやこのコードのゲーム自体 3x3 マスのフィールド内を移動するようなモノなのでしょうか.
Bull

2019/08/10 07:34

本題とは関係ないことかもしれませんが、DXライブラリーを使ったプログラムにはそれなりの書き方があります。例えば https://dixq.net/g/h_11.html このページの「不適切な実装3. あちこちにDXライブラリ3大処理がある」 に指摘されている ScreenFlip と ClearDrawScreen がループ内に複数書かれています。 まずは基本的なことを理解すべきではないかと思います。 このサイトの「新・ゲームプログラミングの館」には基本的なことが丁寧に説明されています。一度目を通してみてはいかがでしょうか。
guest

回答1

0

ベストアンサー

要は以下のようなコードの動作を想定されているのでしょうか.

切り貼りしただけで, 各関数の仕様確認やコンパイル等一切しておりません

c

1 int playerX = 40, playerY = 40; // プレイヤーの座標 2 3 const int PLAYER_DX = 40; // プレイヤーのX座標変化値 4 const int PLAYER_DY = 40; // プレイヤーのY座標変化値 5 6 SetDrawScreen(DX_SCREEN_BACK); //裏使用 7 8 while(ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) { 9 10 int playerGH = gh[8]; // 表示する画像 11 12 if (Key[KEY_INPUT_RIGHT] == 1) { // 右 13 if(playerX < 80) playerX += PLAYER_DX; //80以上にならない 14 playerGH = gh[12]; 15 16 } else if (Key[KEY_INPUT_UP] == 1) { // 上 17 if(playerY > 0) playerY -= PLAYER_DY; 18 playerGH = gh[5]; 19 20 } else if (Key[KEY_INPUT_LEFT] == 1){ // 左 21 if(playerX > 0) playerX -= PLAYER_DX; 22 playerGH = gh[1]; 23 24 } else if (Key[KEY_INPUT_DOWN] == 1) { // 下 25 if(playerY < 80) playerY += PLAYER_DY; 26 playerGH = gh[11]; 27 } 28 29 ClearDrawScreen(); //クリア 30 DrawGraph(playerX, playerY, playerGH, false); //裏描画 31 }

投稿2019/08/10 04:10

jimbe

総合スコア12612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2019/08/10 11:28

ありがとうございます。 コンパイルエラーは出ますが、どのようなプログラムなのか読んでみます。
carnage0216

2019/08/10 11:33

できればコンパイルエラーの無い場合でのが欲しかったですが、頑張って自分で後の部分を作ります。
jimbe

2019/08/10 18:00

これはご提示されたコードの while 周辺だけですので, これだけでは実行できません. 念のため. 読むというほどのボリュームはありません. 3x3 のフィールド内のみをカーソルキーで移動できるということにして, 各フィールドの座標がXYとも 0,40,80 となっているだけです. Dx の環境がありませんので, 確認はしませんでした. 座標値の計算で混乱されているようで, Dx とは関係無い(Dxの使い方が合っているかはまた別の問題)様でしたので.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問