C语言三子棋

这是一个井字游戏(Tic Tac Toe)的实现,包括初始化棋盘、显示棋盘、玩家和电脑的移动,以及检查游戏状态(赢、输或平局)。代码分为头文件和源文件,包含游戏逻辑和用户交互。玩家和电脑的移动通过随机选择空位进行,游戏状态检查则遍历所有可能的获胜组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件:game.h

#define ROW 3

#define COL 3

#include<stdio.h>

#include<stdlib.h>//srand 的头文件

#include<time.h>//time 的头文件

//函数声明

void InitBoard(char board[ROW][COL], int row, int col);

void DisplayBoard(char board[ROW][COL], int row, int col);

void PlayerMove(char board[ROW][COL], int row, int col);

void ComputerMove(char board[ROW][COL], int row, int col);

//  告诉我们游戏的四种状态

//玩家赢--‘*’

//电脑赢--'#'

//平局--‘Q’

//继续--'C'

char IsWin(char board[ROW][COL], int row, int col);

源文件一:test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)

{

    int i = 0;

    int j = 0;

    for (i = 0; i < row; i++)

    {

        for (j = 0; j < col; j++)

        {

             board[i][j] = ' ';//打印空格

        }

    }

}

//void DisplayBoard(char board[ROW][COL], int row, int col)

//{

//  int i = 0;

//  for (i = 0; i <row; i++)

//  {

//      //1.打印一行数据

//      printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);

//      //2.打印分割行

//      if(i<row-1)

//      printf("---|---|---\n");

//  }

//}

void DisplayBoard(char board[ROW][COL], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

   

        int j = 0;

        for (j = 0; j < col; j++)

        {   //1.打印一行数据

             printf(" %c ", board[i][j]);

             if (j < col - 1)

                 printf("|");

        }

        printf("\n");

        //2.打印分割行

        if (i < row - 1)

        {

             int j = 0;

             for (j = 0; j < col; j++)

             {

                 printf("---");

                 if (j < col - 1)

                     printf("|");

             }

             printf("\n");

        }

    }

}

void PlayerMove(char board[ROW][COL], int row, int col)

{

    int x = 0;

    int y = 0;

    printf("玩家走:>\n");

    while (1)

    {

        printf("请输入要下的坐标:>\n");

        scanf("%d%d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)

        {

             if (board[x - 1][y - 1] == ' ')

             {

                 board[x - 1][y - 1] = '*';

                 break;

             }

             else

             {

                 printf("该坐标被占用\n");

             }

        }

        else

        {

             printf("坐标非法,请重新输入:\n");

        }

    }

}

void ComputerMove(char board[ROW][COL], int row, int col)

{

    int x = 0;

    int y = 0;

    printf("电脑走:>\n");

    while (1)

    {

        x = rand() % row;

        y = rand() % col;

        if (board[x][y] == ' ')

        {

             board[x][y] = '#';

             break;

        }

    }

}

//返回1表示棋盘满了

//返回0表示棋盘没满

int IsFull(char board[ROW][COL], int row, int col)

{

    int i = 0;

    int j = 0;

    for (i = 0; i < row; i++)

    {

        for (j = 0; j < col; j++)

        {

             if (board[i][j] == ' ')

                 return 0;//没满

        }

    }

    return 1;//满了

}

char IsWin(char board[ROW][COL], int row, int col)

{

    int i = 0;

    //横三行

    for (i = 0; i < row; i++)

    {

        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')

        {

             return board[i][0];

        }

    }

    //竖三列

    for (i = 0; i < row; 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];

        }

    if (board[2][0] == board[1][1] && board[1][1] == board[3][0] && board[1][1] != ' ')

        {

             return board[1][1];

        }

        //判断是否平局

    int ret = IsFull(board, ROW, COL);

    if (ret == 1)

        {

             return 'Q';//返回结束。

        }

    return 'C';//棋盘没满返回C,继续游戏。

    }

源文件二:game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)

{

    int i = 0;

    int j = 0;

    for (i = 0; i < row; i++)

    {

        for (j = 0; j < col; j++)

        {

             board[i][j] = ' ';//打印空格

        }

    }

}

void DisplayBoard(char board[ROW][COL], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

   

        int j = 0;

        for (j = 0; j < col; j++)

        {   //1.打印一行数据

             printf(" %c ", board[i][j]);

             if (j < col - 1)

                 printf("|");

        }

        printf("\n");

        //2.打印分割行

        if (i < row - 1)

        {

             int j = 0;

             for (j = 0; j < col; j++)

             {

                 printf("---");

                 if (j < col - 1)

                     printf("|");

             }

             printf("\n");

        }

    }

}

void PlayerMove(char board[ROW][COL], int row, int col)

{

    int x = 0;

    int y = 0;

    printf("玩家走:>\n");

    while (1)

    {

        printf("请输入要下的坐标:>\n");

        scanf("%d%d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)

        {

             if (board[x - 1][y - 1] == ' ')

             {

                 board[x - 1][y - 1] = '*';

                 break;

             }

             else

             {

                 printf("该坐标被占用\n");

             }

        }

        else

        {

             printf("坐标非法,请重新输入:\n");

        }

    }

}

void ComputerMove(char board[ROW][COL], int row, int col)

{

    int x = 0;

    int y = 0;

    printf("电脑走:>\n");

    while (1)

    {

        x = rand() % row;

        y = rand() % col;

        if (board[x][y] == ' ')

        {

             board[x][y] = '#';

             break;

        }

    }

}

//返回1表示棋盘满了

//返回0表示棋盘没满

int IsFull(char board[ROW][COL], int row, int col)

{

    int i = 0;

    int j = 0;

    for (i = 0; i < row; i++)

    {

        for (j = 0; j < col; j++)

        {

             if (board[i][j] == ' ')

                 return 0;//没满

        }

    }

    return 1;//满了

}

char IsWin(char board[ROW][COL], int row, int col)

{

    int i = 0;

    //横三行

    for (i = 0; i < row; i++)

    {

        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')

        {

             return board[i][0];

        }

    }

    //竖三列

    for (i = 0; i < row; 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];

        }

    if (board[2][0] == board[1][1] && board[1][1] == board[3][0] && board[1][1] != ' ')

        {

             return board[1][1];

        }

        //判断是否平局

    int ret = IsFull(board, ROW, COL);

    if (ret == 1)

        {

             return 'Q';//返回结束。

        }

    return 'C';//棋盘没满返回C,继续游戏。

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值