三子棋的C语言实现

用C语言实现三子棋代码

今天将用C语言代码来实现三子棋游戏:
首先,完成该游戏需要创立一个game.h的头文件,以及game.c的源文件,还有包括主函数的测试test.c文件,这也是所有游戏的基本格式。
具体步骤如下:
1.创建菜单栏

void Menu()
{
 printf("**************************\n");
 printf("****欢迎来到三子棋游戏****\n");
 printf("**********0.exit**********\n");
 printf("**********1.play**********\n");
 printf("**************************\n");
}

2.在主函数中判断玩家对应操作所带来的影响
输入0:游戏退出
输入1:游戏开始
如果一局结束后,可继续进行游戏,加入do…while循环实现
具体用switch语句来实现,实现代码如下:

int input = 0;
do
 {
  Menu();
  printf("请输入你的操作:");
  scanf("%d", &input);
  switch (input)
  {
  case 0:
   printf("游戏退出\n");
    break;
  case 1:
   game();
   break;
  default:
   break;
  }
 } while (input);

3.接下来编写game函数
建立game.c源文件(所有游戏执行动作都在此进行建立)
3.1.初始化棋盘
利用memset函数进行初始化,代码如下:

void InitBoard(char board[ROW][COL], int row, int col)
{
 memset(board, ' ', row*col *sizeof(char));
}

3.2.打印棋盘
利用循环实现,具体代码如下

void ShowBoard(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");
  if (i<row-1)
  {
   for ( j = 0; j <col; j++)
   {
    printf("---");
    if (j<col-1)
    {
     printf("|");
    }
   }
  }
  printf("\n");
 }
}

3.3.开始游戏
3.3.1.玩家先开始,输入行列数字,若输入范围超出范围,则提示坐标不合法。具体代码如下:
玩家为‘o’,电脑为‘x’

void PlayerMove(char board[ROW][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 while (1)
 {
  printf("玩家移动\n");
  printf("请分别输入行列的坐标:");
  scanf("%d %d", &x, &y);
  if (x>=1&&y<=3)
  {
   if (board[x - 1][y - 1] == ' ')//当前位置没有棋子
   {
    board[x - 1][y - 1] = 'O';
    break;
   }
   else
   {
    printf("该位置已经被下过棋子\n");
   }
  }
  else
  {
   printf("坐标不合法\n");
  }
 }
}

3.3.2.若行列对角线连成一行则判定一方胜利,未达成条件则为平局,具体代码如下:

int 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][0] != ' ')
  {
   return board[i][0];
  }//行
  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[0][0];
  }//对角线
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
  {
   return board[0][2];
  }//对角线
  if (IsFull(board,row,col)==1)
  {
   return 'Q';//平局
  }
 }
 return ' ';//没有赢家,没有平局
}

test.c中game函数代码如下

if (ret=='O')
 {
  printf("你赢了\n");
 }
 if (ret == 'X')
 {
  printf("你输了\n");
 }
 if (ret=='Q')
 {
  printf("平局\n");
 }
}

3.3.3.平局判满条件实现
若为平局返回Q

static 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;
}

3.3.4.电脑随机输入坐标,并在主函数加入随机种子
srand((unsigned)time(NULL));

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] = 'X';
   break;
  }
 }
}

4.将所有库函数移入头文件
玩家或者电脑每走一步打印一次棋盘
5.最终代码如下
5.1 game.h

#pragma once//预防头文件重复引入
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void ShowBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
int IsWin(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);

5.2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
 memset(board, ' ', row*col *sizeof(char));
}
void ShowBoard(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");
  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;
 while (1)
 {
  printf("玩家移动\n");
  printf("请分别输入行列的坐标:");
  scanf("%d %d", &x, &y);
  if (x>=1&&y<=3)
  {
   if (board[x - 1][y - 1] == ' ')//当前位置没有棋子
   {
    board[x - 1][y - 1] = 'O';
    break;
   }
   else
   {
    printf("该位置已经被下过棋子\n");
   }
  }
  else
  {
   printf("坐标不合法\n");
  }
 }
}
static 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;
}
int 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][0] != ' ')
  {
   return board[i][0];
  }//行
  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[0][0];
  }//对角线
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
  {
   return board[0][2];
  }//对角线
  if (IsFull(board,row,col)==1)
  {
   return 'Q';//平局
  }
 }
 return ' ';//没有赢家,没有平局
}
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] = 'X';
   break;
  }
 }
}

5.3 test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Menu()
{
 printf("**************************\n");
 printf("****欢迎来到三子棋游戏****\n");
 printf("**********0.exit**********\n");
 printf("**********1.play**********\n");
 printf("**************************\n");
}
void game()
{
 int ret = 0;
 char board[3][3] = { 0 };
 InitBoard(board, 3, 3);
 ShowBoard(board, 3, 3);
 printf("==========================\n");
 while (1)
 {
  PlayerMove(board, 3, 3);
  ret=IsWin(board, 3, 3);
  if (ret != ' ')
  {
   break;
  }
  ShowBoard(board, 3, 3);
  ComputerMove(board, 3, 3);
  ret = IsWin(board, 3, 3);
  if (ret != ' ')
  {
   break;
  }
  ShowBoard(board, 3, 3);
 }
 if (ret=='O')
 {
  printf("你赢了\n");
 }
 if (ret == 'X')
 {
  printf("你输了\n");
 }
 if (ret=='Q')
 {
  printf("平局\n");
 }
}
int main()
{
 int input = 0;
 srand((unsigned)time(NULL));
 do
 {
  Menu();
  printf("请输入你的操作:");
  scanf("%d", &input);
  switch (input)
  {
  case 0:
   printf("游戏退出\n");
    break;
  case 1:
   game();
   break;
  default:
   break;
  }
 } while (input);
 return 0;
}

这样就实现了三子棋游戏。(若将电脑操作改为玩家2,也可实现双人对战)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值