目录

前言

一、三子棋的实现

1、代码实现步骤:

2、模块化代码

二、代码示例及解析

1、game.h

2、test.c(main()函数+game()函数)

3、game.c(实现game()各个功能)

1>、打印菜单

2>、初始化棋盘

3>、打印棋盘

4>、玩家下棋

5>、电脑下棋

6>、判断胜负

7>、判断胜负函数中判断相等或遍历的函数

三、结果演示

1、玩家胜

2、电脑胜

3、平局

四、代码汇总

总结


前言

想必大家上中学的时候和同学、朋友玩过五子棋。三子棋则更简单,今天我们就用C语言来写一个三子棋(稍加修改就可变为五子棋)

这次的代码的实现主要用到了数组、循环、分支、函数几个模块内容

一、三子棋的实现

1、代码实现步骤:

1、打印菜单(1.开始游戏  0.退出游戏)

2、创建棋盘并初始化

3、打印棋盘

4、玩家下棋    +判断胜负(胜、负 、平局)+打印棋盘

5、电脑下棋    +判断胜负  +打印棋盘

2、模块化代码

合理分类代码,实现函数,达到模块化的目的,也提高代码的可读性

game.h   存放头文件+定义宏+实现函数声明

test.c       存放main()函数,用循环完成进入游戏选择

game.c    完成游戏的各个功能

二、代码示例及解析

1、game.h

简析:

在这里,我们用到了#define ROW 3,即define定义宏,以便于后期代码的维护,如要改成五子棋,则只需将3改为5即可(判断胜负的函数已经做了优化)

代码如下:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define ROW 3        //使用define宏,是为了更好的维护代码,更改时方便
#define COL 3void menu();                                                 //打印菜单
void game();
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);          //判断状态
int Isfull(char board[ROW][COL], int row, int col);    //判断平局
int JudgeBoard(char judge[20], int cnt);      //判断对角线是否相等

2、test.c(main()函数+game()函数)

简析:

game()函数调用其他功能函数,实现游戏

main()函数打印,选择界面菜单及选择结果处理

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"//实现游戏
void game()
{char ret = 0;char board[ROW][COL] = { 0 };InitBoard(board, ROW, COL);         //初始化DisplayBoard(board, ROW, COL);while (1)     //每一局输入多次坐标{PlayerMove(board, ROW, COL);        //玩家下棋ret = Iswin(board, ROW, COL);if (ret != 'C')break;DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);     //电脑下棋ret = Iswin(board, ROW, COL);if (ret != 'C')break;DisplayBoard(board, ROW, COL);}if (ret == 'X')printf("玩家胜!\n");if (ret == 'O')printf("电脑胜\n");if (ret == 'Q')printf("平局\n");DisplayBoard(board, ROW, COL);system("pause");system("cls");
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏:>\n");break;default:printf("选择错误,请重新选择:>\n");break;}} while (input);return 0;
}

3、game.c(实现game()各个功能)

1>、打印菜单

代码如下:

//打印菜单
void menu()
{printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.exit *******\n");printf("**********************\n");
}

演示:

2>、初始化棋盘

简析:

将创建的二维数组初始化,目的是为了后续打印棋盘时让棋盘有序打印

代码如下

//棋盘初始化(数组初始化)
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] = ' ';}}
}

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");if (i < row - 1)           //控制行,棋盘需要两组---|---|---{for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}

演示:

4>、玩家下棋

简析:

要考虑一下几点

1、玩家输入的坐标比数组下标大1,如:输入1 1,其实指的是board[0][0]

2、输入的坐标应满足:1<=x<=ROW和1<=y<=COL

3、输入的坐标已经被占用,则需要重新输入

代码如下:

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入坐标:(row col)\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'X';break;}elseprintf("坐标被占用,请选择其他位置\n");}elseprintf("坐标非法,请重新输入\n");}
}

5>、电脑下棋

简析:

关于如何产生随机数,上一篇博客猜数字游戏中已经说明,有需要的话可以自己去翻看

代码如下

//电脑下棋
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][y] == ' '){board[x][y] = 'O';break;}}
}

6>、判断胜负

简析:

每次玩家下完棋和电脑下完棋都会判断是否胜利

判断函数有四种状态:

1、玩家赢  2、电脑赢  3、平局  4、继续

易知,1,2,3都会退出该局游戏,4则继续游戏,因此可以在game()函数中,接收判断函数的返回值来确定状态,可以用以下字符作为返回值

玩家胜     X
电脑胜     O
平局        Q 
继续        C

深层分析可知赢有四种情况:横、竖、主对角线、副对角线

