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

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

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

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

Q&A

解決済

3回答

2085閲覧

C言語 脱出ゲームを作る

user_616853

総合スコア1

C

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

0グッド

0クリップ

投稿2021/07/20 01:17

編集2021/07/20 01:23

前提・実現したいこと

++++++

  • +

+#  +

  • +
  • +
  •   p+

++++++
[1:左,2:上,3:下,4:右]?
ここに数字を入れるとPが動くプログラムを作っているのですが、 (1,4)と(4,1)の位置は到着したタイミングでもう片方の座標ワープする。というのができません。

該当のソースコード

#include <stdio.h> int main(int argc,char*argv[]) { int w = 6, h = 7; int px = 4, py = 5; int gx = 1, gy = 2; for(int i = 0; i < w; i++){ printf("+"); } printf("\n"); for(int i = 1; i < (h - 1); i++){ printf("+"); for(int j = 1; j < (w - 1) ; j++){ if(i == py && j == px){ printf("p"); } else if(i == gy && j == gx){ printf("#"); } else{ printf(" "); } } printf("+\n"); } for(int i = 0; i < w; i++){ printf("+"); } printf("\n"); while(1){ int input; printf("[1:左,2:上,3:下,4:右]?"); scanf("%d",&input); if(input == 1){ px = px - 1; } else if(input == 2){ py = py - 1; } else if(input == 3){ py = py + 1; } else if(input == 4){ py = px + 1; } for(int i = 0; i < w; i++){ printf("+"); } printf("\n"); for(int i = 1; i < (h - 1); i++){ printf("+"); for(int j = 1; j < (w - 1) ; j++){ if(i == py && j == px){ printf("p"); } else if(i == gy && j == gx){ printf("#"); } else{ printf(" "); } } printf("+\n"); } for(int i = 0; i < w; i++){ printf("+"); } printf("\n"); if(px == gx && py == gy){ printf("脱出成功\n"); break; } } return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2021/07/20 01:19

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
thkana

2021/07/20 01:21

> というのができません。 そうですか。それでなにをしろ、と? こう考えればどうでしょう、というと「ごちゃごちゃ言わずにそのまま動くプログラムを寄越せ」と怒り出す人も時々いるので、あなたが何を求めているのかの確認です。
BeatStar

2021/07/20 01:21

コードは (```ソースコード```)の中に書きましょう。(Markdown方式) もしくは "<code>"または"<コード>"のボタンを押して出てくるヤツの中に書きましょう。 今のままでは読みづらいです。 修正できるので修正しましょう。
y_waiwai

2021/07/20 01:23

> 到着したタイミングでもう片方の座標ワープする。というのができません。 なにをしたいのかイマイチわかりません。もちっと具遺体的に説明しよう
user_616853

2021/07/20 01:26

例えば左、左、左と行ってPの位置が(1.4)に来ると(4.1)に移るプログラムを教えて欲しいです。
退会済みユーザー

退会済みユーザー

2021/07/20 01:55 編集

ご確認下さい。 [推奨していない質問] https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
fana

2021/07/20 02:27

正直,解決すべき課題がどこにあるのかが謎すぎる. この人は既に > if(px == gx && py == gy) とかいう座標判定を既に書いているのだし, 移動する(=座標を変更する)処理も書いているわけで. だったら「 (1,4) がどうの」いう話は楽勝で書けるんちゃうの? 何なの? マジで何なの?
退会済みユーザー

退会済みユーザー

2021/07/20 02:43

どうせ課題か演習問題かのサンプルコードのコピペでしょう。自分で書いてたらこのような質問はしない。
K_3578

2021/07/20 03:03

BeatStarさんの回答へのコメントを見るに結局動くコードを寄越せってタイプっぽいですね
guest

回答3

0

ベストアンサー

私の過去回答を参考にしてください。(必ず読んでください!!)

どこまでできましたか?

(ソースコード読めばわかるのかもしれないが、インデントが無視されているので読む気失せる……)
(修正されたためここも修正)

