4目並べ(重力つき)作成中なのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jei

4目並べ(重力つき)作成中なのですが・・・

#1

投稿記事 by jei » 12年前

はじめまして。jeiと申します。
プログラム載せるんで長くなりますが、ご容赦ください><
今私は学校の課題でlinuxを使用しC言語で9×9サイズの四目並べ(重力つき)の思考ルーチンを作っています。
以下のメインプログラムが先生からは与えられています。

#include "header.h"

extern int tate(int ban[SIZE_TATE][SIZE_YOKO]);
extern int yoko(int ban[SIZE_TATE][SIZE_YOKO]);
extern int game1(int ban[SIZE_TATE][SIZE_YOKO]);

int shokika(int ban[SIZE_TATE][SIZE_YOKO]);
int okiishi(int te,int ban[SIZE_TATE][SIZE_YOKO],int iro);
int hyouji(int ban[SIZE_TATE][SIZE_YOKO]);
int shouhai(int ban[SIZE_TATE][SIZE_YOKO]);
int okeruka(int te,int ban[SIZE_TATE][SIZE_YOKO]);

int hitode(int ban[SIZE_TATE][SIZE_YOKO]);
int randpoint(int ban[SIZE_TATE][SIZE_YOKO]);



int main(){
int ban[SIZE_TATE][SIZE_YOKO];
int (*sente)(int ban[SIZE_TATE][SIZE_YOKO]);
int (*gote)(int ban[SIZE_TATE][SIZE_YOKO]);
int i,te,kachi;

srand((unsigned)time(NULL));
shokika(ban);
hyouji(ban);

sente = tate;
// gote = hitode;
// gote = tate;
gote = game1;

for(i=0;i<SIZE_TATE*SIZE_YOKO;i++){
te = sente(ban);
okiishi(te,ban,KURO);
hyouji(ban);
if((kachi = shouhai(ban)) != TOCHUU)break;

te = gote(ban);
okiishi(te,ban,SHIRO);
hyouji(ban);
if((kachi = shouhai(ban)) != TOCHUU)break;
}
if(kachi == KURO) printf("\n× の勝ちだああ!\n");
if(kachi == SHIRO) printf("\n○ の勝ちだああ!\n");
if(kachi == HIKIWAKE) printf("\nHIKIWAKE\n");
}


int shokika(int ban[SIZE_TATE][SIZE_YOKO]){
int i,j;
for(i=0;i<SIZE_TATE;i++)
for(j=0;j<SIZE_YOKO;j++)
ban[j] = AKI;
}


int okiishi(int te,int ban[SIZE_TATE][SIZE_YOKO],int iro){
int i;

for(i = SIZE_TATE - 1;i>=0;i--){
if(ban[te] == AKI){
ban[te] = iro;
return;
}
}
printf("rule violation\n");
exit(0);
}


int hyouji(int ban[SIZE_TATE][SIZE_YOKO]){
int i,j;

printf(" ");
for(j=0;j<SIZE_TATE;j++)printf("%d ",j);
printf("\n");

for(i=0;i<SIZE_TATE;i++){
printf("%d",i);
for (j=0;j<SIZE_YOKO;j++){
if(ban[j] == AKI)printf("・");
if(ban[j] == KURO)printf("× ");
if(ban[j] == SHIRO)printf("○ ");
}
printf("\n");
}
printf("\n");
}


int shouhai(int ban[SIZE_TATE][SIZE_YOKO]){
int i,j;

//tate
for(i=0;i<SIZE_TATE - 3;i++){
for(j=0;j<SIZE_YOKO;j++){
if(ban[j] == AKI) continue;
if((ban[j] == ban[i+1][j])
&&(ban[j] == ban[i+2][j])
&&(ban[j] == ban[i+3][j]))
return(ban[i][j]);
}
}
//yoko
for(i=0;i<SIZE_TATE;i++){
for(j=0;j<SIZE_YOKO - 3;j++){
if(ban[i][j] == AKI) continue;
if((ban[i][j] == ban[i][j+1])
&&(ban[i][j] == ban[i][j+2])
&&(ban[i][j] == ban[i][j+3]))
return(ban[i][j]);
}
}
//miginaname
for(i=0;i<SIZE_TATE - 3;i++){
for(j=0;j<SIZE_YOKO - 3;j++){
if(ban[i][j] == AKI) continue;
if((ban[i][j] == ban[i+1][j+1])
&&(ban[i][j] == ban[i+2][j+2])
&&(ban[i][j] == ban[i+3][j+3]))
return(ban[i][j]);
}
}
//hidarinaname
for(i=0;i<SIZE_TATE;i++){
for(j=0;j<SIZE_YOKO - 3;j++){
if(ban[i][j] == AKI) continue;
if((ban[i][j] == ban[i-1][j+1])
&&(ban[i][j] == ban[i-2][j+2])
&&(ban[i][j] == ban[i-3][j+3]))
return(ban[i][j]);
}
}
//aki ari
for(j=0;j=SIZE_YOKO;j++)if(ban[0][j] == AKI)return(TOCHUU);
//hikiwake
return(HIKIWAKE);
}


int okeruka(int te,int ban[SIZE_TATE][SIZE_YOKO]){
if((te >= SIZE_YOKO)||(te<0))return(NG);
if(ban[0][te] == AKI)return(OK);
return(NG);
}


