掲示板ランキング  レギュラー(グァテマラ)  レギュラー(ブラジル)  レギュラー(ハワイコナ)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7405

オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/05 20:58:01)


オセロのゲーム自体は出来るのですが、コマの枚数の表示と勝敗の判定メッセージがうまく行きませんので、教えていただける方お願いします。

#include <stdio.h>
#include <stdlib.h>

#define BLANK  0
#define BLACK  1
#define WHITE -1

#define FALSE 0
#define TRUE  1

#define SIZE 256

/* (x,y)の位置から一方向へ幾つ返せるか */
int put(int board[], int color, int x, int y, int dx, int dy, int flag)
{
    int n = 0;

        /* (dx,dy) 方向へ相手の数を数える */
    for(x += dx, y += dy; -color == board[y*10+x]; x += dx, y += dy) {
            n++;
    }

        /* コマを返せないとき */
    if (BLANK == board[y*10+x]) {
        n = 0;
    }

        /* コマを返せるとき TRUE ならコマを返す */
    if(0 != n && TRUE == flag) {
        for(x -= dx, y -= dy; BLANK != board[y*10+x]; x -= dx, y -= dy) {
            board[y*10+x] = color;
        }
    }

    return n;
}

/* (x,y)の位置に置くと幾つ返せるか */
int search(int board[], int color, int x, int y, int flag)
{
    int n = 0;

        /* (x,y)位置にすでにコマがある */
    if (BLANK != board[y*10+x]) {
        return 0;
    }

        /* 8方向へ幾つ返せるか */
    n += put(board, color, x, y,  1,  1, flag);
    n += put(board, color, x, y,  0,  1, flag);
    n += put(board, color, x, y, -1,  1, flag);
    n += put(board, color, x, y, -1,  0, flag);
    n += put(board, color, x, y, -1, -1, flag);
    n += put(board, color, x, y,  0, -1, flag);
    n += put(board, color, x, y,  1, -1, flag);
    n += put(board, color, x, y,  1,  0, flag);

        /* 置けるときに TRUE なら置く */
    if(0 != n && TRUE == flag) {
        board[y*10+x] = color;
    }

    return n;
}

/* 盤面上で置けるところがあるか */
int check(int board[], int color)
{
    int x, y;

    for (y = 1; y <= 8; y++) {
        for (x = 1; x <= 8; x++) {
            if (0 != search(board, color, x, y, FALSE)) {
                return TRUE;
            }
        }
    }

    return FALSE;
}

/* 数値の入力 */
int input (char message[])
{
    char buffer[SIZE];
    int number;

    printf("%s", message);

    fgets(buffer, SIZE, stdin);
    number = atoi(buffer);

    return number;
}

/* どこに置くか?の処理 */
void man(int board[], int color)
{
    int x, y;

    for(;;){
            /* (x,y) の入力 */
        if(BLACK == color) {
            printf("黒をどこに置きますか?(1-8)\n");
            x = input("横:");
            y = input("縦:");
        }
        if(WHITE == color) {
            printf("白をどこに置きますか?(1-8)\n");
            x = input("横:");
            y = input("縦:");
        }
        if (1 <= x && 8 >= x && 1 <= y && 8 >= y) {
                /* 入力位置にコマを置く */
            if (0 != search(board, color, x, y, TRUE)) {
                break;
            }
        }
    }
}

/* 盤面の画面表示 */
void disp(int board[])
{
    int x, y;

        /* x の目盛り */
    printf("  ");
    for(x = 1; x <= 8; x++) {
        printf(" %d", x);
    }
    printf("\n");

    for(y = 1; y <= 8; y++) {

            /* y の目盛り */
        printf(" %d", y);

            /* 盤面の中 */
        for(x = 1; x <= 8; x++) {
            if(WHITE == board[y*10+x]) {
                printf("○");
            }
            if(BLACK == board[y*10+x]) {
                printf("●");
            }
            if(BLANK == board[y*10+x]) {
                printf(" ");
            }
        }

        printf("\n");
    }
}

/* ゲーム進行 */
void game(int board[])
{
    int color = WHITE;

    for(;;) {
            /* 画面表示 */
        disp(board);

            /* ゲームの終了判定 */
        if(FALSE == check(board, BLACK) && FALSE == check(board, WHITE)) {
            break;
        }

            /* 黒の手番 */
        if(BLACK == color) {
            man(board, color);
            color = WHITE;
        }
            /* 白の手番 */
        else {
            man(board, color);
            color = BLACK;
        }
    }
}

/* 盤面の初期化 */
void init(int board[])
{
    int i;

        /* 最初は全て空白 */
    for(i = 0; i < 10*10; i++) {
        board[i] = BLANK;
    }

        /* 真中の4つにコマを配置 */
    board[4*10+4] = board[5*10+5] = WHITE;
    board[4*10+5] = board[5*10+4] = BLACK;
}

/* メイン */
int main()
{
    int board[10*10];

    init(board);
    game(board);

    return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:オセロゲームの勝敗判定と白黒のコマ枚数 7406 επιστημη 2007/05/05 21:27:42


No.7406

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/05 21:27:42)
http://blogs.wankuma.com/episteme/


> コマの枚数の表示と勝敗の判定メッセージがうまく行きませんので、教えていただける方お願いします。

「うまく行かない」を説明すべし。



この投稿にコメントする

削除パスワード

No.7407

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/05 21:31:25)


黒白のコマ数は表示出来るのですが、その後の計算がうまく行きません。


この投稿にコメントする

削除パスワード

No.7408

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---bugs(2007/05/05 22:27:26)


>黒白のコマ数は表示出来るのですが、その後の計算がうまく行きません。

