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

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

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

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

Q&A

2回答

2664閲覧

オセロプログラムで、COM(相手)に自動入力させる方法

apipo

総合スコア6

C

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

0グッド

0クリップ

投稿2015/05/05 08:40

一人二役でのオセロプログラムは書けたのですが、
相手(ここでは白)に自動でコマを置かせる方法がどうしてもわかりません。
ひとまず配列のどれかを選んでから置けるか置けないかの判断をする流れになっているのですが・・・
以下私の書いたコードです。
終了判定の部分もあやふやですが、まず自動で配列の一つを選んでくれるという機能をつけたいです。どうぞよろしくお願い致します。

#include <stdio.h>

#define NONE 0 /何も置かれていないところ/
#define BLACK 1
#define WHITE 2

#define CLASS 8 /マス目の数/

#define TRUE 1 /置けるところ/
#define FALSE 0 /置けないところ/

void start(); //スタートの状態
void othello_print(); //オセロ盤を出力する
int othello_reverse(int black, int i, int j, int iline, int jline);
int check(int black, int i, int j);//裏返せるかチェック
int put(int black, int i, int j); //置く

char othello[CLASS][CLASS];
int turn; /ターン/

int main()
{
int i, j, black, bl, wh;
black = BLACK;
bl = wh = 0; /●と○の数/
char s[50]; /入力を受け付ける文字数/

start();
othello_print();

printf("先手なら1、後手なら0を入力してください→");
scanf("%s", s);

while (1){ //無条件にループに入る
if (black == BLACK){
printf("%sのターンです 相手の手を入力してください(i j)→", "BLACK");
scanf("%d %d", &i, &j);
printf("私の手は(%d %d)です\n", i, j);
}
if (black == WHITE){
choice(i,j);
printf("%sのターンです COMの手を入力してください(i j)→", "WHITE");
scanf("%d %d", &i, &j);
printf("COMの手は(%d %d)です\n", i, j);
}
if (put(black, i, j)){
black = black == WHITE ? BLACK : WHITE;
othello_print();
}
else{
printf("そこにはおけません\n");
}
}
if (othello[i][j] != NONE && (othello[i][j]==BLACK || othello[i][j]==WHITE)){
while (othello[i][j] != EOF){
if (othello[i][j] == BLACK)
++bl;
if (othello[i][j] == WHITE)
++wh;
}
printf("● %dこ ○%dこ", bl, wh);

if (bl > wh){ printf("●の勝ちです"); } if (bl < wh){ printf("○の勝ちです"); } if (bl == wh){ printf("引き分けです"); }

}
else;

return 0;
}

void start()
{
int i, j;
for (i = 0; i < CLASS; i++){
for (j = 0; j < CLASS; j++){
othello[i][j] = NONE;
}
}
othello[3][3] = BLACK;
othello[4][4] = BLACK;
othello[3][4] = WHITE;
othello[4][3] = WHITE;

turn = 0;
}

void othello_print()
{
int i, j;
printf(" 01234567\n");
for (i = 0; i < CLASS; i++){
printf("%d", i);
for (j = 0; j < CLASS; j++){
switch (othello[i][j]){
case NONE:
printf("*");
break;
case BLACK:
printf("●");
break;
case WHITE:
printf("○");
break;
default:
break;
}
}
printf("\n");
}
}

int put(int black, int i, int j)
{
//置ける場所かチェック
if (i < 0 || i >= CLASS) //オセロ盤の外なら置けない
return FALSE;
if (j < 0 || j >= CLASS)
return FALSE;
if (othello[i][j] != NONE)
return FALSE;

if (check(black, i, j) > 0){
othello[i][j] = black;
turn++;
return TRUE;
}
else
return FALSE;
}

int check(int black, int i, int j)//裏返せるかチェック
{
int count;
count = 0;
count += othello_reverse(black, i - 1, j, -1, 0); //上
count += othello_reverse(black, i + 1, j, 1, 0); //下
count += othello_reverse(black, i, j - 1, 0, -1); //左
count += othello_reverse(black, i, j + 1, 0, 1); //右
count += othello_reverse(black, i - 1, j - 1, -1, -1); //左上
count += othello_reverse(black, i - 1, j + 1, -1, 1); //右上
count += othello_reverse(black, i + 1, j - 1, 1, -1); //左下
count += othello_reverse(black, i + 1, j + 1, 1, 1); //右下

return count;
}

//ひとつ先の座標が裏返せるかどうかを返す
int othello_reverse(int black, int i, int j, int iline, int jline)
{
//置ける場所かチェック
if (i < 0 || i >= CLASS) //オセロ盤の外なら置けない
return FALSE;
if (j < 0 || j >= CLASS)
return FALSE;
if (othello[i][j] == NONE)
return FALSE;

if (othello[i][j] == black) //同じ色のコマがあった
return TRUE;

else{
if (othello_reverse(black, i + iline, j + jline, iline, jline)){
othello[i][j] = black;
return TRUE;
}
else
return FALSE;
}
}

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

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

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

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

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

guest

回答2

0

パスの処理を作るとCPUの処理がとりあえず書けると思います。
パスはどこにも置けない事を確認する処理です。
CPUは逆に置ける場所をチョイスして、そのなかから適当に選ばせればとりあえず出来上がりです。

投稿2015/06/20 13:38

MasaakiIrie

総合スコア1021

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

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

0

こんにちは。
回答としまして、挙げられているソースについて質問させてください。

挙げられているソースコードをコピペして、Cのソースファイルを作成し、
コンパイルしてみたところ、main()関数の while(1)のループの中の

lang

1 if (black == WHITE){ 2 choice(i,j); 3 printf("%sのターンです COMの手を入力してください(i j)→", "WHITE"); 4 scanf("%d %d", &i, &j); 5 printf("COMの手は(%d %d)です\n", i, j); 6 }

上記で呼ばれている関数

lang

1choice(i,j);

が定義されていないということで、コンパイルエラーになりました。

そこで、以下の2点を確認させてください。

  1. choice(i,j) がすでに出来ているのでしたら、そちらをコピペして頂けますか?

それとも「choice(i,j) の作り方がよく分からない」というのも質問として訊きたい
ことの一つ、ということなのでしょうか?

  1. 現状のコードでは、main()関数の中の

lang

1while(1){

のループから、どういうときに抜けるのかが見えてこないのですが、
apipoさんとして

  • この関数をちょっと直して、それがこういう値を返したら、ループを抜けさせるつもり

だとか

  • こういう変数を追加して、それがこういう値になったら、ループを抜けさせるつもり

といったような、何か「こうするつもり」という想定はありますか?
あれば教えてください。
それとも、このループからどうやって抜けさせるかも、質問として
訊きたいことのひとつなのでしょうか?

とりあえず現時点で伺いたいことは以上です。

投稿2015/05/05 11:33

編集2015/05/05 13:12
jun68ykt

総合スコア9058

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問