
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も見ています
-
教えて!gooグレードポイントがdポイントに変わります!
dアカウント連携を行っていただくと、グレードに応じて「dポイント」が進呈されるようになります。
-
c言語 〇×ゲーム
C言語・C++・C#
-
C言語にて作成中の三目並べについての質問です
C言語・C++・C#
-
3目並べのプログラムについての質問です
工学
-
4
三目並べ
C言語・C++・C#
-
5
教えてください(丸罰ゲーム)
C言語・C++・C#
-
6
C言語で五目並べを作成しているのですが…
C言語・C++・C#
-
7
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
-
8
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
9
[C言語]三目並べ
C言語・C++・C#
-
10
ベクトル関数の概略を図示せよという問題があるのですが、解き方がさっぱりわかりません。 例えばなんです
物理学
-
11
【C言語 再帰・メモ化】 C言語で、再帰とメモ化を使って2つの文字列の編集距離(レーベンシュタイン距
C言語・C++・C#
-
12
10進カウンタの原理について
その他(コンピューター・テクノロジー)
-
13
10個出力で改行したいのですが・・・
C言語・C++・C#
-
14
C言語で簡単なゲームを作る方法
C言語・C++・C#
-
15
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
16
Javaでの三目並べのソースコード
Java
-
17
「木は2部グラフである。」を証明して下さい!
数学
-
18
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
19
e^(x^2)の積分に関して
数学
-
20
*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
野球の対戦成績のテーブル表示...
-
5
「指定されたキャストは有効で...
-
6
C言語での引数の省略方法
-
7
C++でvectorにテキストファイル...
-
8
C言語で分からないところがあり...
-
9
比較回数と交換回数表示について
-
10
因数分解を行うプログラムについて
-
11
ColorをRGBで指定する方法
-
12
毎回違う乱数を生成するにはど...
-
13
int tff(int clk) { static int...
-
14
複数桁10進数の*桁目だけを抽出...
-
15
cinの区切り文字の書き方
-
16
windows-findstrの正規表現を使...
-
17
c言語の配列を使ってサイコロを...
-
18
プログラミングペーパーテスト ...
-
19
商と剰余を同時に求める(C言語)
-
20
プログラミングの授業のペーパ...
おすすめ情報
公式facebook
公式twitter