c语言五子棋人机对弈算法_从零开始编写C语言五子棋程序1
从零开始编写C语言五子棋程序
C语言程序是国科大计算机系本科生必修课程,我选修的是武成岗老师的C语言课程。除了课上回答问题,实验课competitive programming的成绩之外,最终的大作业五子棋程序也占据了相当重的分值。除了写出基本的显示棋盘、人人对战、人机对战的功能之外,武老师对人机对战的策略提出了更高的要求。期末时每个人所写的AI会进行1对1的比赛,五子棋作业的分数与比赛排名直接挂钩(卷,就嗯卷)。开这个坑的原因有两点,一是记录自己写这个程序的过程(可能是我目前写过的代码最长的程序),理清思路同大家分享,另一方面想熟悉一下刚学的Markdown排版。(试图摆脱折磨人的公众号内部编辑)今天要解决的是第一部分,五子棋棋盘的实现。
五子棋棋盘的实现
解决这个问题可以有两种思路:
利用双重循环首先构建出一个空棋盘,接着用户根据棋盘上显示的坐标实现下棋的操作,只需要把输入坐标所对应的字符替换成黑/白棋子即可。
构建三个棋盘:第一个棋盘用于存放空棋盘的模板,第二个棋盘是用于在终端显示的棋盘(交互棋盘),第三个棋盘是所谓“内部棋盘”,用户输入的坐标改变的是内部棋盘上的数值,这一数值的改变反映到交互棋盘上就是黑/白棋子。
两种思路其实都可以实现棋盘的功能,在这里,我为了减轻后期调试工作的工作量,选择采取第二种方式来构建棋盘。
构建棋盘的过程中,最关键的就是二维数组的运用。二维数组和内部棋盘上的点建立起了一一映射的关系,通过改变二维数组中元素的值,即可改变棋盘上的落子情况。二维数组的相关知识,详见多维数组。
有了这个基本思想,下面我们就可以开始书写代码了。
宏定义与全局变量的声明
#include #include #include #define SIZE 15#define CHARSIZE 2void initRecordBorard(void);void innerLayoutToDisplayArray(void);void displayBoard(void);//棋盘使用的是GBK编码,每一个中文字符占用2个字节。//空棋盘模板 char arrayForEmptyBoard[SIZE][SIZE*CHARSIZE+1] = { "┏┯┯┯┯┯┯┯┯┯┯┯┯┯┓", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨", "┗┷┷┷┷┷┷┷┷┷┷┷┷┷┛"};//此数组存储用于显示的棋盘 char arrayForDisplayBoard[SIZE][SIZE*CHARSIZE+1];//此数组用于记录当前的棋盘的格局,即所谓“内部棋盘”int arrayForInnerBoardLayout[SIZE][SIZE];char play1Pic[]="●";//黑棋子;char play2Pic[]="◎";//白棋子;
主函数编写
int main(){ initRecordBorard(); //初始化一个空棋盘 arrayForInnerBoardLayout[0][0]=1; //在棋盘的左上角落一个黑色棋子 innerLayoutToDisplayArray(); //将心中的棋盘转成用于显示的棋盘 displayBoard(); //显示棋盘 getchar(); arrayForInnerBoardLayout[5][9]=2; innerLayoutToDisplayArray(); displayBoard(); getchar(); arrayForInnerBoardLayout[3][4]=2; innerLayoutToDisplayArray(); displayBoard(); getchar(); arrayForInnerBoardLayout[6][1]=1; innerLayoutToDisplayArray(); displayBoard(); getchar(); arrayForInnerBoardLayout[9][4]=2; innerLayoutToDisplayArray(); displayBoard(); getchar(); return 0;}//内部棋盘里的数组元素若为0,表示该位置为空,若为1,表示该位置落的是黑子,若为0,表示该位置落的是白子。//这是一个测试性的主函数(由于只是单纯想构建出棋盘来),整体操作分三步:落子——内部棋盘和交互棋盘的映射——显示出当前的交互棋盘棋盘的初始化
棋盘的初始化
//初始化一个空棋盘格局 void initRecordBorard(void){ //通过双重循环,将arrayForInnerBoardLayout清0 int i,j; for(i = 0;i<= SIZE-1 ;i++){ for(j = 0;j<= SIZE-1;j++) arrayForInnerBoardLayout[i][j] = 0; }}
内部棋盘和交互棋盘一一映射的构建
//将arrayForInnerBoardLayout中记录的棋子位置,转化到arrayForDisplayBoard中void innerLayoutToDisplayArray(void){ //第一步:将arrayForEmptyBoard中记录的空棋盘,复制到arrayForDisplayBoard中 int i,j; for(i = 0;i <= SIZE - 1;i++){ for(j = 0;j <=SIZE*CHARSIZE+1;j++) arrayForDisplayBoard[i][j] = arrayForEmptyBoard[i][j]; } //第二步:扫描arrayForInnerBoardLayout,当遇到非0的元素,将●或者◎复制到arrayForDisplayBoard的相应位置上 //注意:arrayForDisplayBoard所记录的字符是中文字符,每个字符占2个字节。●和◎也是中文字符,每个也占2个字节。 for( i = 0;i <= SIZE-1;i++){ for( j = 0; j <= SIZE-1;j++){ if(arrayForInnerBoardLayout[i][j]!=0){ if(arrayForInnerBoardLayout[i][j]==1){ arrayForDisplayBoard[i][2*j] = play1Pic[0]; arrayForDisplayBoard[i][2*j+1] = play1Pic[1]; }else if(arrayForInnerBoardLayout[i][j]==2){ arrayForDisplayBoard[i][2*j] = play2Pic[0]; arrayForDisplayBoard[i][2*j+1] = play2Pic[1]; } } } } }//这里涉及一个我之前没有接触过的知识点,将双字节字符赋值到字符数组里,要用连续的两个元素来进行赋值。
显示当前棋盘
//显示棋盘格局 void displayBoard(void){ int i; //第一步:清屏 system("clear"); //清屏 //第二步:将arrayForDisplayBoard输出到屏幕上 for(i=0;i<=SIZE-1;i++) printf("%3d %s\n",SIZE-i,arrayForDisplayBoard[i]); //第三步:输出最下面的一行字母A B .... printf(" "); for(i = 0;i<=SIZE-1;i++) printf("%2c",'A'+i); printf("\n");}
至此,我们已经完成了棋盘构建的全部工作,下面是程序的运行结果。
接下来的目标(周五前完成):
胜负的判定
先后手
记录上一次棋子的位置
输入quit退出游戏
c语言五子棋人机对弈算法_从零开始编写C语言五子棋程序1相关推荐
- r语言中矩阵QR分解_从零开始学R语言Day4|向量、矩阵和数组
从零开始学R语言Day4|向量.矩阵和数组 1.1向量 1.1.1向量 在Day2中我们提及过用和c()函数来构建向量,具体实例如下. 我们还可以采用vector("类型",长度) ...
- c语言五子棋人机对弈算法,使用canvas基于AI算法实现人机对战之五子棋
这是我使用canvas基于AI算法实现的人机对战之五子棋 黑棋是我 下了几局,真心下不过啊!!! 不说了,源码奉上: 人机大战之五子棋 canvas{ display: block; margin:5 ...
- 五子棋人机对战_原生JS+Canvas实现五子棋游戏
原生JS+Canvas实现五子棋游戏 效果图 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15 ...
- c语言网页版在线编译器_手机编写C语言神器,集成gcc插件,还能制作APP!
c语言,一直以来都是大学计算机专业必修课. 贴近底层,运行效率极高,一旦入门之后,学习其他编程语言几乎就没什么障碍可言. 一法通,万法通! 在手机端学习~编译c语言,最常用也最出名的当属C4droid ...
- 五子棋人机对弈 c语言,五子棋人机对弈系统
********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...
- 五子棋对弈程序c语言,求大神说一下五子棋人机对弈的算法,最好有代码 良辰多谢了...
得分:20 当我们与电脑对战时,您知道这些软件是怎样象人脑一样进行思考的吗?前不久我曾编写过一个五子棋的游戏,在这里就以此为例和大家一起探讨探讨. 总的来说(我们假定您熟悉五子棋的基本规则),要让电脑 ...
- 简易人机对弈算法的五子棋程序
要求的五子棋游戏应达到以下几方面的要求: (1)运行程序后即刻出现棋盘并可以开始下棋: (2)人机对弈时,先手为黑棋,后手为白棋:人为先手,计算机为后手: (3)程序能响应鼠标点击并在相应位置画出棋子 ...
- 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈
五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...
- JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...
输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) ??做这道题实在没有思路参考了这位作者的代码: h ...
最新文章
- php 5.3 construct_PHP 5.3新增魔术方法__invoke概述
- SSE,MSE,RMSE,R-square指标讲解
- JQuery获取下拉列表框选中项
- android+动画队列,Android属性动画详解
- Apache-Shiro-权限缓存
- Angular自学笔记(?)ViewChild和ViewChildren
- 最优化作业第6章——无约束多维非线性规划方法
- [CEOI2016] kangaroo(排列dp)
- java客户端作为kafka生产者测试
- mysql报错乱码_连接mysql服务器报错时,出现乱码
- 红旗linux mysql_恢复 - 红旗Linux案例精选:Amanda集中备份实例详细讲解_数据库技术_Linux公社-Linux系统门户网站...
- 乒乓球比赛赛程_10月5日至10月11日中央电视台直播录播乒乓球比赛安排
- linux之shell脚本管理(一)
- jumpserver 0.4.0 安装使用
- OpenStack还是OpenStack,云已不是那朵云!
- Lyapunov稳定性分析3(离散时间系统)
- 广州规划新增30条地铁 来看看线路图?
- 如何准确获取地点位置的经纬度?
- 前端程序员简历制作建议
- Excel不能自动求和的可能原因
热门文章
- 解决Flink案例DataStream中使用keyBy(0),keyBy弃用的问题
- joblib 读取模型后对单条数据做预测并解决Reshape your data either using array报错
- pandas 保存数据到excel,csv
- Django账号绑定邮箱时发送链接
- android使用自定义,Android 自定义View的使用
- HTTP1.1/2.0与QUIC协议
- [Swift]LeetCode478. 在圆内随机生成点 | Generate Random Point in a Circle
- 查询表达式和LINQ to Objects
- 批处理打开和关闭oracle11g 服务
- maven nexus myeclipse 学习