例えば、「黒:34枚、白:30枚」という風に表示できるのですね?
「その後の計算」というのは、どういった内容でしょうか?
挙げた例だと、「34-30=4枚差で黒の勝ち」という処理をすれば
よいだけだと思うのですが…。



この投稿にコメントする

削除パスワード

No.7409

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/05 22:29:29)


>例えば、「黒:34枚、白:30枚」という風に表示できるのですね?

そうです。

>「その後の計算」というのは、どういった内容でしょうか?

表示をさせるための白黒のコマの数のカウント計算です。


この投稿にコメントする

削除パスワード

No.7410

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/05 23:06:29)
http://blogs.wankuma.com/episteme/


>>「その後の計算」というのは、どういった内容でしょうか?
>表示をさせるための白黒のコマの数のカウント計算です。

ぶちゃけフシギなんですけど、なんで board[8][8] にしないんだろ。
そーすりゃいとも簡単なのに。



この投稿にコメントする

削除パスワード

No.7411

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/05 23:10:25)
http://blogs.wankuma.com/episteme/


>ぶちゃけフシギなんですけど、なんで board[8][8] にしないんだろ。
>そーすりゃいとも簡単なのに。

int white = 0;
int black = 0;
int x, y;
for ( x = 0; x < 8; ++x ) {
 for ( y = 0; y < 8; ++y ) {
  white += board[x][y] == WHITE ? 1 : 0;
  black += board[x][y] == BLACK ? 1 : 0;
 }
}

こんだけ。



この投稿にコメントする

削除パスワード

No.7413

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/05 23:38:33)


>int white = 0;
>int black = 0;
>int x, y;
>for ( x = 0; x < 8; ++x ) {
> for ( y = 0; y < 8; ++y ) {
>  white += board[x][y] == WHITE ? 1 : 0;
>  black += board[x][y] == BLACK ? 1 : 0;
> }
>}

どのあたりに追加すればよろしいのですか?




この投稿にコメントする

削除パスワード

No.7414

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/06 00:18:10)
http://blogs.wankuma.com/episteme/


>どのあたりに追加すればよろしいのですか?

どのあたりもなにも、駒数を表示したくなったとこ以外にどこがあるんよ?





この投稿にコメントする

削除パスワード

No.7416

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/06 00:37:23)
http://blogs.wankuma.com/episteme/


>>どのあたりに追加すればよろしいのですか?
>
>どのあたりもなにも、駒数を表示したくなったとこ以外にどこがあるんよ?

てゆっか、○●を描くついでに勘定できるやん。




この投稿にコメントする

削除パスワード

No.7417

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/06 00:41:10)


>てゆっか、○●を描くついでに勘定できるやん。
>
勘定は出来ているのですが、それを白黒各々の現在のコマの数を表示させることが上手く出来なくて悩んでいるのです。



この投稿にコメントする

削除パスワード

No.7419

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/06 00:51:18)
http://blogs.wankuma.com/episteme/


>勘定は出来ているのですが、それを白黒各々の現在のコマの数を表示させることが上手く出来なくて悩んでいるのです。

わからん。勘定できてるんやったらそいつをprintfするだけちゃうの?



この投稿にコメントする

削除パスワード

No.7412

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---bugs(2007/05/05 23:18:13)


>ぶちゃけフシギなんですけど、なんで board[8][8] にしないんだろ。

おそらく、search()での「8方向へいくつ返せるか」のところで
盤面をはみ出させないための措置ではないかと思います。

もっとも、[10][10]の盤面を定義するならば、
最外周の領域は「駒を置いていない」状態と区別する意味で
「はじめから駒を置けない場所」であることを
#define WALL (999) // 999は、他の状態と区別できれば何でもよい
のように定義しておく方がいいとは思いますけれども。


この投稿にコメントする

削除パスワード

No.7415

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/06 00:22:13)
http://blogs.wankuma.com/episteme/


>おそらく、search()での「8方向へいくつ返せるか」のところで
>盤面をはみ出させないための措置ではないかと思います。

なるほど。

>もっとも、[10][10]の盤面を定義するならば...

だよね、有効な駒位置を 1 <= x <= 8, 1 <= y <= 8 として、
board[10][10] にすれば

int while = 0;
int black = 0;
int x, y;
for ( x = 1; x < 9; ++x ) {
 for ( y = 1; y < 9; ++y ) {
  white += board[x][y] == WHITE ? 1 : 0;
  black += board[x][y] == BLACK ? 1 : 0;
 }
}

ってダケのこと。



この投稿にコメントする

削除パスワード

No.7418

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---novx(2007/05/06 00:44:13)


bugsさん>

○●を描くついでに勘定は出来ているのですが、それを白黒各々の現在のコマの数を表示させることが上手く出来なくて悩んでいるのですが、どうしたらよろしいのでしょうか?


この投稿にコメントする

削除パスワード

No.7420

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---επιστημη(2007/05/06 00:53:42)
http://blogs.wankuma.com/episteme/


>○●を描くついでに勘定は出来ているのですが、それを白黒各々の現在のコマの数を表示させることが上手く出来なくて悩んでいるのですが、どうしたらよろしいのでしょうか?

どんなコード書いてんだろ。 disp() の最後あたりで

printf("白:%d, 黒:%d\n", 白数, 黒数);




この投稿にコメントする

削除パスワード

No.7421

Re:オセロゲームの勝敗判定と白黒のコマ枚数
投稿者---wiz(2007/05/07 14:05:52)


>○●を描くついでに勘定は出来ているのですが
勘定ってどういう事を指してますか?
とりあえず、最初にあげたコードではやってないですよね?
どの様に『勘定』しているかわからなければ、
答える人は分からないですよ。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