三子棋の分析と実現——C言語

22210 ワード

三子棋は1种の経典の小さいゲームとして、初めてC言语を学ぶ私达に対してもし熟练してそのゲームの机能を理解して実现することができるならば、后で更に系統的なC言语の学习に対してとても良い助けがあります.私がプログラミングしたときの悟りとコードを共有します
まず、三子棋のルールを紹介します.自分の碁を一本の線(行、列、斜線)に結ぶだけで、勝つために図のようになります.
まず図と遊び方によって大体考えがあります.
1.碁盤は3行3列の2次元配列と見なすことができ、各行の各列を線で区切って2を区別することができる.コンピューター将棋とプレイヤー将棋(コンピューター先下とプレイヤー先下)に分けられる.判定勝ち(プレイヤー勝ち、コンピューター勝ち、引き分け)
大まかな考え方は上の分析で、次はコードを書き始めます.
tsetを作成します.c,game.cとhead.h 3つのファイル
1.test.cで主関数を記述し、ゲームメニューを書く
ここで私はコンピュータの先とプレイヤーの先に分けて、コードは以下の通りです.
void menu()
{
    printf("***************************************
"); printf("* 1.play 0.exit *
"); printf("***************************************
"); } void first_move() { printf("***************************************
"); printf("* 1.computer first 2.player first *
"); printf("***************************************
"); } void game() { return 0; } int main() { int choice; srand((unsigned int)time(NULL));// do { menu(); printf(" :"); scanf("%d", &choice); switch (choice) { case 1: game(); break; case 0: break; default: printf(" .
"); break; } } while (choice); return 0; }

2.次から次へとgame.cで必要な機能を実現しgame関数で呼び出す
先にディスクを印刷し、ディスクをスペースに初期化します.コードは以下の通りです.
void show_board(char board[ROWS][COLS], int rows, int cols)//    
{
    int i;
    for (int i = 0; i < rows; i++)
    {
        printf("  %c | %c | %c  
", board[i][0], board[i][1], board[i][2]); if (i != rows - 1) printf(" ---|---|---
"); } } void init_board(char board[ROWS][COLS], int rows, int cols)// { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ' '; } } }

効果は図のようだ
3.プレイヤー落子のコード作成
プレイヤー数は2次元配列の座標を入力し、この場合、プレイヤーの入力座標が合理的かどうか、およびこの座標に駒があるかどうかを判断する必要があります.コードは以下の通りです.
void player_move(char board[ROWS][COLS], int rows, int cols)//    
{
    int x, y;
    printf("    :
"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= rows && y >= 1 && y <= cols) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else printf(" ! 。
"); } else printf(" ! .
"); } }

4.パソコンで遊ぶ
ここで実現したのは,コンピュータがスペースの配列にランダムに落子することである.コードは以下の通りです.
void computer_move(char board[ROWS][COLS], int rows, int cols)//     
{

    int x, y;
    printf("    :
"); while (1) { x = rand() % rows; y = rand() % cols; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }

5.最後は勝負を判断するだけ
まずプレイヤーやパソコンが勝つ状況を議論します.コードは以下の通りです.
char check_win(char board[ROWS][COLS], int rows, int cols)//    
{
    int i;
    for (i = 0; i < rows; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
            return board[i][1];
    }
    for (i = 0; i < cols; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
            return board[1][i];
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
        return board[1][1];
    else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
        return board[1][1];
    else if (is_full(board, rows, cols))
        return 'q';
    return 0;
}

これは引き分けを考慮した場合,引き分けは碁盤がいっぱいで負けていないため,配列全体(碁盤)を遍歴してスペースがなければ引き分けとなる.コードは以下の通りです.
static int is_full(char board[ROWS][COLS], int rows, int cols)//       
{
    int i, j;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            if (board[i][j] == ' ')
                return 0;
        }
    }
    return 1;
}

初歩的なテスト結果は以下の通りです.
図の中で、コンピュータが勝つ機会があるのにランダムにやっていることがわかります.このようなゲームは挑戦していません.そのため、コンピューターのサブコードを修正し、インテリジェント化しなければならない.コンピュータが落子したときに、同業者、同列または斜線に同じ駒がある場合、コンピュータが落子を1本の線にならないスペースに優先し、簡単なインテリジェント化を実現すると判断できます.
コードは以下の通りです.
void computer_move(char board[ROWS][COLS], int rows, int cols)//       
{
    int x, y, i;
    printf("    :
"); while (1) { x = rand() % rows; y = rand() % cols; for (i = 0; i < rows; i++) { if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ') { board[i][2] = '#'; goto flag1; } else if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ') { board[i][0] = '#'; goto flag1; } else if (board[i][0] == board[i][2] && board[i][2] == '#' && board[i][1] == ' ') { board[i][1] = '#'; goto flag1; } else if (board[0][i] == board[1][i] && board[0][i] == '#' && board[2][i] == ' ') { board[2][i] = '#'; goto flag1; } else if (board[1][i] == board[2][i] && board[1][i] == '#' && board[0][i] == ' ') { board[0][i] = '#'; goto flag1; } else if (board[0][i] == board[2][i] && board[2][i] == '#' && board[1][i] == ' ') { board[1][i] = '#'; goto flag1; } else if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ') { board[2][2] = '#'; goto flag1; } else if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ') { board[0][0] = '#'; goto flag1; } else if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } else if (board[0][2] == board[1][1] && board[1][1] == '#' && board[2][0] == ' ') { board[2][0] = '#'; goto flag1; } else if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ') { board[0][2] = '#'; goto flag1; } else if (board[2][0] == board[0][2] && board[2][0] == '#' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } } for (i = 0; i < rows; i++) { if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ') { board[i][2] = '#'; goto flag1; } else if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ') { board[i][0] = '#'; goto flag1; } else if (board[i][0] == board[i][2] && board[i][2] == '*' && board[i][1] == ' ') { board[i][1] = '#'; goto flag1; } else if (board[0][i] == board[1][i] && board[0][i] == '*' && board[2][i] == ' ') { board[2][i] = '#'; goto flag1; } else if (board[1][i] == board[2][i] && board[1][i] == '*' && board[0][i] == ' ') { board[0][i] = '#'; goto flag1; } else if (board[0][i] == board[2][i] && board[2][i] == '*' && board[1][i] == ' ') { board[1][i] = '#'; goto flag1; } else if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ') { board[2][2] = '#'; goto flag1; } else if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ') { board[0][0] = '#'; goto flag1; } else if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } else if (board[0][2] == board[1][1] && board[1][1] == '*' && board[2][0] == ' ') { board[2][0] = '#'; goto flag1; } else if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ') { board[0][2] = '#'; goto flag1; } else if (board[2][0] == board[0][2] && board[2][0] == '*' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } } if (board[x][y] == ' ') { board[x][y] = '#'; goto flag1; } } flag1:; }

効果は図のようです;
すべての結果を検出
コンピュータはプレーヤーに勝って引き分けます
すべてのコード
tese.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"head.h"
void menu()
{
    printf("***************************************
"); printf("* 1.play 0.exit *
"); printf("***************************************
"); } void first_move() { printf("***************************************
"); printf("* 1.computer first 2.player first *
"); printf("***************************************
"); } void game() { int choice, win; char board[ROWS][COLS]; init_board(board, ROWS, COLS); first_move(); flag: printf(" "); scanf("%d", &choice); switch (choice) { case 1: // do { computer_move(board, ROWS, COLS); // show_board(board, ROWS, COLS); // win = check_win(board, ROWS, COLS); if (win != 0) // break; player_move(board, ROWS, COLS); // show_board(board, ROWS, COLS); // win = check_win(board, ROWS, COLS); } while (win == 0); if (win == '#') printf(" , !
"); if (win == '*') printf(" , !
"); if (win == 'q') printf("
"); break; case 2: // show_board(board, ROWS, COLS); do { player_move(board, ROWS, COLS); show_board(board, ROWS, COLS); win = check_win(board, ROWS, COLS); if (win != 0) break; computer_move(board, ROWS, COLS); show_board(board, ROWS, COLS); win = check_win(board, ROWS, COLS); } while (win == 0); if (win == '#') printf(" , !
"); if (win == '*') printf(" , !
"); if (win == 'q') printf("
"); break; default: printf(" ,
"); goto flag; } } int main() { int choice; srand((unsigned int)time(NULL));// do { menu(); printf(" :"); scanf("%d", &choice); switch (choice) { case 1: game(); break; case 0: break; default: printf(" .
"); break; } } while (choice); return 0; }

game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"head.h"

void show_board(char board[ROWS][COLS], int rows, int cols)//    
{
    int i;
    for (int i = 0; i < rows; i++)
    {
        printf("  %c | %c | %c  
", board[i][0], board[i][1], board[i][2]); if (i != rows - 1) printf(" ---|---|---
"); } } void init_board(char board[ROWS][COLS], int rows, int cols)// { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ' '; } } } //void computer_move(char board[ROWS][COLS], int rows, int cols)// //{ // // int x, y; // printf(" :
"); // while (1) // { // x = rand() % rows; // y = rand() % cols; // if (board[x][y] == ' ') // { // board[x][y] = '#'; // break; // } // } //} void computer_move(char board[ROWS][COLS], int rows, int cols)// { int x, y, i; printf(" :
"); while (1) { x = rand() % rows; y = rand() % cols; for (i = 0; i < rows; i++) { if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ') { board[i][2] = '#'; goto flag1; } else if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ') { board[i][0] = '#'; goto flag1; } else if (board[i][0] == board[i][2] && board[i][2] == '#' && board[i][1] == ' ') { board[i][1] = '#'; goto flag1; } else if (board[0][i] == board[1][i] && board[0][i] == '#' && board[2][i] == ' ') { board[2][i] = '#'; goto flag1; } else if (board[1][i] == board[2][i] && board[1][i] == '#' && board[0][i] == ' ') { board[0][i] = '#'; goto flag1; } else if (board[0][i] == board[2][i] && board[2][i] == '#' && board[1][i] == ' ') { board[1][i] = '#'; goto flag1; } else if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ') { board[2][2] = '#'; goto flag1; } else if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ') { board[0][0] = '#'; goto flag1; } else if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } else if (board[0][2] == board[1][1] && board[1][1] == '#' && board[2][0] == ' ') { board[2][0] = '#'; goto flag1; } else if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ') { board[0][2] = '#'; goto flag1; } else if (board[2][0] == board[0][2] && board[2][0] == '#' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } } for (i = 0; i < rows; i++) { if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ') { board[i][2] = '#'; goto flag1; } else if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ') { board[i][0] = '#'; goto flag1; } else if (board[i][0] == board[i][2] && board[i][2] == '*' && board[i][1] == ' ') { board[i][1] = '#'; goto flag1; } else if (board[0][i] == board[1][i] && board[0][i] == '*' && board[2][i] == ' ') { board[2][i] = '#'; goto flag1; } else if (board[1][i] == board[2][i] && board[1][i] == '*' && board[0][i] == ' ') { board[0][i] = '#'; goto flag1; } else if (board[0][i] == board[2][i] && board[2][i] == '*' && board[1][i] == ' ') { board[1][i] = '#'; goto flag1; } else if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ') { board[2][2] = '#'; goto flag1; } else if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ') { board[0][0] = '#'; goto flag1; } else if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } else if (board[0][2] == board[1][1] && board[1][1] == '*' && board[2][0] == ' ') { board[2][0] = '#'; goto flag1; } else if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ') { board[0][2] = '#'; goto flag1; } else if (board[2][0] == board[0][2] && board[2][0] == '*' && board[1][1] == ' ') { board[1][1] = '#'; goto flag1; } } if (board[x][y] == ' ') { board[x][y] = '#'; goto flag1; } } flag1:; } void player_move(char board[ROWS][COLS], int rows, int cols)// { int x, y; printf(" :
"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= rows && y >= 1 && y <= cols) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else printf(" ! 。
"); } else printf(" ! .
"); } } static int is_full(char board[ROWS][COLS], int rows, int cols)// { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { if (board[i][j] == ' ') return 0; } } return 1; } char check_win(char board[ROWS][COLS], int rows, int cols)// { int i; for (i = 0; i < rows; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') return board[i][1]; } for (i = 0; i < cols; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') return board[1][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') return board[1][1]; else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ') return board[1][1]; else if (is_full(board, rows, cols)) return 'q'; return 0; }

head.h
#include
#include
#include

#define ROWS 3
#define COLS 3

void show_board(char board[ROWS][COLS], int rows, int cols);//    
void init_board(char board[ROWS][COLS], int rows, int cols);//        
void computer_move(char board[ROWS][COLS], int rows, int cols);//    
void player_move(char board[ROWS][COLS], int rows, int cols);//    
char check_win(char board[ROWS][COLS], int rows, int cols);//