三子棋游戏

  游戏规则:在3*3方格中连成三个棋子即为胜利,若是方格满,即为平局。

  实现语言:c语言(编译器:vs2013)

一.整体程序展示

  代码分别放在4个文件中,.h文件用来声明库函数,c文件用来书写主函数和各个分布的函数。这样分类可以提升代码的可读性,并且更加美观。

目录

一.整体程序展示

1.代码表示

(1).ultil.h

(2).main head,h

(3).init.c

(4).game.c

  2.效果展示

  二.程序分析

  三.分布解析

1.声明

2.初始化棋盘

3.游戏开始函数书写

  (1).初始化函数

(2).美化函数

(3).自己输入

(4).电脑输入

(5).检查结果函数


1.代码表示

(1).ultil.h

#include<stdio.h>
#include<time.h>

#include<stdlib.h>

(2).main head,h

#include"ultil.h"
#define row 3
#define col 3
void initboard(char board[row][col]);
void beau(char board[row][col]);
int start_game(char board[row][col]);
void player_input(char board[row][col]);
char check_board(char board[row][col]);
void computer_input(char board[row][col]);

(3).init.c

#include"mainhead.h"
char board[row][col];
int main(void)
{
    int sta;
    while (1)
    {
        printf("*********************************\n");
        printf("*********************************\n");
        printf("*[1] play               [2] exit*\n");
        printf("*********************************\n");
        printf("           三子棋小游戏          \n");
        scanf("%d", &sta);
        if (sta == 1)
            sta = start_game(board);
        if (sta == 2)
    {
        system("pause");
        break;
    }
        else printf("Please type again\n");
    }
}

(4).game.c

#include"mainhead.h"
#define PLAYER_CHOOSE 'x'
#define COMPUTER_CHOOSE '0'
void initboard(char board[row][col])
{
    for (int i = 0; i < row;++i)
    for (int j = 0; j < col; ++j)
    {
        board[i][j] = ' ';
    }
}
void beau(char board[row][col])
{
    for (int i = 0; i < row; ++i)
    {
        printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
        if (i<row-1)
        printf(" ___ ___ ___\n");
    }
}
void player_input(char board[row][col])
{
    int i,j;
    while (1)
    {
        scanf("%d %d", &i, &j);
        if (i >= 0 && i<row && j>=0 && j < col&&board[i][j]==' ')
    {
            board[i][j] = PLAYER_CHOOSE;
        break;
    }
        else printf("You type wrong please type again\n");
        continue;
    }
}
void computer_input(char board[row][col])
{
    int x, y;
    srand(time(0));
    while (1)
    {
        x = rand() % row;
        y = rand() % col;

        if (board[x][y] == ' ')
        {
            int a = x, b = y;

if (board[1][1] == ' ')
            {
                board[1][1] = COMPUTER_CHOOSE;

break;
            }
            for (a = 0; a < row; ++a)
            {
                if (board[a][0] == ' '&&board[a][1] == board[a][2] && board[a][1] == 'x')
                {
                    board[a][0] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[a][1] == ' '&&board[a][0] == 'x'&&board[a][0] == board[a][2])
                {
                    board[a][1] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[a][2] == ' '&&board[a][0] == board[a][1] && board[a][0] == 'x')
                {
                    board[a][2] = COMPUTER_CHOOSE;
                    break;
                }
            }
            for (b = 0; b < col; ++b)
            {
                if (board[0][b] == ' '&&board[1][b] == board[2][b] && board[1][b] == 'x')
                {
                    board[0][b] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[1][b] == ' '&&board[0][b] == board[2][b] && board[0][b] == 'x')
                {
                    board[1][b] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[2][b] == ' '&&board[1][b] == board[0][b] && board[1][b] == 'x')
                {
                    board[2][b] = COMPUTER_CHOOSE;
                    break;
                }
            }
            if (board[1][1] == ' '&&board[0][0] == board[2][2] && board[0][0] == 'x')
            {
                board[1][1] = COMPUTER_CHOOSE;
                break;
            }
            if (board[2][2] == ' '&&board[1][1] == 'x'&&board[0][0] == board[1][1])
            {
                board[2][2] = COMPUTER_CHOOSE;
                break;
            }
            if (board[0][0] == ' '&&board[1][1] == board[2][2] && board[1][1] == 'x')
            {
                board[0][0] = COMPUTER_CHOOSE;
                break;
            }
            if (board[1][1] == ' '&&board[0][2] == board[2][0] && board[0][2] == 'x')
            {
                board[1][1] = COMPUTER_CHOOSE;
                break;
            }
            if (board[0][2] == ' '&&board[1][1] == board[2][0] && board[1][1] == 'x')
            {
                board[0][2] = COMPUTER_CHOOSE;
                break;
            }
            if (board[2][0] == ' '&&board[0][2] == board[1][1] && board[0][2] == 'x')
            {
                board[2][0] = COMPUTER_CHOOSE;
                break;
            }

            board[x][y] = COMPUTER_CHOOSE;
            break;
        }
    }
}
char check_board(char board[row][col])
{
    int i, j;
    for (i = 0; i < row; ++i)
    {
        if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2])
            return board[i][0];
    }
    for (j = 0; j < col; ++j)
    {
        if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j])
            return board[0][j];
    }
    if (board[1][1] != ' '&&board[1][1] == board[0][0] && board[1][1] == board[2][2])
        return board[1][1];
    if (board[1][1] != ' '&&board[1][1] == board[0][2] && board[1][1] == board[2][0])
        return board[1][1];
    for (i = 0; i < row; ++i)
    for (j = 0; j < col; ++j)
    {
        if (board[i][j] == ' ') return 'c';
    }
    return 'h';
}
int start_game(char board[row][col])
{
    char stca;
    initboard(board);
    beau(board);
    stca = check_board(board);
    while (stca=='c' )
    {
        player_input(board);
        check_board(board);
        stca = check_board(board);
        computer_input(board);
        beau(board);
        check_board(board);
        stca = check_board(board);
    }
    if (stca == 'x')
    {
        printf("You win\n");
    }
    else if (stca == '0')
    {
        printf("Computer win\n");
    }
    else if (stca == 'h')
    {
        printf("You are judge\n");
    }
    else
        printf("This is wrong\n");
    stca = 0;
    return stca;
}

  2.效果展示

  二.程序分析

   先初始化界面,初始化界面后开始游戏。游戏应在玩家输入和电脑输入后反别检查结果,若有一方满足条件,则判断其赢,或者和棋,最后返回结果并退出界面。

  三.分布解析

