C语言实现三子棋游戏

C语言实现三子棋游戏

相信大家都玩过三子棋游戏,三子棋是一款非常简单且有趣的游戏。下面,我就来带领大家如何用C语言实现简单的三子棋游戏

首先,我们主函数只需要放一句简单的test函数,然后我们在该函数里面编写接下来的代码

#include "game.h"
int main()
{
    test();
    return 0;
}

test函数里面,首先,随机数我们用时间戳来进行实现,也就是srand和time两个函数。接着打印我们简易的菜单menu。然后会让你输入:如果输入1则会进入game函数开始游戏;如果输入0则退出游戏结束循环;输入其它的则会提示“选择错误,请重新选择”。

void test()
{
    int input=0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择\n");
        scanf("%d",&input);
        switch(input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,请重新选择\n");
            break;
        }
    }while(input);
}

菜单完成了,我们接下来开始实现棋盘的打印了。我们在game函数里面先定义好我们的棋盘,用数组来存放我们输入的“棋子”

//数组-存放走出的棋盘信息
    char board[ROW][COL]={0};

再初始化棋盘

//初始化棋盘
    InitBoard(board,ROW,COL);

然后打印出来看看

//打印棋盘
    DisplayBoard(board,ROW,COL);

棋盘无误后,我们就可以开始下棋了。首先是玩家下一步,然后判断一下是否赢;没赢的话,就电脑下一步棋,然后判断电脑是否赢。玩家下的棋是用 * 来代替,而电脑下的棋是用 # 来代替。当ret返回一个符号时,如果不是e的话则跳出循环判断输赢,此时如果返回的是 *则玩家赢,如果返回的是#则电脑赢,否则就是棋盘满了平局。

void game()
{
    int ret=0;

    //数组-存放走出的棋盘信息
    char board[ROW][COL]={0};
    //初始化棋盘
    InitBoard(board,ROW,COL);
    //打印棋盘
    DisplayBoard(board,ROW,COL);
    //下棋
    while(1)
    {
        //玩家下棋
        Playermove(board,ROW,COL);
        DisplayBoard(board,ROW,COL);
        //判断玩家是否赢
        ret=Iswin(board,ROW,COL);
        if(ret!='e')
        {
            break;
        }

        //电脑下棋
        Computermove(board,ROW,COL);
        DisplayBoard(board,ROW,COL);
        //判断电脑是否赢
        ret=Iswin(board,ROW,COL);
        if(ret!='e')
        {
            break;
        }
    }
    if(ret=='*')
    {
        printf("玩家赢\n");
    }
    else if(ret=='#')
    {
        printf("电脑赢\n");
    }
    else
    {
        printf("平局\n");
    }
}

而具体怎样实现,我写在了另一个文件game.c里。
首先是实现初始化棋盘

#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++)
        {
            printf(" %c ",board[i][j]);
            if(j<col-1)
                printf("|");
        }
        printf("\n");
        if(i<row-1)
        {
          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);
    //判断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;
       }
    }
}

接着是判断下棋的输赢

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][1];
        }
    }

    //竖三列判断
    for(i=0;i<col;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[0][2]==board[1][1] && board[1][1]==board[2][0] && board[1][1]!=' ')
    {
        return board[1][1];
    }

    //判断是否平局
    if(1==Isfull(board,ROW,COL))
    {
        return 'o';
    }
    return 'e';
}

判断棋盘是否满了

//返回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;//满了
}

此时呢,我们的main.c文件和game.c文件代码都写完了,我们可以看到都引用了“game.h”头文件。我们还差最后一步在game.h定义一些函数和变量即可。

#define GAME_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3

//声明
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);

//告诉我们游戏四种状态
//玩家赢--'*'
//电脑赢--'#'
//平局--'o'
//继续--'e'
char Iswin(char board[ROW][COL],int row,int col);
int Isfull(char board[ROW][COL],int row,int col);

在这里插入图片描述
最后总结一下,我们需要三个文件,一个是自带的main,c文件,另一个是我们自己新建的一个game.c文件,还有一个是新建的头文件game.h。我们只需要在这三个文件里分别敲代码即可实现。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,设计三子棋游戏可以分为以下几个步骤: 1. 定义棋盘:通常使用一个三行三列的二维数组来表示棋盘,用数字0表示空位,用数字1表示玩家1下的棋子,用数字2表示玩家2下的棋子。 2. 实现落子功能:用户输入行列坐标,程序判断该位置是否为空位,如果是则将该位置设置为当前玩家下的棋子。 3. 判断胜负:每次玩家下完棋后,程序需要判断是否有一方取得胜利,可以通过遍历棋盘实现。 4. 实现人机对战:可以使用随机数来模拟电脑的落子,也可以使用一些简单的算法来提高电脑的智能程度。 下面是一个简单的C语言三子棋游戏代码示例,供参考: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> int chessboard[3][3]; // 棋盘 int check_win(int player) // 判断胜负 { int i, j; for (i = 0; i < 3; i++) { if (chessboard[i][0] == player && chessboard[i][1] == player && chessboard[i][2] == player) { return 1; } if (chessboard[0][i] == player && chessboard[1][i] == player && chessboard[2][i] == player) { return 1; } } if (chessboard[0][0] == player && chessboard[1][1] == player && chessboard[2][2] == player) { return 1; } if (chessboard[0][2] == player && chessboard[1][1] == player && chessboard[2][0] == player) { return 1; } return 0; } void print_chessboard() // 打印棋盘 { int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (chessboard[i][j] == 0) { printf(" "); } else if (chessboard[i][j] == 1) { printf("X"); } else if (chessboard[i][j] == 2) { printf("O"); } if (j < 2) { printf("|"); } } printf("\n"); if (i < 2) { printf("-+-+-\n"); } } } int main() { int player = 1; // 玩家先手 int row, col; srand((unsigned)time(NULL)); // 初始化随机数生成器 printf("Welcome to the Tic-Tac-Toe game!\n"); printf("Player 1: X\n"); printf("Player 2: O\n"); while (1) { printf("Player %d's turn.\n", player); if (player == 1) { printf("Please input the row and column numbers to place your chess(X).\n"); scanf("%d%d", &row, &col); if (chessboard[row][col] != 0) { printf("This place has been taken, please choose another place.\n"); continue; } chessboard[row][col] = 1; } else { printf("Thinking...\n"); while (1) { row = rand() % 3; col = rand() % 3; if (chessboard[row][col] == 0) { break; } } chessboard[row][col] = 2; } print_chessboard(); if (check_win(player)) { printf("Player %d wins!\n", player); break; } if (player == 1) { player = 2; } else { player = 1; } } return 0; } ``` 注意:以上代码仅作为参考,可能存在一些漏洞和不足之处,需要在实际使用中进行完善。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyro达令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值