日本語でも英語でもいいのでまずは説明してほしいです。(どこまで理解できているかも含めて)

ざっと見た感じ、内容物( 壁とか ) をべた書きしているような感じですが、
今回のような場合は「配列」を使うといいですよ。

厳密には『二次元配列』ですね。

多次元配列」や「二次元配列」の項目があるはずなので調べてください。

そうすれば、

1. 表示 2. 入力を受け付ける 3. 入力されたら 3.1. 駒を進めて再出力

質問にあるものだと、毎回似たような処理を繰り返すことになります。

例えば左、左、左と行ってPの位置が(1.4)に来ると(4.1)に移るプログラムを教えて欲しいです。

まず、今回のようなやつは『規則性を見付ける』といいです。

今回は (1,4) -> (4,1) だけでいいのでしょうか。

それとも、"壁の側に来たら次の行に移動する" 的なものでしょうか。
(今回は"次の行"じゃなくて、"行と列を入れ替えた場所" のように見えますが……)

それぞれやり方が変わってきます。

たとえば、(1,4) -> (4,1) なら、「(1,4)なら(4,1)に移動する」とif文で書けばいいだけです。

でも「壁の側に来たら~」とかであれば、上記の「(1,4)なら~」のようなことをすると、if文を何度も書く必要が出てくる。
8×8とかならいいけど、100×100とかだったらどうなるのでしょうか。
面倒ですね。

なので、「規則性を見付ける」ですね。

壁の側…… それぞれ列挙してみてください。

壁の側 = { (1,1), (1,4), (2,1), (2,4), (3,1), (3,4) ... }

それぞれ規則性を見付けましょう。

X = { (行が1), (列が4), (行が1), (列が4), ... }

となっていますね。

※ 他の組み合わせと比較したり、行と列を比較したりとかです。

そうすると、「行 が 1 となる」か、「列が 4 となる」のどれかになっていますね。

これを実装すればいいだけです。

頑張ってください! (^_^)/


[追記1]

(1.4) <-> (4.1)だけでいいです。
そのif文の書き方を教えていただきたいです。

(1,4) ⇔ (4,1) の場合も規則性を見付けましょう

他の場所( たとえば (1,3)とか(3,2)とか ) 等と比較してみましょう。

「どういう時に移動したいか」です。

そうすると、「"行が1" で "列が4" のとき」か「"行が4" で "列が1" のとき」ですよね。

それを書けばいいだけです。

数Aの「集合と論理」でやる『かつ』『または』とかを使って考えてみましょう。

移動の仕方も規則性で出来ます。

(1,4) → (4,1)
(4,1) → (1,4)

数字に着目してください。

『行と列が入れ替わっています』よね?

これを実装すればいいだけです。

投稿2021/07/20 01:41

編集2021/07/20 01:56
BeatStar

総合スコア4958

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

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

user_616853

2021/07/20 01:49

丁寧な回答ありがとうございます。 日本語不自由ですみません。 (1.4) <-> (4.1)だけでいいです。 そのif文の書き方を教えていただきたいです。
guest

0

例えば左、左、左と行ってPの位置が(1.4)に来ると(4.1)に移るプログラムを教えて欲しいです。

まずは進行方向に壁がある、というのを判定しよう。
上の場合、下の場合、右の場合、左の場合。

そして、壁があると判定された場合に、その反対側へ行くようにコードを書けばいいです

投稿2021/07/20 01:31

y_waiwai

総合スコア87800

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

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

0

左壁にぶつかったら右壁から出てきたいんですよね?

C

1 if(input == 1){ 2 px = px - 1; 3 if ( px が左端 ) { px = 右端-1; } // ←コレ追加すればよくね? 4 } 5 else if(input == 2){ 6 py = py - 1; 7 // ここも同様 8 } 9 else if(input == 3){ 10 py = py + 1; 11 // ここも同様 12 } 13 else if(input == 4){ 14 py = px + 1; 15 // ここも同様 16 }

投稿2021/07/20 01:29

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問