C语言小游戏---三子棋

将整个代码分装在三个文件中,分别为源文件:test.c game.c game.h 。
代码如下:
game.h

#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3//定义棋盘行数和列数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void Menu();//用来打印菜单
void Game();//游戏的主体函数
int Win(char chess[ROW][COL]);//判断游戏的赢家
int Go_on(char chess[ROW][COL]);//判断游戏是否应该继续
void Print(char chess[ROW][COL]);//打印棋盘
void Init(char chess[ROW][COL], int row, int col);//初始化棋盘
#endif//game.h

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char chess[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            chess[i][j] = ' ';//将定义好的棋盘数组每一个元素都初始化为字符空格
        }
    }
}
void Print(char chess[ROW][COL])
{//打印棋盘
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            printf(" %c ",chess[i][j]);
            if (j != COL-1)
            {
                printf("|");
            }
        }
        printf("\n");
        if (i != ROW - 1)
        {
            for (k = 0; k < COL; k++)
            {
                printf("---");
                if (k != COL - 1)
                {
                    printf("|");
                }
            }
        }
        printf("\n");
    }
}
int Go_on(char chess[ROW][COL])
{//判断棋盘是否被充满,对比棋盘上的每一个元素,如果出现空格就返回1,没有出现空格就返回0
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            if (chess[i][j]==' ')
            {
                return 1;
            }
        }
    }
        return 0;

}
int Win(char chess[ROW][COL])//判断是否有获胜的一方,玩家获胜返回字符0,电脑获胜返回字符X
{
    int i = 0;
    int ret = 0;
    for (i = 0; i < ROW; i++)
    {
        if (chess[i][0] == chess[i][1]
            && chess[i][1] == chess[i][2]
            && chess[i][0] != ' ')
        {
            return chess[i][0];
        }
    }
    for (i = 0; i < COL; i++)
    {
        if (chess[0][i] == chess[1][i]
            && chess[1][i] == chess[2][i]
            && chess[0][i] != ' ')
        {
            return chess[0][i];
        }
    }
    if (chess[0][0] == chess[1][1]
        && chess[1][1] == chess[2][2]
        && chess[0][0] != ' ')
    {
        return chess[0][0];
    }
    if (chess[0][2] == chess[1][1]
        && chess[1][1] == chess[2][0]
        && chess[0][2] != ' ')
    {
        return chess[0][2];
    }
    ret=Go_on(chess);//由于会有平局的情况出现,所以这里要判断棋盘是否已被充满,充满时返回字符q,也就是平局的情况出现
    if (1 == ret)//ret=1时表示棋盘没有被充满,所以玩家和电脑就可以继续游戏
    {
        ;
    }
    else
    {
        return 'q';
    }
}
void Game()
{
    int i = 0;
    int row = 0;
    int col = 0;
    int row_cmp = 0;
    int col_cmp = 0;
    char winer = 0;
    srand((unsigned int)time(NULL));//设置随机数种子
    char chess[ROW][COL] = { 0 };//定义棋盘数组
    Init(chess, ROW, COL);
    Print(chess);//打印一次棋盘
    while (Go_on(chess))//当棋盘没有被充满时,Go_on(chess)返回值为1,即循环可以进行,棋盘充满后返回值为0,就会跳出循环了
    {
        printf("玩家走:");
        scanf("%d %d", &row, &col);
        while (chess[row][col] != ' ')//当玩家输入的坐标位置为空格时,这是一次合法输入,否则玩家需要重新输入
        {
            printf("位置已经被占用,请重新选择:");
            scanf("%d %d", &row, &col);
        }
        chess[row][col] = '0';//将玩家输入的合法位置改为字符0,也就是玩家的棋子
        Print(chess);//每输入一次就打印一次更新后的棋盘
        winer = Win(chess);//每次输入之后就判断一次是否有赢家或者平局的情况出现
        if (winer == 'X')
        {
            printf("电脑赢\n");
            break;
        }
        else if (winer == '0')
        {
            printf("玩家赢\n");
            break;
        }
        else if (winer == 'q')
        {
            printf("平局\n");
            break;
        }
        printf("电脑走:");
        do
        {
            row_cmp = rand() % ROW;
            col_cmp = rand() % COL;
        } while (chess[row_cmp][col_cmp]!=' ');//分别随机生成0到2的随机数,当生成的位置在棋盘上为空格时,跳出此循环
        chess[row_cmp][col_cmp] = 'X';//将电脑生成的随机合法位置改为字符X
        printf("\n");
        Print(chess);//再打印一次棋盘
        winer=Win(chess);//再判断是否有赢家出现
        if (winer == 'X')
        {
            printf("`电脑赢\n");
            break;
        }
        else if (winer == '0')
        {
            printf("玩家赢\n");
            break;
        }
        else if (winer == 'q')
        {
            printf("平局\n");
            break;
        }
    }

}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//将所有使用的头文件都写进game.h中,所以这里只需要引用game.h就ok了
void Menu()
{
    printf("*****************************************************\n");
    printf("********         1.play      0. exit         ********\n");
    printf("*****************************************************\n");
    printf("请选择:");
}
int main()//函数从此处进入
{
    while (1)//将函数总体写成一个死循环,只有当玩家在开始游戏或结束一次游戏后选择0(退出游戏)时程序才会结束运行
    {
        Menu();
        int i = 0;
        scanf("%d", &i);
        switch (i)
        {
        case 0:printf("退出游戏\n");
            system("pause");
            return 0;           
            break;
        case 1:printf("开始游戏\n");
            Game();
            break;
        default:printf("非法选择,请重新开始\n");
            break;
        }
    }
}

以上就是C语言三子棋的所有代码。

猜你喜欢

转载自blog.csdn.net/h___q/article/details/78811300