
C言語で三目並べ(いわゆる○×)をするプログラムを作成したいのですがうまくいきません;;
どなたか教えてください。よろしくお願いします。
条件
・コンピュータの手はランダムに決定するものとする(空いているところに打つ)
・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する
・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック
・他にも必要に応じて関数を宣言すること
ヒント集
・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。
・char stone[3][3]={"-","○","×"};などと宣言しておくと便利?
・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引き分け
・ループの考え方は2通りできる
1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak
2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な ら後手
・三目並んだかのチェックは工夫のしどころ
・手盤の人の石だけチェックする
・打ったところの縦横は必ずチェック、斜めはどうする?
・作っていく順
・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示
・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define NONE 0
#define MARU 1
#define BATU 2
#define MY 0
#define COM 1
int tbl[3][3]={NONE};
int CheckJudge(int Col)
{
if(tbl[0][0]==Col && tbl[1][0]==Col && tbl[2][0]==Col) return 1;
if(tbl[0][1]==Col && tbl[1][1]==Col && tbl[2][1]==Col) return 1;
if(tbl[0][2]==Col && tbl[1][2]==Col && tbl[2][2]==Col) return 1;
if(tbl[0][0]==Col && tbl[0][1]==Col && tbl[0][2]==Col) return 1;
if(tbl[1][0]==Col && tbl[1][1]==Col && tbl[1][2]==Col) return 1;
if(tbl[2][0]==Col && tbl[2][1]==Col && tbl[2][2]==Col) return 1;
if(tbl[0][0]==Col && tbl[1][1]==Col && tbl[2][2]==Col) return 1;
if(tbl[2][0]==Col && tbl[1][1]==Col && tbl[0][2]==Col) return 1;
return 0;
}
void DrawCell(void)
{
int i,j;
printf(" 0 1 2\n");
for(i=0;i<3;i++)
{
printf(" %d",i);
for(j=0;j<3;j++)
{
switch(tbl[j][i])
{
case MARU:
printf("○");
break;
case BATU:
printf("×");
break;
case NONE:
printf("□");
break;
}
}
printf("\n");
}
}
int CheckPut(int x,int y)
{
if(tbl[x][y]==0)
return 1;
else
return 0;
}
int AIOfCOM(void)
{
int rx,ry;
printf("コンピュータの番です。\n");
Sleep((rand()%2+1)*1000);//ランダム秒待つ
do{
rx=rand()%3;
ry=rand()%3;
}while(CheckPut(rx,ry)==0);
tbl[rx][ry]=BATU;
printf("コンピュータは(%d,%d)に打ちました。\n",rx,ry);
}
int ChangeJunban(int *junban)
{
*junban^=1;
}
int main(void)
{
int tex,tey;
int junban=0;
srand(time(NULL));
int cnt=0;
while(1)
{
DrawCell();
if(junban==MY)
if(CheckJudge(MARU)==1)
{
printf("プレイヤーの勝ちです。\n");
break;
}
else
if(CheckJudge(BATU)==1)
{
printf("コンピュータの勝ちです。\n");
break;
}
switch(junban)
{
case MY:
do{
printf("プレイヤーの番です。\nx,yの規則で入力してください。\n");
scanf("%d,%d",&tex,&tey);
}while(CheckPut(tex,tey)==0);
tbl[tex][tey]=MARU;
break;
case COM:
AIOfCOM();
break;
}
ChangeJunban(&junban);
cnt++;
if(cnt>8)
{
printf("引き分けです。\n");
break;
}
Sleep(3000); //3秒待つ
system("cls");
}
return 0;
}
No.2
- 回答日時:
なにがうまくいかないのでしょうか?
質問が読み取れません。
「C言語で」
だけでは環境が読み取れません。
Windowsアプリなのか、コンソールアプリなのか、
コンパイラは何なのか
実行環境は何なのか etc.
ちなみに、問題の丸投げやってくださいってのは回答が付きませんので。
タダで全部やるって人はそうはいません。
No.1
- 回答日時:
>うまくいきません;;
何がうまくいかないのか一切提示がありません。
ソースの提示と「うまくいかない」内容を説明してください。
(3行目からは課題の設問の丸写しだけのようですし)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
c言語 〇×ゲーム
C言語・C++・C#
-
C言語で五目並べを作成しているのですが…
C言語・C++・C#
-
三目並べ
C言語・C++・C#
-
-
4
C言語にて作成中の三目並べについての質問です
C言語・C++・C#
-
5
教えてください(丸罰ゲーム)
C言語・C++・C#
-
6
10個出力で改行したいのですが・・・
C言語・C++・C#
-
7
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
8
C言語のfor文です。 繰り返しの中で文字を一つずつ増やしていくやり方を教えてください for(i=
C言語・C++・C#
-
9
3行3列の行列の和と積の計算方法を教えて下さい。
数学
-
10
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
-
11
init関数の意味
C言語・C++・C#
-
12
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
13
五目並べのプログラムを配列と関数を使ってつくりたいのですが、どなたか教
C言語・C++・C#
-
14
3目並べのプログラムについての質問です
工学
-
15
C言語でしりとりのプログラムを作ろうとしているのですが、わからないことがありまして
C言語・C++・C#
-
16
C言語の入力した文字を反転させるプログラミングの仕方が分かりません。
Ruby
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
数字列を3桁ごとにカンマで区切...
-
複数桁10進数の*桁目だけを抽出...
-
if と配列の組み合わせ
-
#define _CRT_SECURE_NO_WARNIN...
-
【C++】関数ポインタの使い方
-
C言語で三目並べをするプログラ...
-
関数の戻り値に関数のアドレス...
-
構造体の勉強中です 合計点の高...
-
Win32APIで作るコンボボックス...
-
足して100になるような乱数のア...
-
ラップ関数とはどんなものですか?
-
C言語での引数の省略方法
-
c言語 何をしているのかがわか...
-
実数の整数部,小数部の取得
-
並列プログラミングのπ計算につ...
-
アスタリスクで正方形
-
C言語による間引き拡大縮小
-
VB6.0でコンピュータ名の取得
-
演算子オーバーロードのプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
実数の整数部,小数部の取得
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
(マルチスレッド)_beginthrea...
-
if と配列の組み合わせ
-
system関数がうまくいかない
-
read関数をノンブロッキングで...
-
std::set<int> で、ある値が何...
-
式は定数値が必要です」という...
-
(int *)の意味
-
数字列を3桁ごとにカンマで区切...
-
「{ } で囲むだけ」は正しい?
-
int16_t の _t は何?
-
【至急】プログラムにエラーが...
-
systemの戻り値を取得する方法
おすすめ情報