###前提・実現したいこと
C言語で、テンプレートで用意してあるオセロプログラムに処理を追加し完成させたいです。
追加する内容は5つです。
内容1:コマが置けないときに「コマをここには置けません!」と表示
内容2:パスをするとき、その対象者を表示
内容3:勝負がついた時のコマ数を表示
内容4:勝ったプレイヤーの表示
内容5:先攻後攻を指定できるようにする
発生している問題・エラーメッセージ
内容5はできたのですが1~4がどうやればいいのかわからないです。
また、問題かどうか微妙ですが私がそもそもオセロを実際に打ったことがないというのもあり(ルールは一応確認しました)いまいち理解できていないというのもあります。
後、問題1つ1つはmain関数の中に少し処理を書いたり、変数を用意してそれを使うような単純なもののような気がします。
該当のソースコード
C
1/* 2 オセロ 3*/ 4 5#include <stdio.h> 6 7int put; // コマ位置 8int turn; // プレーヤー(1:1player, 2:2player) 9int all; // 外ループ:コマを指定できる位置数 10 // 内ループ:コマ走査(8:走査中, 8以外:走査確定) 11int done; // コマひっくり返す(0:なし, 8:あり) 12int pass; // パス状態(0:あり, 1:なし) 13int count; // 相手のコマの数 14int value; // コマをひっくり返す位置 15int end; // ゲーム終了 16int i; 17 18// 盤状態:横9*縦10 y*9+xと使う。0行目と9行目は番兵 19// (0:無し, 1:1player, 2:2player, 3:改行) 20int map[91] = {0}; 21// 盤を走査する場合、縦横斜め方向に向かうために足されるべき数 22int dir[] = {-10, -9, -8, -1, 1, 8, 9, 10}; 23 24void check() 25{ 26 if(map[put] == 0){ // 指定位置にコマが置ける? 27 for(i = 0; i < 8; i++){ // 8方向走査するまでループする 28 // 走査方向にある相手コマの数を確認する 29 count = 0; 30 for(value = put + dir[i]; map[value] == 3 - turn; value += dir[i]){ 31 count++; 32 } 33 34 if(count && map[value] == turn){ 35 // 相手のコマが1枚以上存在し 36 // 走査方向に自分のコマがあるか? 37 all += count; // 相手のコマの数を加算する 38 value = put; // コマの位置を指定する 39 40 if(done){ // コマ指定がされたか? 41 // 実際にひっくり返す 42 do{ 43 map[value] = turn; 44 value += dir[i]; 45 }while (map[value] != turn); 46 } 47 } 48 } 49 } 50} 51 52// mapに対応するオセロ駒&改行 53char *h="・○●\n"; 54 55int main() 56{ 57 //テスト用に使用してください。 58 //for(i = 11; i < 80; ++i){ 59 //map[i] = 2; 60 //} 61 62 // 初期化 63 map[41] = map[49] = 2; 64 map[40] = map[50] = 1; 65 for(i = 1; i < 10; i++){ 66 map[i * 9] = 3; 67 } 68 pass = 1; 69 turn = 1; 70 71 printf("先行はどちらですか(1;人間, 2;AI):"); /* 問題5のところ */ 72 scanf("%d", &turn); 73 printf("\n\n"); 74 while(1){ 75 // 盤の表示 76 printf(" l 1 2 3 4 5 6 7 8 (X)\n"); 77 printf("--+----------------"); 78 for(put = 9; put < 82; ++put){ 79 check(); 80 printf("%.2s", &h[map[put] * 2]); 81 82 if(put % 9 == 0 && put<81) 83 printf("%-2dl", put / 9); 84 } 85 printf("(Y)\n\n"); 86 87 if(end){ // ゲーム終了? 88 break; 89 }else if(all){ // コマを指定できるか? 90 done = all = pass = put = 8; 91 while(all == 8){ // コマを指定されるまでループする 92 if(turn - 2){ // 人間? 93 printf("人間(%.2s):", &h[1*2]); 94 scanf("%d %d", &put, &i); 95 put += i * 9; 96 }else{ // com? 97 // 1枚でも駒が置けた場合はcomは左上から走査する 98 // 置けたらループを終了する(allの値が変わる) 99 ++put; 100 } 101 102 check(); 103 } 104 105 if(turn - 2 == 0) // com? 106 { 107 printf("AI(%.2s):%d %d\n\n", &h[2*2], put % 9, put / 9); 108 } 109 }else if(pass){ // 駒は置けない? 110 // パスする 111 pass = 0; 112 if(turn == 1) 113 printf("人間(pass)\n\n"); 114 else 115 printf("AI(pass)\n\n"); 116 }else{ // 両者とも駒を置けない? 117 end = 1; 118 } 119 // turn交代する 120 turn = 3 - turn; 121 // 毎回allとdoneを初期化する 122 all = done = 0; 123 } 124 125 printf("人間(○):%d枚\n"); 126 printf("AI(●):%d枚\n"); 127 printf("\n\n"); 128 129 return 0; 130}
> 問題かどうか微妙ですが私がそもそもオセロを実際に打ったことがない
いえ、結構な問題なのでは。。。(<不可能とは言いませんが)
実際に打てば、自然と1〜4のロジックが組めるようになる可能性はあります。
表記方法が悪かったです。すいませんでした・・・
プログラムにも書いてあるテスト用のコードを使って一応やったけれど
いまいちわからなかった。。。が正しいです。
1~4がわからないのは本当です・・・
1〜4を個別に見ていくと、むしろそれが分からない方がちょっと不思議です。テンプレートということで、質問者さんが全体を作った訳ではないということですか? C言語のソースコードとして読んでいくと、それぞれの箇所が分かるはずなのですが。
“森田オセロ”で、ググるといろいろ出てきます。・・・懐かしいーー;
ついでに、『標準入出力でオセロ作ってみた』↓・・・ロジックまで見てませんが、役に立つかも?
https://tora-k.com/2019/06/17/othello/
cateyeさん、ありがとうございます。
参考に見てみます。
2 ~4はできたのですが1がどうしてもできません。
コマを指定できるかどうかのところの最後らへんにこのような判定を書いてみたのですが
if (set == 0){
printf("コマをここには置けません!");
return;
}
(check関数の所で指定位置の所にコマが置けるかどうか、判定によって1か0かでるようにしています)
どうやればコマが置けないときにメッセージを表示できるのでしょうか?
そこに白をおくとして、
「そこは空きマスでなくてはならない」
さらにその位置を起点とした8方向に対し:
「その延長上には黒の連続、そして白がなくてはならない。」
これを満たす方向がなければ、そこに白を置けない。
> 内容4:勝ったプレイヤーの表示
> どうやればコマが置けないときにメッセージを表示できるのでしょうか?
質問文を含め、「コマが置けるかどうか」の判定処理自体は一応は完成していて、「どうやってメッセージを表示するのか。」と言う点だけを問題にしているのかと思っていましたが、epistemeさんからいただいたコメントへの返信も特にないところをみると、そうでもないのでしょうか。尚、私の方でも「では実際に試してみよう」とご提示のC言語プログラムをコンパイルして動作させてみましたが、動かし方(どう入力してどう出力表示されるのが正しいのか)すら分からなかったので、コードを読むことを諦めました。
回答1件
あなたの回答
tips
プレビュー