ページ 1 / 1
オセロゲームのエラーについて
Posted: 2013年6月04日(火) 16:27
by kkkk
コード:
#include <stdio.h>
//0が空白、1が黒、2が白
#define N 0
#define B 1
#define W 2
//盤
char ban[8][8];
//確認
int vec_y[] = {-1,-1,0,1,1,1,0,-1};
int vec_x[] = {0,1,1,1,0,-1,-1,-1};
//初期化
void setup (void)
{
int i;
//盤をすべて空白にする
for (i=0;i<64; i++){
ban[i/8][i%8] = N;
}
//初期状態の白黒を設定する
ban[3][3] = B;
ban[4][4] = B;
ban[3][4] = W;
ban[4][3] = W;
}
//盤表示
void show (void)
{
int i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
switch (ban[i][j]){
//空白
case N:
printf("・");
break;
//黒
case B:
printf("●");
break;
//白
case W:
printf("◯");
break;
//エラー
default:
printf("er");
}
}
printf("\n");
}
}
//置けるか確認
int check_1(int y,int x,int turn,int vec)
{
int flag = 0;
while(1){
y += vec_y[vec];
x += vec_x[vec];
//盤面の外に出ていたら終了
if( x < 0 || y < 0 || x > 7 || y > 7 )
{return 0;}
//空きマスだったら終了
if(ban[y][x] == N)
{return 0;}
//相手のコマがあったらフラグを立てる
if(ban[y][x] == (turn ? B : W))
{
flag = 1;
continue;
}
//もしフラグがたっていればループ脱出。いなければ終了
if(flag == 1){
break;
return 0;
}
return 1;
}
}
//置けるか確認2
int check_2(int y,int x,int turn)
{
int vec;
//どれか一方向でもひっくり返るか確認
for(vec = 0 ; vec < 8 ; ++vec){
if(check_1(y,x,turn,vec) == 1)
{return 1;}
}
return 0;
}
int main(void)
{
setup();
show();
check_1();
check_2();
return 0;
}
オセロゲームを作っています。途中まできたのですが、
Othello.c: In function 'main':
Othello.c:116: error: too few arguments to function 'check_1'
Othello.c:117: error: too few arguments to function 'check_2'
というエラーが出ました。
どういう意味でしょうか。また、どのように修正すればよいのでしょうか。
Re: オセロゲームのエラーについて
Posted: 2013年6月04日(火) 16:38
by box
インデント(字下げ)のポリシーに統一性がなく、
コードが少し読みづらいです。
} がこんな風に並ぶことは、ちょっと考えられません。
まあそれはさておき、
kkkk さんが書きました:コード:
int check_1(int y,int x,int turn,int vec)
int check_2(int y,int x,int turn)
check_1関数は4個の、check_2関数は3個の引数があるようになっていますが、
kkkk さんが書きました:コード:
check_1();
check_2();
呼び出すときに何も指定していません。
C言語(特に関数呼び出し)に関する知識を、どの程度お持ちですか?
Re: オセロゲームのエラーについて
Posted: 2013年6月04日(火) 16:39
by Blue
ご自分で作成したものではないのでしょうか?
>Othello.c: In function 'main':
>Othello.c:116: error: too few arguments to function 'check_1'
>Othello.c:117: error: too few arguments to function 'check_2'
mainという関数の中でエラーが発生しました。
116行目 check_1という関数に引数が少なすぎます。
117行目 check_2という関数に引数が少なすぎます。
といったような主旨のエラーでしょうか。
check_1は
>int check_1(int y,int x,int turn,int vec)
と、int型の引数が4つ必要です。
check_2は
>int check_2(int y,int x,int turn)
と、int型の引数が3つ必要です。
Re: オセロゲームのエラーについて
Posted: 2013年6月05日(水) 21:11
by kkkk
どのように修正すればよいのでしょうか。
p.s字下げはどのようにしたら見やすいと感じるプログラムになるでしょうか。
Re: オセロゲームのエラーについて
Posted: 2013年6月05日(水) 21:55
by box
kkkk さんが書きました:どのように修正すればよいのでしょうか。
main関数において、check_1とcheck_2を呼び出すために必要な変数を
適切に定義・初期化し、その2つの関数の引数としてください。
kkkk さんが書きました:
p.s字下げはどのようにしたら見やすいと感じるプログラムになるでしょうか。
下記のコードは、提示されたコードのロジックには何ら手を加えることなく、
字下げのポリシーや空白の入れ方などを私の流儀で書き直したものです。
無理に押しつけるつもりは全くありません。
少なくとも、質問者さんのコードよりは
for文とかif文とかswitch文とかの勢力範囲が明確になっていると思います。
forを真下にたどっていったところにある } までが、そのfor文の範囲、とか。
なお、書き直している過程で
コード:
if (flag == 1) {
break;
return 0;
}
breakとreturnとが連続しているのはおかしいであろうと思いましたが、
特に修正はしていません。
コード:
#include <stdio.h>
//0が空白、1が黒、2が白
#define N 0
#define B 1
#define W 2
//盤
char ban[8][8];
//確認
int vec_y[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int vec_x[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
//初期化
void setup(void)
{
int i;
//盤をすべて空白にする
for (i = 0; i < 64; i++) {
ban[i/8][i%8] = N;
}
//初期状態の白黒を設定する
ban[3][3] = B;
ban[4][4] = B;
ban[3][4] = W;
ban[4][3] = W;
}
//盤表示
void show(void)
{
int i, j;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
switch (ban[i][j]) {
//空白
case N :
printf("・");
break;
//黒
case B :
printf("●");
break;
//白
case W :
printf("◯");
break;
//エラー
default :
printf("er");
}
}
printf("\n");
}
}
//置けるか確認
int check_1(int y, int x, int turn, int vec)
{
int flag = 0;
while (1) {
y += vec_y[vec];
x += vec_x[vec];
//盤面の外に出ていたら終了
if (x < 0 || y < 0 || x > 7 || y > 7) {
return 0;
}
//空きマスだったら終了
if (ban[y][x] == N) {
return 0;
}
//相手のコマがあったらフラグを立てる
if(ban[y][x] == (turn ? B : W)) {
flag = 1;
continue;
}
//もしフラグがたっていればループ脱出。いなければ終了
if (flag == 1) {
break;
return 0;
}
return 1;
}
}
//置けるか確認2
int check_2(int y, int x, int turn)
{
int vec;
//どれか一方向でもひっくり返るか確認
for (vec = 0 ; vec < 8; ++vec) {
if (check_1(y, x, turn, vec) == 1) {
return 1;
}
}
return 0;
}
int main(void)
{
setup();
show();
check_1();
check_2();
return 0;
}