一、初生棋盘

一生二,二生三,三生万物.....想成为好的执棋人就得从最小的棋盘操手——“三子棋”
下手思路且听笔者娓娓道来:

  1. 如何进入棋盘?
  2. 执棋顺序为何?
  3. 棋盘模型如何?
  4. 如何呈现对决?
  5. 如何裁定胜负?

二、基础页面

在这种庞杂(起码对我而言)的项目上我们通常使用多文件形式进行代码编写,一般写为三个:

game.h——代码所包含的头文件和各功能模块的函数声明

game.c——实现游戏各功能模块的函数

sanziqi.c——测试游戏的实现

1.任何游戏都需要登录界面不是吗?(也有可能是我玩的少),我们开始使用(menu())作为菜单函数,它大致需要满足三个基本功能:

1.进入游戏           2.退出游戏       3.输入不符规则的提醒.

其代码模块如下:
例如:

void menu()
{printf("****   1.游戏开始   ****\n");printf("****   0.退出游戏   ****\n");
}
int main()
{int input = 0;do{menu();srand((unsigned)time(NULL));printf("请输入:");scanf("%d", &input);switch (input){case 1:printf("游戏开始\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,重新输出\n");break;}} while (input);return 0;
}

运行截图如下


三、游戏核心

1.在初始情况下,我们应该对棋盘初始化,实现清空操作。我们来使用“Initchess”函数来进行棋盘初始化。

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

2.棋盘的展现,我们使用”displaychess“函数来实现,代码如下:

void displaychess(char chess[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 ", chess[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");}
}

运行结果:

ps:笔者使用了全局变量ROW和COL来进行编写,即只需要改变此二值即可操作棋盘格局。

#define ROW 3
#define COL 3

3.棋手对决

这一模块也就是需要去实现两个功能:

1.棋盘能够表现出玩家输入的位置(人类认知由一行与一列开始,而机器是零行零列起始,所以我们需要思考怎样让输入既是人类所想,也可为机器所懂。)

2.在已有子时我们不可下。

void self(char chess[ROW][COL], int row, int col)
{int x, y;printf("玩家请走棋:>");while(1){scanf("%d %d", &x, &y);if (x > 0 && x <= row&&y > 0 && y <= col){if (chess[x - 1][y - 1] == ' '){chess[x - 1][y - 1] = '#';break;}elseprintf("该位置已经被占用");}else{printf("输入位置不合规则\n");}}
}

运行效果;

4.电脑”打假赛“

在这一功能里,电脑自动下棋,因此我们要使用rand来生成随机数。

srand((unsigned)time(NULL));初始化rand生成数

x=rand()%row;y=rand()%col——坐标随机数

注意在此同时需要引用两个头文件:

1.<time.h>

2.<stdlib.h>

在这一模块里也需要判断是否棋盘已有落子

void computer(char chess[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int x = rand() % row;int y = rand() % col;if (chess[x][y] == ' '){chess[x][y] = '*';break;}}
}

运行结果

5.裁决胜负

在这一模块里我们设计的函数需要对电脑和玩家每一步棋下完后结果进行判断

返回'#',玩家胜利

返回'*',电脑胜利

返回'q',双方平局

返回'c',继续比赛

因此这一模块在主函数的的位置如下:

