課題でこのような問題が出たのですが、途中までしか分からなくて・・・
[ まず,3×3の全マス目の初期状態を1~6の並び番号付きでコンソールに表示する.
次に,キーボードからシフト回数を入力する.
入力された回数だけ,シフト処理を繰り返し実行する.
(1) 1~6の並びのうちの1つをランダムに選び,その並びのシフト方向(-1 または +1)をランダムに決定する.
(2) 上記(ⅰ)の並びに対し,決定した方向のシフト操作でのシャッフルを実行する.
(3) シフトされた結果を表示する.なお,選択された並び番号及びシフト方向も併せて表示する.
(4) キーボードより1~6の並び番号,及び-1または+1のシフト方向を入力.
(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
(6) シフトによるシャッフル結果を表示する.
(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る
<実行例>
シフト回数は?2 ← キーボードから2と入力
1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6
<1回目> 3を-1動かす
1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6
<2回目> 5を1動かす
1 2 3
[1][1][2] 4
[3][2][2] 5
[3][3][1] 6
(1)~(3)の動作がここまで
(4)~(7)の動作はここから
どの並びを動かしますか?(1~6) 5 ← キーボードから5と入力
どう動かしますか? (-1 or 1) -1 ← キーボードから-1と入力
1 2 3
[1][1][2] 4
[2][2][3] 5
[3][3][1] 6
どの並びを動かしますか?(1~6) 3 ← キーボードから3と入力
どう動かしますか? (-1 or 1) 1 ← キーボードから1と入力
1 2 3
[1][1][1] 4
[2][2][2] 5
[3][3][3] 6
Congratulations !! ]
(3)までのプログラムはできてるんですが、(4)からの処理がお手上げ状態で・・・
よろしくお願いします。
<!--2-->
課題の質問
Re:課題の質問
ここまで出来ていたら、すぐだと思いますよ。
>>(4) キーボードより1~6の並び番号,及び-1または+1のシフト方向を入力.
これはとりあえずscanf関数でいいでしょう。
>>(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
>>(6) シフトによるシャッフル結果を表示する.
実際にシャッフルする動作はrotate_vとrotate_h関数がそのまま再利用できますよね?
>>(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る
これはif文でいいですよね。
繰り返し処理は(4)~(7)をwhileで囲ってやり、(7)の判定が真の場合にbreakでループから抜けてやればいいだけですね。頑張って!!(^-^)
>>(4) キーボードより1~6の並び番号,及び-1または+1のシフト方向を入力.
これはとりあえずscanf関数でいいでしょう。
>>(5) 指定された並びに対し,指定された方向のシフト操作を実行する.
>>(6) シフトによるシャッフル結果を表示する.
実際にシャッフルする動作はrotate_vとrotate_h関数がそのまま再利用できますよね?
>>(7)もし行方向,あるいは列方向に3つの並びとも同じ数字が揃っていれば祝福のメッセージを表示して終了する.そうでなければ(4)へ戻る
これはif文でいいですよね。
data[0][0] , data[1][0] , data[2][0] data[0][1] , data[1][1] , data[2][1] data[0][2] , data[1][2] , data[2][2]例えば、上図のように並んでいるとすると…
// 最上段の判定 if (data[0][0] == data[1][0] && data[0][0] == data[2][0]) // 最左列の判定 if (data[0][0] == data[0][1] && data[0][0] == data[0][2])こんな感じです。
繰り返し処理は(4)~(7)をwhileで囲ってやり、(7)の判定が真の場合にbreakでループから抜けてやればいいだけですね。頑張って!!(^-^)