文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言实现简单三子棋小游戏

2024-04-02 19:55

关注

三子棋介绍

三子棋,民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。如果两个人都掌握了技巧,那么一般来说就是平棋。一般来说,下在中间最有利,下在角上次之,下在边上再次之。最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。

描述

使用C语言来编写一个简单的三子棋游戏

基本流程

1、显示菜单


void Menu()
{
 printf("*******************************\n");
 printf("**********0、exit**************\n");
 printf("**********1、play**************\n");
 printf("*******************************\n");
}

输入“0”退出游戏,输入“1”开始游戏。在这里我们先简单定义一下Game()函数(后面会进行详细的定义与声明),在调用Menu()函数时,我们需要用到do……(while)循环以及switch循环,代码如下:


int main()
{
 int input = 0;
 do
 {
  Menu();
  printf("输入你的选择:\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   Game();
   break;
  case 0:
   printf("退出游戏\n");
   break;
  default:
   break;
  }
 } while (input != 0);
 return 0;
}

2、棋盘初始化

三子棋棋盘分三行三列,我们首先需要定义两个变量来确定我们的行和列,使用#define来固定我们的行和列有一个好处,如果之后我们需要进行五子棋或其他游戏的表格打印时,我们可以直接在此修改,比较方便。


#define ROW 3
#define COL 3
char board[ROW][COL]={0};//定义数组

我们需要将棋盘所在位置所有元素改为空格,方便我们打印棋盘。有以下两种方式:

(1)使用for循环进行遍历


void Initboard(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   board[i][j] = ' ';
  }
 }
}

(2)使用memeset()(需要引用头文件<string.h>)


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

3、打印棋盘

打印的棋盘为三行三列,两条横线,两条竖线,九个空格。代码如下:


void Showboard(char board[ROW][COL], int row, int col)
{
 printf("======================\n");//上分割线
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   printf(" %c ", board[i][j]);//三个空格
   if (j < col - 1)//只有两列竖线
   {
    printf("|");
   }
  }
  printf("\n");
  if (i < row - 1)//横线只有两行
  {
   for (int j = 0; j < col; j++)
   {
    printf("---");
    if (j < col - 1)
    {
     printf("|");
    }
   }
   printf("\n");
  }
 }
 printf("======================\n");//下分割线
}

4、玩家落子

在玩家输入坐标后,我们需要先判断输入的坐标是否合法,其次该位置是否为空。


void Playermove(char board[ROW][COL], int row, int col)
{
 while (1)
 {
  printf("请输入坐标:\n");
  int x = 0;
  int y = 0;
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
  {
   if (board[x - 1][y - 1] = ' ')
   {
    board[x - 1][y - 1] = 'X';
    break;
   }
   else
    printf("该位置已有棋子\n");
  }
  else
  {
   printf("坐标错误\n");
  }
 }
}

5、电脑落子

电脑落子需要产生随机坐标,可使用rand函数,在使用rand函数时,需要调用头文件<stdlib.h>,同时为了保证坐标的随机性,需要引用以下语句:srand((unsigned)time(NULL))


void Computermove(char board[ROW][COL], int row, int col)
{
 while (1)
 {
  int x = rand() % row;//[0,1,2]
  int y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = 'O';
   break;
  }
 }
}

6、判断是否和棋

判断和棋可以直接写为静态函数(static),因为当前函数只为判断胜负的函数(Iswin)提供帮助。


static int Isfull(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   if (board[i][j] == ' ')
    return -1;//没有放满
  }
 }
  return 1;//平局
}

7、判断胜负关系

在该函数中,我们需要调用判断平局的函数(Isfull)如下,胜负关系可以通过返回值来判断,返回'X'时,玩家赢;返回‘O'时,电脑赢;返回‘Q'时,平局。


char Iswin(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
  {
   return board[i][1];
  }
 }
 for (int j = 0; j < col; j++)
 {
  if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
  {
   return board[0][j];
  }
 }
 if (board[1][1] == board[2][2] && board[0][0] == board[1][1] && board[0][0] != ' ')
 {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
 {
  return board[1][1];
 }
 if (Isfull(board, row, col) == 1)
 {
  return 'Q';
 }
 return ' ';
}