int hitode(int ban[SIZE_TATE][SIZE_YOKO]){
int te;

for(;;){
printf("%d-%d:",0,SIZE_YOKO - 1);
scanf("%d",&te);
if(okeruka(te,ban) == OK)return(te);
printf("mouichido\n");
}
}


int randpoint(int ban[SIZE_TATE][SIZE_YOKO]){
int te;

for(;;){
te = rand() % SIZE_YOKO;
if(okeruka(te,ban) == OK)break;
}
printf("%d-%d: %d\n",0,SIZE_YOKO -1,te);
return(te);
}

ちなみにtate.cとyoko.cはひたすら縦と横に石を置いていくプログラムです。
そして以下が私の作ったgame1.cなのですが、これよりさらに強くするにはどうすればいいでしょうか?
時間がなくて少し焦っているので具体的にプログラムを記述してくださればさらに助かります。
C言語初挑戦なので、むちゃくちゃなのかもしれませんが、よろしくお願いいたします。

#include"header.h"

int game1(int ban[SIZE_TATE][SIZE_YOKO]){
static int te=-2;
te++;
int i,j,a,h;
float hyouka[9] = {0,0,0,0,0,0,0,0,0};

for(i=0;i < SIZE_TATE;i++){//×(先手)、○(後手)判定
for(j = 0;j < SIZE_YOKO;j++){
if(ban[i][j] == AKI)a++;
if(ban[i][j] == KURO)continue;
if(ban[i][j] == SHIRO)continue;
}
}
if(a%2 == 0){
a = 1;//先手なら1(×)
printf("先手(×)");
}
else{
a = 0;//後手なら0(○)
printf("後手 (○)");
}
//思考開始
for(i=0;i<SIZE_TATE;i++){
for(j=0;j<SIZE_YOKO-1;j++){
if(ban[i][j]==AKI)continue;
//横の盤面評価
if(ban[i][j]==ban[i][j+1]){//横2つ並んでた時
if(ban[i][j+2]==AKI){
if(ban[i][j+1]==ban[i][j+3]){//横に1つ飛びで並んでた時
if(a=1)hyouka[j+2]=1;
if(a=0)hyouka[j+2]=-1;
}
else{
if(a=1)hyouka[j+2]=0.5;
if(a=0)hyouka[j+2]=-0.5;
}
}
if(ban[i][j+1]==ban[i][j+2] && ban[i][j+3]==AKI){//横に3つ並んだ時
if(a=1)hyouka[j+3]=1;
if(a=0)hyouka[j+3]=-1;
}
}
//縦の盤面評価
if(ban[i][j]==ban[i+1][j]){//縦2つ並んでた時
if(ban[i+3][j]==AKI){
if(ban[i+2][j]==ban[i+1][j] && ban[i+3][j]==AKI){//縦3つ並んでた時
if(a=1)hyouka[j]=1;
if(a=0)hyouka[j]=-1;
}
}
else{
if(a=1)hyouka[j]=0.5;
if(a=0)hyouka[j]=-0.5;
}
}
//右斜めの盤面評価
if(ban[i][j] == ban[i+1][j+1]){
if(ban[i+2][j+2]==AKI){
if(a=1)hyouka[j+2]=0.5;
if(a=0)hyouka[j+2]=-0.5;
}
if(ban[i+2][j+2]==ban[i+1][j+1] && ban[i+3][j+3]==AKI){
if(a=1)hyouka[j+3]=1;
if(a=0)hyouka[j+3]=-1;
}
}
//左斜めの盤面評価
if(ban[i][j]==ban[i-1][j+1]){
if(ban[i-2][j+2]==AKI){
if(a=1)hyouka[j+2]=0.5;
if(a=0)hyouka[j+2]=-0.5;
}
if(ban[i-1][j+1]==ban[i-2][j+2] && ban[i-3][j+3]==AKI){
if(a=1)hyouka[j+3]=1;
if(a=0)hyouka[j+3]=-1;
}
}
}
}
for(j=0;j<SIZE_YOKO;j++){
if(hyouka[j]!=0){
printf("%d:%.1f ",j, hyouka[j]);
}
}
printf("\n");
/*手の決定*/
for(te=0;te<SIZE_YOKO;te++){
if(hyouka[te]==-1)return(te);
}
for(te=0;te<SIZE_YOKO;te++){
if(hyouka[te]==1)return(te);
}
for(te=0;te<SIZE_YOKO;te++){
if(hyouka[te]==-0.5)return(te);
}
for(te=0;te<SIZE_YOKO;te++){
if(hyouka[te]==0.5)return(te);
}
if((te>=SIZE_YOKO)||(te<0))te=rand()%SIZE_YOKO;
for(;ban[0][te]!=AKI;te=rand()%SIZE_YOKO);
return(te);
}

アバター
lbfuvab
記事: 72
登録日時: 13年前

Re: 4目並べ(重力つき)作成中なのですが・・・

#2

投稿記事 by lbfuvab » 12年前

せめてインデントを付けて下さい。見づらいです。
後、定数や関数の詳しい説明をしてもらえませんか?

閉鎖

“C言語何でも質問掲示板” へ戻る