简单的三子棋游戏

今天我们来用c语言写一个简单的三子棋游戏,所谓三子棋,就是在一个棋盘上三个相同棋子连成一条线即赢下游戏。下来我就来分部分介绍三子棋游戏应该怎么写。

首先,玩游戏我们需要一个棋盘,三子棋就用3*3的棋盘就好了。

void DisplayBoard(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++)
              {
                     printf(" %c ",board[i][j]);
                     if(j<col-1)
                     printf("|");
              }
              printf("\n");
              for (j = 0; j < col; j++)
              {
                     printf("---");
                     if (j < col - 1)
                           printf("|");
              }
              printf("\n");
       }
}`

接下来我们需要初始化这个棋盘。

void InitBoard(char board[ROW][COL], int row, int col)//初始化棋盘
{
       int i;
       int j;
       for (i = 0; i < row; i++)
       {
              for (j = 0; j < col; j++)
              {
                     board[i][j] = ' ';
              }
       }
}

初始化棋盘之后我们就开始写玩家走和电脑走的代码,电脑走的代码需要一个随机数来在棋盘上落子,用rand函数就好。

void ComputerPlay(char board[ROW][COL], int row, int col)//电脑走
{
       int x = 0;
       int y = 0;
       printf("电脑走:\n");
       while(1)
       {
              int x = rand() % ROW;
           int y = rand() % COL;
              if (board[x][y] == ' ')
              {
                     board[x][y] = 'O';
                     break;
              }
              
       }
       
}
void PlayerPlay(char board[ROW][COL], int row, int col)//玩家走
{
       int x = 0;
       int y = 0;
       while (1)
       {
              printf("请输入坐标:");
              scanf("%d%d", &x, &y);
              if (x > 0 && x <= row && y>0 && y <= col)
              {
                     if (board[x - 1][y - 1] == ' ')
                     {
                           board[x - 1][y - 1] = 'X';
                           break;
                     }
                     else
                           printf("坐标被占用,请重新输入:");
              }
              else
                     break;
       }
}

当玩家和电脑落子后,我们还需要函数来判断输赢,前面讲过三个相同的子连成一条线就赢了,所以我们就判断每一行,每一列以及两条对角线上是否是相同的。

char IsWin(char board[ROW][COL], int row, int col)//判断输赢
{      
       int i = 0;
       int j = 0;
       for (i=0;i<row;i++)//判断行
       {
              if (board[i][0] == board[i][1] && board[i][1] == board[1][2] && board[i][0] != ' ')
                     return board[i][0];
       }
       for (i = 0; i < col; i++)//判断列
       {
              if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
                     return board[0][i];
       }
       if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线
              return board[1][1];
       if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
              return board[1][1];
       if (IsFull(board, ROW, COL)==1)
       {
              return 'P';//平局
       }
       return ' ';
}

在玩家和电脑落子时,我们需要判断棋盘中是否还有空位让他们落子,所以我们需要一个函数来判断棋盘是否满了,同时,如果棋盘满了,而没有人获胜,那就是平局 。

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函数来打印进入游戏界面,以及用game函数来调用我们刚才的所有代码来实现这个游戏。

test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
       printf("************************************************\n");
       printf("*****╭─────────────────╮*****\n");
       printf("*****│        欢迎进入三子棋游戏     ┃*****\n");
       printf("*****╰━━━━━━━━━━━━━━━━━╯*****\n");
       printf("************************************************\n");
       printf("*****╭─────────────────╮*****\n");
       printf("*****│           1.开始游戏  ┃*****\n");
       printf("*****╰━━━━━━━━━━━━━━━━━╯*****\n");
       printf("************************************************\n");
       printf("*****╭─────────────────╮*****\n");
       printf("*****│           0.退出游戏  ┃*****\n");
       printf("*****╰━━━━━━━━━━━━━━━━━╯*****\n");
       printf("************************************************\n");
}
void game()
{
       char board[ROW][COL] = { 0 };
       char ret = '0';
       InitBoard(board, ROW, COL);
       DisplayBoard(board, ROW, COL);
       while (1)
       {
              ComputerPlay(board, ROW, COL);
              if ((ret = IsWin(board, ROW, COL)) != ' ')
                  break;
              DisplayBoard(board, ROW, COL);
              PlayerPlay(board, ROW, COL);
              if((ret = IsWin(board, ROW, COL)) != ' ')
                   break;
              DisplayBoard(board, ROW, COL);
              
       }
       if (ret == 'O')
              printf("电脑赢\n");
       else if (ret == 'X')
              printf("玩家赢\n");
       else
              printf("平局\n");
       DisplayBoard(board, ROW, COL);
}
int main()
{
       int input = 0;//开始游戏选项
       srand((unsigned int)time(NULL));
       do {
              menu();
              printf("请选择:");
              scanf("%d", &input);
              switch (input)
              {
              case 1:
                     game();
                     break;
              case 0:
                     break;
              default:
                     printf("请重新选择;\n");
              }
              
       } while (input);
       system("pause");
       return 0;
}

我们的所有头文件都写在game.h里

game.h
#ifndef _Game_h__
#define _Game_h__
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void ComputerPlay(char board[ROW][COL], int row, int col);
void PlayerPlay(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
#endif

到这里,我们三子棋游戏的所有代码都写完了,虽然是个很简单的小游戏,但也挺有意思的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值