8、Game()函数


void Game()
{
 printf("游戏开始:\n");
 char board[ROW][COL] = { 0 };
 Initboard(board, ROW, COL);
 Showboard(board, ROW, COL);
 char ret;
 while (1)
 {
  Playermove(board, ROW, COL);
  ret = Iswin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  Showboard(board, ROW, COL);
  Computermove(board, ROW, COL);
  ret = Iswin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  Showboard(board, ROW, COL);
 }
 if (ret == 'O')
  printf("电脑赢\n");
 else if (ret == 'X')
  printf("玩家赢\n");
 else if (ret == 'Q')
  printf("平局\n");
}

Game()函数中,我们需要先初始化棋盘,再循环调用玩家落子(Playermove)、电脑落子(Computermove)、打印棋盘(Showboard)函数来确保游戏能够正常进行下去。

9、主函数


int main()
{
 srand((unsigned)time(NULL));
 int input = 0;
 do
 {
  Menu();
  printf("输入你的选择:\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   Game();
   break;
  case 0:
   printf("退出游戏\n");
   break;
  default:
   break;
  }
 } while (input != 0);
 return 0;
}

总代码如下:


#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
void Menu()
{
 printf("*******************************\n");
 printf("**********0、exit**************\n");
 printf("**********1、play**************\n");
 printf("*******************************\n");
}
 
void Initboard(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   board[i][j] = ' ';
  }
 }
}
void Showboard(char board[ROW][COL], int row, int col)
{
 printf("======================\n");
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   printf(" %c ", board[i][j]);//三个空格
   if (j < col - 1)//只有两列竖线
   {
    printf("|");
   }
  }
  printf("\n");
  if (i < row - 1)//横线只有两行
  {
   for (int j = 0; j < col; j++)
   {
    printf("---");
    if (j < col - 1)
    {
     printf("|");
    }
   }
   printf("\n");
  }
 }
 printf("======================\n");
}
void Playermove(char board[ROW][COL], int row, int col)
{
 while (1)
 {
  printf("请输入坐标:\n");
  int x = 0;
  int y = 0;
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
  {
   if (board[x - 1][y - 1] = ' ')
   {
    board[x - 1][y - 1] = 'X';
    break;
   }
   else
    printf("该位置已有棋子\n");
  }
  else
  {
   printf("坐标错误\n");
  }
 }
}
void Computermove(char board[ROW][COL], int row, int col)
{
 while (1)
 {
  int x = rand() % row;//[0,1,2]
  int y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = 'O';
   break;
  }
 }
}
static int Isfull(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   if (board[i][j] == ' ')
    return -1;//没有放满
  }
 }
  return 1;//平局
}
char Iswin(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
  {
   return board[i][1];
  }
 }
 for (int j = 0; j < col; j++)
 {
  if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
  {
   return board[0][j];
  }
 }
 if (board[1][1] == board[2][2] && board[0][0] == board[1][1] && board[0][0] != ' ')
 {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
 {
  return board[1][1];
 }
 if (Isfull(board, row, col) == 1)
 {
  return 'Q';
 }
 return ' ';
}
void Game()
{
 printf("游戏开始:\n");
 char board[ROW][COL] = { 0 };
 Initboard(board, ROW, COL);
 Showboard(board, ROW, COL);
 char ret;
 while (1)
 {
  Playermove(board, ROW, COL);
  ret = Iswin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  Showboard(board, ROW, COL);
  Computermove(board, ROW, COL);
  ret = Iswin(board, ROW, COL);
  if (ret != ' ')
  {
   break;
  }
  Showboard(board, ROW, COL);
 }
 if (ret == 'O')
  printf("电脑赢\n");
 else if (ret == 'X')
  printf("玩家赢\n");
 else if (ret == 'Q')
  printf("平局\n");
}
int main()
{
 srand((unsigned)time(NULL));
 int input = 0;
 do
 {
  Menu();
  printf("输入你的选择:\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   Game();
   break;
  case 0:
   printf("退出游戏\n");
   break;
  default:
   break;
  }
 } while (input != 0);
 return 0;
}

文章到此就结束了,希望本篇文章能够对大家有所帮助。若发现不足及错误的地方,欢迎大家批评指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