其中横、竖胜利的实现可以在Iswin函数内完成,而对角线可以将满足的元素复制到一维数组judge[20]中,再在JudgeBoard函数内判断元素是否全部相同

平局则需要遍历board二维数组满元素,遍历用到Isfull函数

以上都不满足则为继续

代码如下:

//玩家胜     X
//电脑胜     O
//平局       Q
//继续       C
char Iswin(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;int flag = 0;char compare = 0;for (i = 0; i < row; i++){//行胜flag = 1;compare = board[i][0];for (j = 0; j < col; j++){if (board[i][j] != compare || board[i][j]== ' ' || compare== ' '){flag = 0;break;}}if (flag == 1)return compare;//列胜flag = 1;compare = board[0][i];for (j = 0; j < col; j++){if (board[j][i] != compare || board[j][i] == ' ' || compare == ' '){flag = 0;break;}}if (flag == 1)return compare;     }char judge[20] = { 0 };int cnt = 0;for (i = 0; i < row; i++){//主对角线胜for (j = 0; j < col; j++){if (i == j && board[i][j] != ' '){judge[cnt++] = board[i][j];}}}if (cnt == col){if (JudgeBoard(judge, cnt) == 1)return judge[0];}cnt = 0;for (i = 0; i < row; i++){//副对角线胜for (j = 0; j < col; j++){if (i + j == col - 1 && board[i][j] != ' '){judge[cnt++] = board[i][j];}}}if (cnt == col){if (JudgeBoard(judge, cnt) == 1)return judge[0];}//平局if (Isfull(board, row, col)==1){return 'Q';}return 'C';
}

7>、判断胜负函数中判断相等或遍历的函数

//判断元素是否相等
int JudgeBoard(char judge[20], int cnt)
{int i = 0;char compare = judge[0];for (i = 0; i < cnt; i++){if (judge[i] != compare)return 0;}return 1;
}//判断平局
int Isfull(char board[ROW][COL], int row, int col)      //return 0  继续(假)
{                                                       //return 1  平局(真)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;
}

三、结果演示

1、玩家胜

2、电脑胜

3、平局

四、代码汇总

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>#define ROW 3        //使用define宏,是为了更好的维护代码,更改时方便
#define COL 3void menu();
void game();
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);          //判断状态
int Isfull(char board[ROW][COL], int row, int col);    //判断平局
int JudgeBoard(char judge[20], int cnt);      //判断对角线是否相等//实现游戏
void game()
{char ret = 0;char board[ROW][COL] = { 0 };InitBoard(board, ROW, COL);         //初始化DisplayBoard(board, ROW, COL);while (1)     //每一局输入多次坐标{PlayerMove(board, ROW, COL);        //玩家下棋ret = Iswin(board, ROW, COL);if (ret != 'C')break;DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);     //电脑下棋ret = Iswin(board, ROW, COL);if (ret != 'C')break;DisplayBoard(board, ROW, COL);}if (ret == 'X')printf("玩家胜!\n");if (ret == 'O')printf("电脑胜\n");if (ret == 'Q')printf("平局\n");DisplayBoard(board, ROW, COL);system("pause");system("cls");
}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏:>\n");break;default:printf("选择错误,请重新选择:>\n");break;}} while (input);return 0;
}//打印菜单
void menu()
{printf("**********************\n");printf("******* 1.play *******\n");printf("******* 0.exit *******\n");printf("**********************\n");
}//棋盘初始化(数组初始化)
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] = ' ';}}
}//打印棋盘
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");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;printf("玩家下棋:>\n");while (1){printf("请输入坐标:(row col)\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'X';break;}elseprintf("坐标被占用,请选择其他位置\n");}elseprintf("坐标非法,请重新输入\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][y] == ' '){board[x][y] = 'O';break;}}}//玩家胜     X
//电脑胜     O
//平局       Q
//继续       C
char Iswin(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;int flag = 0;char compare = 0;for (i = 0; i < row; i++){//行胜flag = 1;compare = board[i][0];for (j = 0; j < col; j++){if (board[i][j] != compare || board[i][j]== ' ' || compare== ' '){flag = 0;break;}}if (flag == 1)return compare;//列胜flag = 1;compare = board[0][i];for (j = 0; j < col; j++){if (board[j][i] != compare || board[j][i] == ' ' || compare == ' '){flag = 0;break;}}if (flag == 1)return compare;     }char judge[20] = { 0 };int cnt = 0;for (i = 0; i < row; i++){//主对角线胜for (j = 0; j < col; j++){if (i == j && board[i][j] != ' '){judge[cnt++] = board[i][j];}}}if (cnt == col){if (JudgeBoard(judge, cnt) == 1)return judge[0];}cnt = 0;for (i = 0; i < row; i++){//副对角线胜for (j = 0; j < col; j++){if (i + j == col - 1 && board[i][j] != ' '){judge[cnt++] = board[i][j];}}}if (cnt == col){if (JudgeBoard(judge, cnt) == 1)return judge[0];}//平局if (Isfull(board, row, col)==1){return 'Q';}return 'C';
}//判断元素是否相等
int JudgeBoard(char judge[20], int cnt)
{int i = 0;char compare = judge[0];for (i = 0; i < cnt; i++){if (judge[i] != compare)return 0;}return 1;
}//判断平局
int Isfull(char board[ROW][COL], int row, int col)      //return 0  继续(假)
{                                                       //return 1  平局(真)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;
}

总结

为了实现三子棋改为N子棋的实现,花了一些时间,还是很兴奋可以写出来,美中不足的点是ComputerBoard函数没有智能化,只是随机选空位填'O',以后有能力了再回来改。

希望各位大佬多多指正,同时点个小赞,谢谢啦。

【C语言】-三子棋游戏(+五子棋详细版)相关推荐

  1. C语言三子棋,五子棋,n子棋的代码实现

    C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...

  2. C语言-三子棋游戏的实现

    C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...

  3. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

  4. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  5. C语言三子棋游戏的编程实现

    程序界面实现如图所示的人与电脑互动的三子棋游戏 文件模块 test.c 测试三子棋游戏 game.h 游戏的函数声明(头文件) game.c 游戏函数的实现 代码模块 初始化棋盘 (每个位置初始为空格 ...

  6. C语言三子棋游戏实现(基础版)

    欢迎来到 Claffic 的博客

  7. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

    本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...

  8. C语言实现三子棋、五子棋、扫雷游戏合集详解

    目录检索 游戏大厅实现功能(代码部分高亮显示) 三子棋模块 1.游戏介绍 2.棋盘储存及初始化 3.展示棋盘 4.玩家落子 5.电脑落子 6.检查判断(核心) 7.总体代码 五子棋模块 1.游戏介绍 ...

  9. c语言 三子棋详细解析 (零基础也能看懂)附源码 c语言小游戏

    代码运行结果如下 代码实现 test.c(测试游戏的逻辑) game.h(关于游戏相关的函数声明符号声明)头文件包含的 game.c游戏相关函数的实现 test.c 游戏如何玩 希望游戏玩完一把还可以 ...

  10. C语言实现三子棋游戏(棋盘可自行扩展)

    目录 三子棋简单介绍 实现方式 游戏外部测试(test.c文件) 游戏内容具体实现(game.c和game.h) 三子棋简单介绍 大家都玩过五子棋吧,三子棋和这个类似,就是三子连成一线就获得胜利. 大 ...

最新文章

  1. Nicholas C. Zakas如何面试前端工程师
  2. java观察者模式在spring中的应用_Spring源码之spring中的观察者模式和监听器的使用...
  3. kafka启动后会挂掉的原因
  4. mysql数据库五大对象_数据库的三大范式以及五大约束
  5. 如何在outlook里显示自然周的周数
  6. android md 控件,Android基本UI控件.md
  7. Serverless 实战 —— 利用OneIndex-Serverless无成本搭建属于你自己的网盘
  8. 关于c语言循环的格式,关于for循环的格式
  9. ssis 映射列 使用变量_SSIS中的动态列映射:SqlBulkCopy类与数据流
  10. linux下mysql5.7以上my.cnf配置文件配置
  11. Linux进程的管理与调度(七) -- Linux下2号进程的kthreadd
  12. 【Matlab代码】基于小波分析的音频信号的特征识别
  13. 斯坦福AI百年报告2017:人工智能与机器学习全景式概览
  14. 无源贴片晶振四角引脚_有源晶振四个脚是如何定义的
  15. linux硬盘速度测试方法
  16. 游戏开发中常用的算法1(20道题一篇文章)
  17. 漫谈 MQ:要消息队列(MQ)有什么用?
  18. 手机性能测试指标及操作
  19. 2.Visual Studio下载和安装
  20. CSS 开源资源大全收集

热门文章

  1. 阜阳市历史悠久,人文蔚盛
  2. ci定位 lac_(LAC) 小区识别(CI).PPT
  3. /etc/hosts文件作用
  4. 【应用随机过程】05. 泊松过程
  5. 革命就是革命,不用遮遮掩掩
  6. MySQL数据库mycat读写分离
  7. 【大数据处理技术】实验12
  8. HTML中的点缀--伪类
  9. Linux下awk命令简介
  10. 【pyspark】jieba 中文分词