三子棋游戏程序编写(C语言版)

简介: ●通过对三子棋的程序编写,实现对数组等知识点的应用与理解。●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

前言:

●通过对三子棋的程序编写,实现对数组等知识点的应用与理解。

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文:

说明:本代码编译环境为Visual Studio2019,其中出现特定为该编译器设定的代码语句:#define  _CRT_SECURE_NO_WARNINGS

此代码语句的功能:为了解决Visual Studio编译环境的一些库函数等报错或警告问题

注:代码语句只在Visual Studio编译环境使用,其他编译器需屏蔽此代码语句

 

1.创建头文件:game.h  

代码如下:

#define ROW 3 //行
#define COL 3 //列
  //转向test.c修改数组定义,将[3][3]修改为[ROW][COL]
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL], int row,int col);  //对应接收test.c中的Initboard(...) ,这里row,col小写等会调试
   //转到game.c 实现
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);
//告知我们四种游戏状态
//玩家赢 - '*’
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char IsWin(char board[ROW][COL], int row, int col);

image.gif

2.创建源文件:  game.c

代码如下:

#define  _CRT_SECURE_NO_WARNINGS
#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] = ' ';
    }
  }
}
//这时每个元素均初始化,转到test.c
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    //1.打印一行的数据
    //printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
    //改为如下
    int j = 0;
    for (j = 0; j < col; j++)
    {
      //1.打印一行的数据
      printf(" %c ", board[i][j]);
      if (j < col - 1)  //控制是否打印最后一列
        printf("|");
    }
    printf("\n");
    //2.打印分割行
    if (i < row - 1)   //控制是否打印最后一行
    {
      //printf("---|---|---\n");
      for (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)
{
  int x = 0;
  int y = 0;
  printf("请玩家置入棋子:>\n");
  while (1)
  {
    printf("请玩家输入坐标:>");
    scanf("%d%d", &x, &y);
    //判断x,y坐标的合法性
    if (x >= 1 && x <= row && y >= 1 && y <= col)  //玩家可能不理解数组从0开始,而认为从1开始
    {
      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;
    }
  }
}
//返回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; //满了
}
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]; //[i][0]   //[i][2]均可以
    }
  }
  //竖三列
  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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
  {
    return board[1][1];
  }
  //判断是否平局
  if (1 == IsFull(board, ROW, COL))
  {
    return 'Q';
  }
  return 'C';
}

image.gif

3.创建源文件: test.c

代码如下:

//测试三子棋游戏
#define  _CRT_SECURE_NO_WARNINGS   //此语句为使用VS2019编译环境特定,其他编译器可屏蔽此语句
 //步骤一   test.c步骤    //#include <stdio.h>     
//void menu()
//{
//  printf("***********************\n");
//  printf("****1.play   0.exit****\n");
//  printf("***********************\n");
//}
//void test()
//{
//  int input = 0;  //最初赋个随机值
//  do
//  {
//    menu(); //菜单
//    printf("请选择:>");
//    scanf("%d", &input);
//    switch (input)
//    {
//    case 1:
//      printf("三子棋\n");
//      break;
//    case 0:
//      printf("退出游戏\n");
//      break;
//    defult:   //选择的不是1也不是0
//      printf("选择错误,请重新选择!\n");
//      break;
//    }
//  }
//  while (input);    //判断选择要为真  0为假,1或defult为真(!0)
//}
//int main()
//{
//  test();
//  return 0;
//}
//步骤二  创建void game()及棋盘
#include <stdio.h>
#include "game.h"    //这时可使用game.h中定义的行列
void menu()
{
  printf("三子棋游戏\n");
  printf("***********************\n");
  printf("****1.Play   0.Exit****\n");
  printf("***********************\n");
  printf("//输入坐标方式为;行(输入数字)-空格键-列(输入数字)//\n");
}
//游戏的整个算法实现
void game()    
{ 
  char ret = 0;
  //创建数组,存放走出的棋盘信息
  char board[ROW][COL] = { 0 };   //char board[3][3] = { 0 };//将[3][3]修改为[ROW][COL]
    //再引用自定义头文件"game.h"
  //初始化棋盘
  InitBoard(board,ROW,COL); //再转到game.h定义
  //这时打印棋盘
  DisplayBoard(board,ROW,COL); //再分装打印棋盘的函数
  //下棋
  while (1)
  {
    //玩家下棋
    PlayerMove(board,ROW,COL);
    DisplayBoard(board, ROW, COL);
    //判断玩家是否赢棋
    ret=IsWin(board,ROW,COL);
    if (ret != 'C')
    {
      break;
    }
    //电脑下棋
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断电脑是否赢棋
    ret=IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
  }
  if (ret == '*')
  {
    printf("玩家获胜!\n请选择是否进行下一局!\n");
  }
  else if (ret == '#')
  {
    printf("电脑获胜!\n请选择是否进行下一局!\n");
  }
  else
  {
    printf("平局!\n请选择是否进行下一局!\n");
  }
}
void test()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择<Play>(输入1)或<Exit>(输入0):>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏!\n");
      break;
    defult:
      printf("选择错误,请重新选择!\n");
      break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}

image.gif

4.按照提示运行程序即可

运行示例:

image.gif编辑

image.gif编辑

image.gif编辑

总结:

作为作者编写的第一个游戏程序,夹杂着喜悦与辛酸!作为一名学习编程新手,作者目前水平有限,只会照葫芦画瓢,其中蕴含的知识极为深邃,而作者只领略一二!虽然仅是照葫芦画瓢的编入编译器,但调试环节确实让作者学会了许多知识!

调试过程中,作者几次都以为将要失败,但坚持经历了多次调试与请教后,终于使得这个第一次编写的游戏程序成功运行!这是一件极为让人喜悦的事!

囿于某些原因,本文有许多不详细,不足之处,其中许多知识仍需作者反复学习与理解,希望在以后的时光里,作者能够和读者一道共同成长!

此处,致敬第一个写出三子棋游戏代码的开发者。

                                                                                            ——By 新晓•故知

相关文章
|
1月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
79 8
|
29天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5
|
29天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
65 4
|
28天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
62 1
|
29天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
47 2
|
29天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
46 2
|
29天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
41 1
|
1月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
35 1
|
C语言
C语言小游戏------俄罗斯方块
C语言写的俄罗斯方块小游戏
273 0
|
26天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
55 10