
No.11ベストアンサー
- 回答日時:
No10です。
斜めの判断に記述間違いがあったんでついでに少し書き足して関数にしました。int tsuginote(int *a)
{
int i,j,tate,yoko,naname1=0,naname2=0,kari=99;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[j][i]==0){
tate=a[(j+1)%3][i]*a[(j+2)%3][i];
yoko=a[j][(i+1)%3]*a[j][(i+2)%3];
if(i==j){
naname1=a[(j+1)%3][(i+1)%3]*a[(j+2)%3][(i+2)%3];
}
if(i+j==2){
naname2=a[(j+1)%3][(i+2)%3]*a[(j+2)%3][(i+1)%3];
}
if((tate==4)||(yoko==4)||(naname1==4)||(naname2==4)){
return 10*i+j;
}else if((tate==1)||(yoko==1)||(naname1==1)||(naname2==1)){
kari=10*i+j
}
}
}
}
return kari;
}
これで戻り値が99のときはランダムに、0-22の時はその指示通りにでどうでしょう。
No.10
- 回答日時:
少し検索していて面白そうな質問にたどり着きました。
>例えば2つ並んだら3つ目は必ず取りに行くようなプログラムは書けるでしょうか?
例えば最初は全て0で、相手が取れば1、自分がとれば2を配列に入れておけば
for(i=0;i<3;i++){
for(j=0;j<3;j++){
tate=a[(j+1)%3][i]*a[(j+2)%3][i];
yoko=a[j][(i+1)%3]*a[j][(i+2)%3];
if(i+j==4){
naname1=a[(j+1)%3][(i+1)%3]*a[(j+2)%3][(i+2)%3];
naname2=a[(j+1)%3][(i+2)%3]*a[(j+2)%3][(i+1)%3];
}else{naname1=0;
naname2=0;
}
}
}
でtate,toko,naname1,2に4があれば無条件にループを抜け出して終了、1があれば(i,j)を記憶しておいて一通り調べて他のところに4がなければ優先的に、0,2は放っておくということでどうでしょう?tate,yoko,naname1,2は配列にしてもいいですしループを抜ける条件等を適当に付け足してください。
基本的にはVB使いですので文法が間違ってたらごめんなさい。
No.9
- 回答日時:
> 二つ並んでる場合を1つずつ列挙して、そのときはここ、そのときはここってif文に当てはめていけばいいんですか?
だらだら書き並べてみました。。。9通り
if (((a[0][0]==AKI)&&(a[0][1]==MARU)&&(a[0][2]==MARU))||((a[0][0]==AKI)&&(a[1][0]==MARU)&&(a[2][0]==MARU))||((a[0][0]==AKI)&&(a[1][1]==MARU)&&(a[2][2]==MARU))) a[0][0]=MARU;
if (((a[2][0]==AKI)&&(a[0][0]==MARU)&&(a[1][0]==MARU))||((a[2][0]==AKI)&&(a[2][1]==MARU)&&(a[2][2]==MARU))||((a[2][0]==AKI)&&(a[1][1]==MARU)&&(a[0][2]==MARU))) a[2][0]=MARU;
if (((a[0][2]==AKI)&&(a[0][0]==MARU)&&(a[0][1]==MARU))||((a[0][2]==AKI)&&(a[1][2]==MARU)&&(a[2][2]==MARU))||((a[0][2]==AKI)&&(a[1][1]==MARU)&&(a[2][0]==MARU))) a[0][2]=MARU;
if (((a[2][2]==AKI)&&(a[2][0]==MARU)&&(a[2][1]==MARU))||((a[2][2]==AKI)&&(a[0][2]==MARU)&&(a[1][2]==MARU))||((a[2][2]==AKI)&&(a[1][1]==MARU)&&(a[0][0]==MARU))) a[2][2]=MARU;
if (((a[0][1]==AKI)&&(a[0][0]==MARU)&&(a[0][2]==MARU))||((a[0][1]==AKI)&&(a[1][1]==MARU)&&(a[2][1]==MARU))) a[0][1]=MARU;
if (((a[1][0]==AKI)&&(a[0][0]==MARU)&&(a[2][0]==MARU))||((a[1][0]==AKI)&&(a[1][1]==MARU)&&(a[1][2]==MARU))) a[1][0]=MARU;
if (((a[1][2]==AKI)&&(a[1][0]==MARU)&&(a[1][1]==MARU))||((a[1][2]==AKI)&&(a[0][2]==MARU)&&(a[2][2]==MARU))) a[1][2]=MARU;
if (((a[2][1]==AKI)&&(a[0][1]==MARU)&&(a[1][1]==MARU))||((a[2][1]==AKI)&&(a[2][0]==MARU)&&(a[2][2]==MARU))) a[2][1]=MARU;
if (((a[1][1]==AKI)&&(a[0][0]==MARU)&&(a[2][2]==MARU))||((a[1][1]==AKI)&&(a[0][2]==MARU)&&(a[2][0]==MARU))) a[1][1]=MARU;
No.8
- 回答日時:
> 二つ並んでる場合を1つずつ列挙して、そのときはここ、そのときはここってif文に当てはめていけばいいんですか?
いいんじゃないですか。
だらだら書き並べたところで高々8通りですから。
No.7
- 回答日時:
プログラム例・・・適当に書いたので長いです。
すいません。#include <stdio.h>
#define MARU 1
#define BATU 4
#define DRAW 10
/* 3x3の盤 0:空き MARU:○ BATU:× */
typedef struct {
char xy[3][3];
} MATRIX;
/* 勝敗チェック 0:未 MARU:○ BATU:× DRAW:引き分け */
int check(MATRIX ban) {
int i,j,p;
/* 引き分け? */
for (p=0,i=0; i<3; i++) for (j=0; j<3; j++) p += (ban.xy[i][j]==0)?0:1;
if (p==9) return DRAW;
/* 縦横? */
for (i=0; i<3; i++) {
p=ban.xy[i][0]+ban.xy[i][1]+ban.xy[i][2]; if (p==MARU*3) return MARU; else if (p==BATU*3) return BATU;
p=ban.xy[0][i]+ban.xy[1][i]+ban.xy[2][i]; if (p==MARU*3) return MARU; else if (p==BATU*3) return BATU;
}
/* 斜め */
p=ban.xy[0][0]+ban.xy[1][1]+ban.xy[2][2]; if (p==MARU*3) return MARU; else if (p==BATU*3) return BATU;
p=ban.xy[2][0]+ban.xy[1][1]+ban.xy[0][2]; if (p==MARU*3) return MARU; else if (p==BATU*3) return BATU;
return 0;
}
void display(MATRIX ban) {
int i,j;
for (i=0; i<3; i++) { for (j=0; j<3; j++) {
switch(ban.xy[i][j]) {
case 0: printf(" %d",i*3+j+1); break;
case MARU: printf(" O"); break;
case BATU: printf(" X"); break;
default: printf(" ?");
}
} printf("\n");
} printf("\n");
}
void man(MATRIX *ban, int turn) {
int i;
for(;;) {
printf("? "); scanf("%d",&i); i--;
if ((i<0)||(i>8)) continue;
if (ban->xy[i/3][i%3]==0) {
ban->xy[i/3][i%3]=turn; break;
}
}
}
void com(MATRIX *ban, int turn) {
int i,j;
MATRIX tmp;
tmp= *ban;
/* 次の手で勝つ? */
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
if (tmp.xy[i][j]==0) {
tmp.xy[i][j]=turn;
if (check(tmp)>0) {
ban->xy[i][j] = turn;
return;
}
tmp.xy[i][j]=0;
}
}
}
/* 相手が勝つ? */
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
if (tmp.xy[i][j]==0) {
tmp.xy[i][j]=(turn==MARU)?BATU:MARU;
if (check(tmp)>0) {
ban->xy[i][j]=turn;
return;
}
tmp.xy[i][j]=0;
}
}
}
/* 空いているところに打つ */
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
if (tmp.xy[i][j]==0) {
ban->xy[i][j]=turn;
return;
}
}
}
}
int main(void) {
MATRIX ban={{{0,0,0},{0,0,0},{0,0,0}}};
int r;
display(ban);
for (;;) {
man(&ban, MARU); display(ban); if ((r=check(ban)) != 0) break;
com(&ban, BATU); display(ban); if ((r=check(ban)) != 0) break;
}
switch(r) {
case MARU: printf("○の勝ち\n"); break;
case BATU: printf("×の勝ち\n"); break;
default: printf("引き分け\n");
}
return 0;
}
No.4
- 回答日時:
九つのマスを○×で埋める組み合わせは3024通りしかありませんから、全てを列挙し、負ける手を打たせなければよいのでは、と。
この回答への補足
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
//座標の構造体
typedef struct{
int gyou;
int retu;
}matrix_t;
//プロトタイプ宣言
matrix_t input(int a[][3]); //プレイヤーの入力
int chk(int a[][3]); //そろったかどうかを判定
void display(int a[][3]); //ボードを表示。
matrix_t sikou(int a[][3]); //コンピュータの思考
(中略)
//コンピュータの思考
matrix_t sikou(int a[][3])
{
matrix_t temp;
int i,j;
//ランダムな場所を指定
srand((unsigned int)time(NULL));
while(1){
temp.gyou=rand()%3;
temp.retu=rand()%3;
if(!a[temp.gyou][temp.retu])return temp;
}
}
コンピュータの思考がランダムに与えられている部分をうまく変えたいんですよ。これだけではわかりにくいと思いますが。。何かいい方法はないでしょうか?例えば2つ並んだら3つ目は必ず取りに行くようなプログラムは書けるでしょうか?
No.3
- 回答日時:
対戦プログラムの場合、一般的にはゲーム木を考えます。
3×3マスでしたら全パターンを調べてもそんなに時間はかからないでしょう。将棋やチェスだと木が大きくなるので枝狩りをする必要がありますし、強いプログラムを作ろうと思ったら枝狩りの方法や評価関数など工夫が必要です。
「ゲーム理論」で検索すると参考になるサイトがヒットするかもしれません。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(恋愛相談) 現在高校3年で2個下の同じ部のマネとよくDMで話しています。前回賭けをしてそのときは相手が罰ゲームで 4 2023/05/30 22:56
- 数学 何回やれば終わるか。 2 2023/05/17 23:42
- 大学・短大 至急教えてください。アリゴリズムの問題です。 下の図3×9のマス目において、白いコマと黒いコマが3個 12 2022/07/07 18:05
- カップル・彼氏・彼女 彼氏への接し方 彼氏への接し方について相談があります。 彼氏とは3年以上の仲になりますが、趣味が合わ 1 2022/04/12 21:05
- カップル・彼氏・彼女 彼氏への接し方 再投稿失礼します。もう少し皆様の意見が聞きたいです。 彼氏への接し方について相談があ 3 2022/04/14 01:47
- Java Java 石取りゲーム 3 2023/02/02 15:46
- バラエティ・お笑い はねトびのギリギリッスを久々に見たのですが、コーナーの罰ゲームで、ニンニクや納豆などのとにかく臭い物 1 2022/09/23 00:25
- カップル・彼氏・彼女 彼氏とゲームがしたい!けど、、、、 彼氏と同棲しています。 お互いにゲームをするのが好きで、 一緒に 2 2023/02/19 01:22
- バラエティ・お笑い 昔のテレビ番組の罰ゲームで、今じゃ絶対出来ないなってものを教えてください。 3 2022/10/04 20:50
- その他(ゲーム) 質問です。ゲームの名前が思い出せません。台車の上にこういう盾や銃などの色々な武器を持っている丸いキャ 1 2023/03/24 07:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
system関数がうまくいかない
-
未解決の外部シンボル _printf...
-
マルチスレッドでバグが発生します
-
return 1L
-
c言語マップ探査ゲーム プログ...
-
c言語についてですが
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
エクセル関数で
-
数値を入力して1からその数値ま...
-
c言語で「5人の学生の学籍番号...
-
課題でつまってます・・・
-
int型の表せる範囲
-
(int *)の意味
-
パスカルのピラミッドを作りた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報