質問するログイン新規登録

Q&A

解決済

2回答

3597閲覧

C言語でオセロを作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/07/17 10:01

0

0

前提・実現したいこと

C言語でオセロを作っています。
挟まれた駒をひっくり返す機能を実装していたのですが、うまく機能しません。

該当のソースコード

長くて投稿できないためこちらにあります。

問題点

  • コマがひっくり返らない
  • おける場所がおかしくなる(自分の駒を相手の駒と挟むようにしておいてしまう)

(要望)

もっといい考え方や、コードの書き方があるのはなんとなくわかります。
ですが、この考え方で作りたいです。

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

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

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

y_waiwai

2019/07/17 11:00

コードは、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
退会済みユーザー

退会済みユーザー

2019/07/17 11:14

長くて投稿出来ないのですがどうすればよいでしょうか?
y_waiwai

2019/07/17 11:32

まあ、そんだけ長いコードを読んで回答してくれるような奇特な人が出てくるのを待とう。 としかいいようがないですが。
episteme

2019/07/17 11:47

700行て。 てか「この考え方で作りたい」の"この考え方"を700行の中から読み取れと?
jimbe

2019/07/17 11:48

ぱっと見ただけでも, 無駄に長いように思えてしまいますね.
guest

回答2

0

ベストアンサー

基本構造と思われる部分のコードを変えて, 大量の if,while,if の塊を纏めてみました.
環境の都合上テストデータでの数手一括実行です.
何かの参考になりましたら…

c

1#include <stdio.h> 2#include <memory.h> 3 4int field[8][8]; 5int canput[8][8]; //下位8ビットでどの方向に「ひっくり返し」が出来るかを示す. 6 7/* 8方向 */ 8int di[] = { -1,-1,-1, 0,0, 1,1,1 }; 9int dj[] = { -1, 0, 1, -1,1, -1,0,1 }; 10 11int check(int target, int ii, int jj, int di, int dj, int value) { 12 for(int i=ii+di, j=jj+dj, otherCount=0; 0<=i && i<8 && 0<=j && j<8; i+=di, j+=dj) { 13 if(field[i][j] == target) return otherCount > 0 ? value : 0; //自石 14 if(field[i][j] == 0) return 0; //空き 15 otherCount ++; //相手石 16 } 17 return 0; 18} 19 20int search(int target) { 21 int count = 0; //置ける場所数 22 for(int i=0; i<8; i++) { 23 for(int j=0; j<8; j++) { 24 canput[i][j] = 0; 25 if(field[i][j] != 0) continue; 26 for(int k=0; k<8; k++) { 27 canput[i][j] |= check(target, i, j, di[k], dj[k], 1<<k); 28 } 29 if(canput[i][j] != 0) count++; 30 } 31 } 32 return count; 33} 34 35void display() { 36 for(int i=0; i<8; i++) { 37 for(int j=0; j<8; j++) { 38 if(field[i][j] == 0) printf(canput[i][j] == 0 ? " _" : " +"); 39 if(field[i][j] == 1) printf(" #"); 40 if(field[i][j] == 2) printf(" @"); 41 } 42 printf("\n"); 43 } 44 printf("\n"); 45} 46 47void put(int target, int ii, int jj, int di, int dj) { 48 for(int i=ii+di, j=jj+dj; field[i][j]!=target; i+=di, j+=dj) { 49 field[i][j] = target; 50 } 51} 52 53void over(int target, int i, int j) { 54 field[i][j] = target; 55 for(int k=0; k<8; k++) { 56 if(canput[i][j] & 1<<k) put(target, i, j, di[k], dj[k]); 57 } 58} 59 60//テストデータ 61int ti[] = { 2, 2, 5, 5, 3, 2 }; 62int tj[] = { 3, 2, 4, 5, 2, 4 }; 63 64int main() { 65 memset(field, 0, sizeof(field)); 66 field[3][4] = field[4][3] = 1; 67 field[3][3] = field[4][4] = 2; 68 69 int turn = 1; //3との XOR で 1<->2 を繰り返す 70 for(int round=0; round<sizeof(ti)/sizeof(int); round++, turn^=3) { 71 int count = search(turn); 72 display(); 73 if(count == 0) printf("pass"); 74 else over(turn, ti[round], tj[round]); 75 } 76 int count = search(turn); 77 display(); 78 79 return 0; 80}

投稿2019/07/17 15:10

編集2019/07/18 12:12
jimbe

総合スコア13482

退会済みユーザー

退会済みユーザー

2019/07/18 08:11

回答ありがとうございます。 とても参考になりました。
guest

0

ちょっとかったるいかも知れませんが、参考までに
リバーシプログラムの作り方 サポートページ
昔は森田オセロのプログラムが参考になったのですが・・・

投稿2019/07/17 11:54

cateye

総合スコア6851

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問