1.声明

#include<stdio.h>  1
#include<time.h>//实现电脑随机落子做准备
#include<stdlib.h>//实现最会推出前的暂停

#include"ultil.h" //调用此源文件函数 1
#define row 3//宏常量方便修改 row为行col为列
#define col 3
void initboard(char board[row][col]); 1
void beau(char board[row][col]);
int start_game(char board[row][col]); 1
void player_input(char board[row][col]);
char check_board(char board[row][col]);
void computer_input(char board[row][col]);

后面标一的可提前写,未标的在使用前声明即可。

2.初始化棋盘

#include"mainhead.h"
char board[row][col];
int main(void)
{
    int sta;
    while (1) //判断永为真值,为在玩家多次输错的情况下可多次循环
    {
        printf("*********************************\n");
        printf("*********************************\n");
        printf("*[1] play               [2] exit*\n");
        printf("*********************************\n");
        printf("           三子棋小游戏          \n");//界面美化
        scanf("%d", &sta);
        if (sta == 1)
            sta = start_game(board);
        if (sta == 2)
    {
        system("pause");//为实现暂停后仍展示结果,同时在进行完一次游戏后可退出
        break;
    }
        else printf("Please type again\n");
    }
}

3.游戏开始函数书写

  此步书写应先进行分析,大致分为打印棋盘,用户电脑输入,检查结果,判断并打印结果。

结果分为四种电脑赢,你赢,和棋,程序出错

int start_game(char board[row][col])
{
    char stca;
    initboard(board);
    beau(board);
    stca = check_board(board);
    while (stca=='c' )判断stca是否为c,如果为c,则继续下棋,如果不是则打印结果
    {
        player_input(board);
        check_board(board);
        stca = check_board(board);
        computer_input(board);
        beau(board);
        check_board(board);
        stca = check_board(board);
    }

//' x ' 你赢' o '电脑赢 ' h '平局 ' c '继续游戏

    if (stca == 'x')//判断并打印结果
    {
        printf("You win\n");
    }
    else if (stca == '0')
    {
        printf("Computer win\n");
    }
    else if (stca == 'h')
    {
        printf("You are judge\n");
    }
    else
        printf("This is wrong\n");
    stca = 2;
    return stca;
}

  (1).初始化函数

void initboard(char board[row][col])
{
    for (int i = 0; i < row;++i)
    for (int j = 0; j < col; ++j)
    {
        board[i][j] = ' ';
    }
}

(2).美化函数

