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

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

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

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

Q&A

解決済

1回答

1191閲覧

C言語、オセロの処理がわからないです

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/07/11 01:01

###前提・実現したいこと
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}

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

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

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

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

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

dodox86

2020/07/11 01:12

> 問題かどうか微妙ですが私がそもそもオセロを実際に打ったことがない いえ、結構な問題なのでは。。。(<不可能とは言いませんが) 実際に打てば、自然と1〜4のロジックが組めるようになる可能性はあります。
退会済みユーザー

退会済みユーザー

2020/07/11 01:30

表記方法が悪かったです。すいませんでした・・・ プログラムにも書いてあるテスト用のコードを使って一応やったけれど いまいちわからなかった。。。が正しいです。 1~4がわからないのは本当です・・・
dodox86

2020/07/11 01:36

1〜4を個別に見ていくと、むしろそれが分からない方がちょっと不思議です。テンプレートということで、質問者さんが全体を作った訳ではないということですか? C言語のソースコードとして読んでいくと、それぞれの箇所が分かるはずなのですが。
cateye

2020/07/11 01:52

“森田オセロ”で、ググるといろいろ出てきます。・・・懐かしいーー; ついでに、『標準入出力でオセロ作ってみた』↓・・・ロジックまで見てませんが、役に立つかも? https://tora-k.com/2019/06/17/othello/
退会済みユーザー

退会済みユーザー

2020/07/11 02:03

cateyeさん、ありがとうございます。 参考に見てみます。
退会済みユーザー

退会済みユーザー

2020/07/11 05:26

2 ~4はできたのですが1がどうしてもできません。 コマを指定できるかどうかのところの最後らへんにこのような判定を書いてみたのですが if (set == 0){ printf("コマをここには置けません!"); return; } (check関数の所で指定位置の所にコマが置けるかどうか、判定によって1か0かでるようにしています) どうやればコマが置けないときにメッセージを表示できるのでしょうか?
episteme

2020/07/11 11:01

そこに白をおくとして、 「そこは空きマスでなくてはならない」 さらにその位置を起点とした8方向に対し: 「その延長上には黒の連続、そして白がなくてはならない。」 これを満たす方向がなければ、そこに白を置けない。
dodox86

2020/07/13 06:40

> 内容4:勝ったプレイヤーの表示 > どうやればコマが置けないときにメッセージを表示できるのでしょうか? 質問文を含め、「コマが置けるかどうか」の判定処理自体は一応は完成していて、「どうやってメッセージを表示するのか。」と言う点だけを問題にしているのかと思っていましたが、epistemeさんからいただいたコメントへの返信も特にないところをみると、そうでもないのでしょうか。尚、私の方でも「では実際に試してみよう」とご提示のC言語プログラムをコンパイルして動作させてみましたが、動かし方(どう入力してどう出力表示されるのが正しいのか)すら分からなかったので、コードを読むことを諦めました。
guest

回答1

0

ベストアンサー

問題1~5できました。遅れてすいません・・・
問題1・・・周りを確かめコマがなかったら処理
問題2・・・今どちらのプレイヤーのターンなのか判定して処理
問題3・・・すべてのマスを調べコマごと数える
問題4・・・コマの数が多いほうを調べ処理
問題5・・・そのまま先攻、後攻を指定
アドバイスくださった方、ありがとうございます

投稿2020/07/13 08:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問