三子棋游戏的简单实现(C语言后附完整代码)(下)

简介: 三子棋游戏的简单实现(C语言后附完整代码)(下)

4.电脑输入


电脑输入这里我们将引用前面猜数字游戏所讲的一个知识点,随机数的产生,接下来我们来看看代码的实现


void ComputerMove(char board[ROW][COL], int row, int col)
{
  printf("电脑输入\n");
  while (1)//循环输入,直到输入成功为止
  {
    int x = rand() % row;//与前面所讲的srand()一起使用,可产生1-row的随机数
    int y = rand() % col;//1-col的随机数
    if (board[x - 1][y - 1] == ' ')
    {
      board[x - 1][y - 1] = '#';//电脑下棋落子记为'#'
      break;//输入成功跳出循环
    }
  }
}


结果展示可以参考上一张图


5.判断输赢


数据输入了进来,这时候我们就要进行判断游戏是否继续,如果不继续结果是怎么样的?

代码如下:


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][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[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 (IsFull(board, row, col) == 1)
  {
    return 'Q';
  }
  //继续
  return 'C';
}


这个函数里还嵌套了一个IsFull()得函数,用来判断是否所有空格都被填满,代码如下


int IsFull(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++)
    {
      if (board[i][j] == ' ')
        return 0;
    }
  }
  return 1;
}


到此为止所有需要得功能都已经写完,接下来我们要将他们组装起来,组装如下


void game()
{
  char board[ROW][COL] = { 0 };
  InitBoard( board,  ROW,  COL);//数组初始化
  DisplayBoard(board, ROW, COL);//打印最初得棋盘
  while (1)
  {
    PlayerMove(board, ROW, COL);//玩家输入
    DisplayBoard(board, ROW, COL);//打印已经改变的棋盘
    if (IsWin(board, ROW, COL) != 'C')//判断是否继续游戏
      break;//游戏结束跳出循环
    ComputerMove(board, ROW, COL);//电脑输入
    DisplayBoard(board, ROW, COL);//打印改变得棋盘
    if (IsWin(board, ROW, COL) != 'C')//判断是否继续游戏
      break;
  }
  if (IsWin(board, ROW, COL) == '*')
    printf("恭喜你,你赢了!!\n");//接受返回值做出判断
  if (IsWin(board, ROW, COL) == '#')
    printf("很遗憾,你输了!!\n");//接受返回值做出判断
  if (IsWin(board, ROW, COL) == 'Q')
    printf("平局!!\n");//接受返回值做出判断
}


至此呢,所有代码都已完成,我们来试玩一下



成功实现,但是我们发现,前面堆积太多了,下一次游戏进行十分不美观,这时候博主前面所讲得一个就起作用了  ,有了这一段代码后,只需要你再按一下回车,就可以清除前面所打印的。



以上就是博主的对三子棋游戏的实现,制作不易,各位看官给个三连呗!!!

以上就是博主的对三子棋游戏的实现,制作不易,各位看官给个三连呗!!!

game.h


#pragma once
#include<stdio.h>
#include<time.h>
#include<windows.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);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

game.c

#include "game.h"
void InitBoard(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++)
    {
      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");
    for (j = 0; j < row; j++)
    {
      if (i < row - 1)
      {
        printf("---");
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
  printf("玩家输入\n");
  printf("请输入一个坐标,中间用空格隔开>:");
  int x = 0;
  int y = 0;
  while (1)
  {
    scanf("%d%d", &x, &y);
    if ((x<1 && x>row) || (x<1 && x>col))
      printf("非法输入,请重新输入\n");
    if (board[x - 1][y - 1] == ' ')
    {
      board[x - 1][y - 1] = '*';
      break;
    }
    else printf("此处已被占用,请重新输入\n");
  }
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
  printf("电脑输入\n");
  while (1)
  {
    int x = rand() % row;
    int y = rand() % col;
    if (board[x - 1][y - 1] == ' ')
    {
      board[x - 1][y - 1] = '#';
      break;
    }
  }
}
int IsFull(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++)
    {
      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][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[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 (IsFull(board, row, col) == 1)
  {
    return 'Q';
  }
  //继续
  return 'C';
}
void game()
{
  char board[ROW][COL] = { 0 };
  InitBoard( board,  ROW,  COL);
  DisplayBoard(board, ROW, COL);
  while (1)
  {
    PlayerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    if (IsWin(board, ROW, COL) != 'C')
      break;
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    if (IsWin(board, ROW, COL) != 'C')
      break;
  }
  if (IsWin(board, ROW, COL) == '*')
    printf("恭喜你,你赢了!!\n");
  if (IsWin(board, ROW, COL) == '#')
    printf("很遗憾,你输了!!\n");
  if (IsWin(board, ROW, COL) == 'Q')
    printf("平局!!\n");
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
  printf("********  三子棋游戏  ********\n");
  printf("******** 1 .  玩游戏   *******\n");
  printf("******** 2 . 退出游戏  *******\n");
  printf("**规则:一次一子,三子相连为赢\n");
  printf("******************************\n");
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择!\n");
      break;
    }
    getchar();
    getchar();
    system("cls");
  } while (input);
  return 0;
}
相关文章
|
2月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
100 8
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
65 4
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
82 1
|
2月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
66 2
|
机器学习/深度学习 人工智能 固态存储
C语言决赛代码
#include #include #include struct book { int num; char bname[50]; char wname[20]; char press[50]; char sort[50]; int time; float p...
860 0
|
13天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
52 23
|
13天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
44 15
|
13天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
53 24

热门文章

最新文章