while (1){computer(chess, ROW, COL);//电脑执旗displaychess(chess, ROW, COL);//打印棋盘ret = IsWin(chess, ROW, COL);//判断输赢if (ret != 'c')break;self(chess, ROW, COL);//玩家执棋displaychess(chess, ROW, COL);//打印棋盘ret = IsWin(chess, ROW, COL);if (ret != 'c')break;}switch (ret){case '*':printf("电脑胜利\n");break;case '#':printf("玩家胜利\n");break;case 'q':printf("平局\n");}break;

我们借”Iswin“这一函数实现以上所述功能

1.判断行是否成型

2.判断列是否成型

3.判断主副对角线是否成型

4.判断棋盘是否已经”棋满为患“

char Iswin(char chess[ROW][COL], int row, int col)
{//行成型int i = 0, j = 0;for (i = 0; i < row; i++){if (chess[i][0] == chess[i][1] && chess[i][1] == chess[i][2] && chess[i][0] != ' ')return chess[i][0];}//列成型for (i = 0; i< col; i++){if (chess[0][i] == chess[1][i] && chess[1][i] == chess[2][i] && chess[0][i] != ' ')return chess[0][i];}int k = 0, l = 0;for (i = 0, j = 0; i < row&&j < col; i++, j++){if (chess[i][j] == '#')k++;if (k==3)return '#';}for (i = 2, j = 2; i >0 && j >0; i--, j--){if (chess[i][j] == '*')l++;if (l == 3)return '*';}if (Isfull(chess, row, col))return 'q';elsereturn 'c';}
int Isfull(char chess[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (chess[i][j] == ' ')return 0;}}return 1;
}

我们在里面嵌套使用了”Isfull"函数对棋盘是否满格进行判断。

5.最后的最后

游戏整体逻辑或者说正式运行检测部分(sanziqi.c)如下;

#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"
void game(){char chess[ROW][COL] = { 0 };char ret;initchess(chess, ROW, COL);//初始化棋盘int m = 0;printf("请选择是电脑先下还是玩家先下\n");printf("*****   1 电脑**************\n");printf("*****   2 玩家**************\n");scanf("%d", &m);switch (m){case 1:while (1){computer(chess, ROW, COL);//电脑执旗displaychess(chess, ROW, COL);//打印棋盘ret = Iswin(chess, ROW, COL);//判断输赢if (ret != 'c')break;self(chess, ROW, COL);//玩家执棋displaychess(chess, ROW, COL);//打印棋盘ret = Iswin(chess, ROW, COL);if (ret != 'c')break;}switch (ret){case '*':printf("电脑胜利\n");break;case '#':printf("玩家胜利\n");break;case 'q':printf("平局\n");}break;case 2:while (1){self(chess, ROW, COL);displaychess(chess, ROW, COL);ret = Iswin(chess, ROW, COL);if (ret != 'c')break;computer(chess, ROW, COL);displaychess(chess, ROW, COL);ret = Iswin(chess, ROW, COL);if (ret != 'c')break;}switch (ret){case '*':printf("电脑胜利\n");break;case '#':printf("玩家胜利\n");break;case 'q':printf("平局\n");}break;default:printf("输入无效\n");break;}
}
void menu()
{printf("****   1.游戏开始   ****\n");printf("****   0.退出游戏   ****\n");
}
int main()
{int input = 0;do{menu();srand((unsigned)time(NULL));printf("请输入:");scanf("%d", &input);switch (input){case 1:printf("游戏开始\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,重新输出\n");break;}} while (input);return 0;
}

四.棋盘成,天地显

运行结果如下


五.体会

这个游戏缺点还是蛮多的,比如判断胜负时,若是棋盘更大,我们应该怎么样判断输赢呢?当然笔者已经有所理解了,只待明天再去尝试。像笔者一样的萌新们也可以多多尝试。

ps:感冒真的难受,可以说是病里努力敲码了

c路漫漫,你我做伴!!爱你们么么哒

Tips

  1. 您发布的文章将会展示至 里程碑专区 ,您也可以在 专区 内查看其他创作者的纪念日文章
  2. 优质的纪念文章将会获得神秘打赏哦

2.方寸棋盘便是我的天地相关推荐

  1. VUE学习笔记------奕长苏

    VUE学习笔记------奕长苏 一.引言 二.视图和数据的双向绑定 - - - v-model 三.组件 - - - component 四.其它 一.引言 本文为个人在学习vue时总结的学习笔记, ...

  2. 愿岁月不负天地,此生辽阔高远

    愿岁月不负天地,此生辽阔高远,出自<自由在高处>,当初在这本书中读到这句话时,感觉非常美.并让我联想到自己的工作来理解这句话: 愿岁月不负天地,我将天地理解为我们的工作,生活点滴,做事等: ...

  3. 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)

    作词 : 清玄小仙 作曲 : 房雪娇 Rap编写 Rap Arrangement:顾雄 编曲 Arranger:甘虎 戚琦(念白): 绝世舞姬 天下先 张晓涵: 烽烟燃起 乱风华 胭脂落泪 染红霞 眉 ...

  4. 绝世舞姬计算机弹音乐,张晓涵/戚琦《绝世舞姬》[FLAC/MP3-320K]

    歌词 戚琦(念白): 绝世舞姬 天下先 张晓涵: 烽烟燃起 乱风华 胭脂落泪 染红霞 眉目如画 宜其室家 说陪我浪迹天涯 都作假 心死就在 那一刹 世间安得 双全法 眸中无他 便无冬夏 君临天下 也只 ...

  5. 画论12 张彦远《历代名画记》

    [中国历代画论目录] 目录 卷一 叙画之源流 叙画之兴废 叙历代能画人名(自轩辕至唐会昌,凡三百七十一人) 论画六法 论画山水树石 卷二 叙师资传授南北时代 论顾陆张吴用笔 论画工用榻写 论名价品第 ...

  6. 开启手机新时代,智领5G未来:中国电信首款5G定制高端机震撼登场

    2019年11月19日,中国电信首款专属定制5G手机心系天下三星W20 5G在武汉汉秀剧场正式发布.心系天下三星W20 5G在传承精湛工艺与奢华设计的同时,更是搭载了引领未来的5G网络和折叠屏设计,将 ...

  7. [转载]上善若水,厚德载物

    原文出处:VC(风险投资)快报 网址:http://blog.ci123.com/fengfeng/entry/35090 上善若水"是<老子>中的话,原文是:"上善若 ...

  8. 爱情的诗·6~10节

    6.   夜雨寒江 夜雨中,我与你并辔而行,身子是冷的,可心里是暖的 而后弃马登船,摇曳的烛火洗去旧日的风尘 你看着我,我看着你,鬓发湿冷,脸孔烈烫,双手交缠,唯余彼此 相爱相恋时的山盟海誓是最浓烈的 ...

  9. Python3爬虫学习笔记——xpath练习之爬取起点网玄幻小说排行

    这次看完xpath章之后巩固练习 import re import requests from lxml import etree def get_one_page(url):headers = {' ...

最新文章

  1. C++在堆区创建数组
  2. 使用bc45编译ucos-II的配置过程
  3. javascript原型的改动与重写(覆盖)区别
  4. C#正则表达式编程(三):Match类和Group类用法
  5. 【LeetCode从零单排】No58.Length of Last Word
  6. JDK6u25里添加的按线程统计分配内存量: JMX
  7. 向左向右向后转python_Turbot与python教程-实现左向旋转
  8. 2个oracle文件导入报错处理
  9. Julia: feather格式和hdf5格式比较
  10. Android开源项目第一篇——个性化控件(View)篇
  11. 计算机技术在风景园林中的应用和选择,现代信息技术在风景园林中的应用
  12. 三维空间中直线间距离的计算
  13. 正负数据如何归一化_数据标准化period;归一化处理
  14. 怀旧服ouf头像插件_wow怀旧服头像美化插件下载
  15. IOS开发之工欲善其事必先利其器:Xcode
  16. Excel — 动态图表(复选框实现动态图)
  17. Python requests模块高级用法
  18. Python关于人脸图片转换128/512维度向量的两种做法
  19. 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络
  20. 94、DehazNeRF: Multiple Image Haze Removal and 3D Shape Reconstruction using Neural Radiance Fields

热门文章

  1. FPB 2.0:免费的计算机编程类中文书籍 2.0
  2. 变压器的二次侧电压分析
  3. IT与计算机科学的区别,it行业和人工智能的区别
  4. cglib、orika、spring等bean copy工具性能测试和原理分析
  5. Scrapy爬取京东商城华为全系列手机评论
  6. 许多人在恋爱时,根本不晓得自己结婚的标准
  7. VC 给控制台exe 增加版本信息,图标
  8. 看完八条你肯定趴下,如不趴下算你狠!!!
  9. OpenCV3.0中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理、特点是什么,并附示例代码
  10. Jenkins 安装教程