ページ 11

○×ゲームで・・・

Posted: 2010年11月16日(火) 23:19
by gyt
↓のようなプログラムで○×ゲームを作ってるのですが、
○と×の場所を保存しながら場所を入力するたびに増やしていきたいのですが
入力のたびに前回の○と×の場所がリセットされてしまい困ってます。
まだ、勝利条件などは書いていません。
まずはちゃんと表示させたいです。
c言語で書いています。bcpadを使ってます。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int map[3][3];
int a,b,x,y,w,h,c,d;
srand(time(NULL));
for(a=0;a<3;a++){
for(b=0;b<3;b++){
map[a]=0; //マップのクリア
}
}
for(c=0;c<9;c++){  //9回繰り返す
for(a=0;a<3;a++){
for(b=0;b<3;b++){
if(x==a&&y==b)printf("○"); //○の表示
else if(w==a&&h==b)printf("×"); //×の表示
else printf("■"); //何もない場所の表示
}
printf("\n");
}
printf("縦のどこに置きますか?");
scanf("%d",&a);
printf("横のどこに置きますか?");
scanf("%d",&b);
x=a;
y=b;
for(;;){
a=rand()%3;
b=rand()%3;
if(map[a]==0){
w=a;
h=b;
break;
}
}
}
return 0;
}

へたくそなプログラムですいません。

Re:○×ゲームで・・・

Posted: 2010年11月16日(火) 23:34
by パコネコ
自分が入力した後及び相手が入力した後に
map[a]=1;
みたいにマップを書き換えるプログラムがあるといいかもしれません。
(1かどうかはわかりませんが…)

そして描写するときもマップの状態を参考にして描写すると楽かもしれません。
if(map[a]==0)printf("猫");
みたいにです。
(猫は趣味。)

Re:○×ゲームで・・・

Posted: 2010年11月16日(火) 23:50
by scottie
よくわかりませんが、rand()にはどういった意味があるのでしょう?
#あ、わかりました。コンピュータと対戦させたいわけですね。
#下のコードは参考にならないかな(汗)

素朴なコードですが、よかったら参考にしてください。
#include <stdio.h>

int main(void)
{
int map[3][3];
int i,j,k;
int a,b,r,c;

for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("■");
}
printf("\n");
}

for(i=0; i<9; i++) {
printf("縦のどこに置きますか?");
scanf("%d", &r);
printf("横のどこに置きますか?");
scanf("%d", &c);

if(i%2) {
map[r][c] = 1;
}
else {
map[r][c] = 0;
}

for(j=0; j<3; j++) {
for(k=0; k<3; k++) {
if(map[j][k] == 0) {
printf("○");
}
else if(map[j][k] == 1) {
printf("×");
}
else {
printf("■");
}
}
printf("\n");
}
}

return 0;
}
画像

Re:○×ゲームで・・・

Posted: 2010年11月16日(火) 23:51
by gyt
解答ありがとうございます。

入力した座標を自分(○)ならmap[a]=1;
相手(×)ならmap[a]=2;
としてマップに描写するようにしたらできました。

ちゃんと表示できるようになり、うれしいです。(^ω^)

後は勝利条件を足そうと思うのですが、何かいい方法はありますか?
map[a]をfor文でまわしてそれぞれがそろっているか確認する方法を
考えたのですがもっと簡単にスマートな方法ってありますか?

よろしくお願いします。


×の方は乱数でランダムに値を入力しているのでrand()を使ってます。

画像

Re:○×ゲームで・・・

Posted: 2010年11月17日(水) 01:33
by ゆーずぃ
スマートかどうかは分かりませんが、全て回さなくてもチェックは斜めの最低三か所で済みます。
map[0][0],map[1][1],map[2][2]もしくはmap[0][2],map[1][1],map[2][0]ですね。
この理由はそれぞれのチェック場所でカバーできる範囲の線を引いて考えてみて下さい。
まぁ、それぞれの場所にチェック対象(○か×)が入っていた場合はそれぞれに対応する次のマスを調べなければなりませんが。

Re:○×ゲームで・・・

Posted: 2010年11月17日(水) 21:15
by box
最初に投稿されたソースコードで

>     int a,b,x,y,w,h,c,d;

何が入っているかわからないxとyを

>                 if(x==a&&y==b)printf("○");  //○の表示

比較の対象にしてはいけない、ということはそもそもおわかりですか?

Re:○×ゲームで・・・

Posted: 2010年11月18日(木) 18:13
by gyt
boxさん>
そうなんですか・・・知らなかったです^^;
xとyに適当な値、例えばx==aやy==bになり得ない値を入れてれば大丈夫なのでしょうか?

Re:○×ゲームで・・・

Posted: 2010年11月19日(金) 00:49
by ゆーずぃ
boxさんではありませんが、大雑把に言えばそーゆーことです。xとyに限らず、その次のwとhもそうですけど、一回目は初期化されていないのでゴミが入っています。もしこのゴミが判定条件に合っていれば、ゲーム開始から突然◯又は×が入っているという不思議な状態になります。ですのでもしこのアルゴリズムでいきたいのであれば最初だけは適当な数値で初期化しておくべきでしょう。

ですが、ゲームの定石として描画は最後に持ってくることになっています。それに倣い、プレイヤーに入力してもらった後に描画をもってくれば奇妙な初期化も必要なくなるでしょう。
(コンソールプログラムの為、最初だけはループの外で描画を行わなければなりませんが。その点を含め、scottieさんのプログラムの流れはパーペキなので、学べることは多いと思います)