void beau(char board[row][col])
{
    for (int i = 0; i < row; ++i)
    {
        printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
        if (i<row-1)
        printf(" ___ ___ ___\n");
    }
}

(3).自己输入

void player_input(char board[row][col])
{
    int i,j;
    while (1)
    {
        scanf("%d %d", &i, &j);//输入用空格隔开
        if (i >= 0 && i<row && j>=0 && j < col&&board[i][j]==' ')//输入在棋盘范围内
    {
            board[i][j] = PLAYER_CHOOSE;//把' x '字符给对应要下的数组框
        break;
    }
        else printf("You type wrong please type again\n");
        continue;
    }
}

(4).电脑输入

void computer_input(char board[row][col])
{
    int x, y;
    srand(time(0));//读取随机数随时间计算
    while (1)
    {
        x = rand() % row;//使随机数在方框内
        y = rand() % col;

        if (board[x][y] == ' ')//判断是否有空位
        {
            int a = x, b = y;
            if (board[1][1] == ' ')//如果玩家未输入在1,1为则电脑占1, 1 位,占1, 1位容易赢。
            {
                board[1][1] = COMPUTER_CHOOSE;
                break;
            }
            for (a = 0; a < row; ++a)//判断某行玩家是否快要赢,当出现两个玩家的棋时堵住这一行的空位,因位空位位置不定所以有三个,此段代码未进行优化,所以略显冗长。
            {
                if (board[a][0] == ' '&&board[a][1] == board[a][2] && board[a][1] == 'x')
                {
                    board[a][0] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[a][1] == ' '&&board[a][0] == 'x'&&board[a][0] == board[a][2])
                {
                    board[a][1] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[a][2] == ' '&&board[a][0] == board[a][1] && board[a][0] == 'x')
                {
                    board[a][2] = COMPUTER_CHOOSE;
                    break;
                }
            }
            for (b = 0; b < col; ++b)//判断列
            {
                if (board[0][b] == ' '&&board[1][b] == board[2][b] && board[1][b] == 'x')
                {
                    board[0][b] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[1][b] == ' '&&board[0][b] == board[2][b] && board[0][b] == 'x')
                {
                    board[1][b] = COMPUTER_CHOOSE;
                    break;
                }
                if (board[2][b] == ' '&&board[1][b] == board[0][b] && board[1][b] == 'x')
                {
                    board[2][b] = COMPUTER_CHOOSE;
                    break;
                }
            }

//判断对角线
            if (board[1][1] == ' '&&board[0][0] == board[2][2] && board[0][0] == 'x')
            {
                board[1][1] = COMPUTER_CHOOSE;
                break;
            }
            if (board[2][2] == ' '&&board[1][1] == 'x'&&board[0][0] == board[1][1])
            {
                board[2][2] = COMPUTER_CHOOSE;
                break;
            }
            if (board[0][0] == ' '&&board[1][1] == board[2][2] && board[1][1] == 'x')
            {
                board[0][0] = COMPUTER_CHOOSE;
                break;
            }
            if (board[1][1] == ' '&&board[0][2] == board[2][0] && board[0][2] == 'x')
            {
                board[1][1] = COMPUTER_CHOOSE;
                break;
            }
            if (board[0][2] == ' '&&board[1][1] == board[2][0] && board[1][1] == 'x')
            {
                board[0][2] = COMPUTER_CHOOSE;
                break;
            }
            if (board[2][0] == ' '&&board[0][2] == board[1][1] && board[0][2] == 'x')
            {
                board[2][0] = COMPUTER_CHOOSE;
                break;
            }

//当玩家都没快赢时则不赌,就随机输入

            board[x][y] = COMPUTER_CHOOSE;
            break;
        }
    }
}

(5).检查结果函数

char check_board(char board[row][col])
{
    int i, j;

//如果出现三个字符相同且不是都是'  '字符则返回这三个字符之一,作为判断结果的工具。
    for (i = 0; i < row; ++i)//检查行
    {
        if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2])
            return board[i][0];
    }
    for (j = 0; j < col; ++j)//检查列
    {
        if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j])
            return board[0][j];
    }
    if (board[1][1] != ' '&&board[1][1] == board[0][0] && board[1][1] == board[2][2])
        return board[1][1];
    if (board[1][1] != ' '&&board[1][1] == board[0][2] && board[1][1] == board[2][0])
        return board[1][1];
    for (i = 0; i < row; ++i)//检查是否继续
    for (j = 0; j < col; ++j)
    {
        if (board[i][j] == ' ') return 'c';
    }
    return 'h';//如果没空位,则和棋
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值