从零开始编写C语言五子棋程序

C语言程序是国科大计算机系本科生必修课程,我选修的是武成岗老师的C语言课程。除了课上回答问题,实验课competitive programming的成绩之外,最终的大作业五子棋程序也占据了相当重的分值。除了写出基本的显示棋盘、人人对战、人机对战的功能之外,武老师对人机对战的策略提出了更高的要求。期末时每个人所写的AI会进行1对1的比赛,五子棋作业的分数与比赛排名直接挂钩(卷,就嗯卷)。开这个坑的原因有两点,一是记录自己写这个程序的过程(可能是我目前写过的代码最长的程序),理清思路同大家分享,另一方面想熟悉一下刚学的Markdown排版。(试图摆脱折磨人的公众号内部编辑)今天要解决的是第一部分,五子棋棋盘的实现。

五子棋棋盘的实现

解决这个问题可以有两种思路:

  • 利用双重循环首先构建出一个空棋盘,接着用户根据棋盘上显示的坐标实现下棋的操作,只需要把输入坐标所对应的字符替换成黑/白棋子即可。

  • 构建三个棋盘:第一个棋盘用于存放空棋盘的模板,第二个棋盘是用于在终端显示的棋盘(交互棋盘),第三个棋盘是所谓“内部棋盘”,用户输入的坐标改变的是内部棋盘上的数值,这一数值的改变反映到交互棋盘上就是黑/白棋子。

两种思路其实都可以实现棋盘的功能,在这里,我为了减轻后期调试工作的工作量,选择采取第二种方式来构建棋盘。

构建棋盘的过程中,最关键的就是二维数组的运用。二维数组和内部棋盘上的点建立起了一一映射的关系,通过改变二维数组中元素的值,即可改变棋盘上的落子情况。二维数组的相关知识,详见多维数组。

有了这个基本思想,下面我们就可以开始书写代码了。

  1. 宏定义与全局变量的声明

    #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[]="◎";//白棋子;
  2. 主函数编写

    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,表示该位置落的是白子。//这是一个测试性的主函数(由于只是单纯想构建出棋盘来),整体操作分三步:落子——内部棋盘和交互棋盘的映射——显示出当前的交互棋盘棋盘的初始化
  3. 棋盘的初始化

    //初始化一个空棋盘格局 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;      }}
  4. 内部棋盘和交互棋盘一一映射的构建

    //将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];                }               }            }           }       }//这里涉及一个我之前没有接触过的知识点,将双字节字符赋值到字符数组里,要用连续的两个元素来进行赋值。
  5. 显示当前棋盘

    //显示棋盘格局 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相关推荐

  1. r语言中矩阵QR分解_从零开始学R语言Day4|向量、矩阵和数组

    从零开始学R语言Day4|向量.矩阵和数组 1.1向量 1.1.1向量 在Day2中我们提及过用和c()函数来构建向量,具体实例如下. 我们还可以采用vector("类型",长度) ...

  2. c语言五子棋人机对弈算法,使用canvas基于AI算法实现人机对战之五子棋

    这是我使用canvas基于AI算法实现的人机对战之五子棋 黑棋是我 下了几局,真心下不过啊!!! 不说了,源码奉上: 人机大战之五子棋 canvas{ display: block; margin:5 ...

  3. 五子棋人机对战_原生JS+Canvas实现五子棋游戏

    原生JS+Canvas实现五子棋游戏 效果图 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15 ...

  4. c语言网页版在线编译器_手机编写C语言神器,集成gcc插件,还能制作APP!

    c语言,一直以来都是大学计算机专业必修课. 贴近底层,运行效率极高,一旦入门之后,学习其他编程语言几乎就没什么障碍可言. 一法通,万法通! 在手机端学习~编译c语言,最常用也最出名的当属C4droid ...

  5. 五子棋人机对弈 c语言,五子棋人机对弈系统

    ********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...

  6. 五子棋对弈程序c语言,求大神说一下五子棋人机对弈的算法,最好有代码 良辰多谢了...

    得分:20 当我们与电脑对战时,您知道这些软件是怎样象人脑一样进行思考的吗?前不久我曾编写过一个五子棋的游戏,在这里就以此为例和大家一起探讨探讨. 总的来说(我们假定您熟悉五子棋的基本规则),要让电脑 ...

  7. 简易人机对弈算法的五子棋程序

    要求的五子棋游戏应达到以下几方面的要求: (1)运行程序后即刻出现棋盘并可以开始下棋: (2)人机对弈时,先手为黑棋,后手为白棋:人为先手,计算机为后手: (3)程序能响应鼠标点击并在相应位置画出棋子 ...

  8. 五子棋java程序=权值法_五子棋(人机对弈)——Java权值法五子棋博弈

    五子棋人机博弈 五子棋,人与人之间博弈,我们不用考虑太多,都是玩家自动思考. 但是如果我们要玩一个单机的五子棋,实现人机的对战,那么我就得"帮"电脑考虑下走哪步了. 实现的方法大概 ...

  9. JAVA中计算五子棋平局的算法_输入五子棋棋盘判断输赢或平局—程序设计(C语言)...

    输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) 输入五子棋棋盘判断输赢或平局-程序设计(C语言) ??做这道题实在没有思路参考了这位作者的代码: h ...

最新文章

  1. php 5.3 construct_PHP 5.3新增魔术方法__invoke概述
  2. SSE,MSE,RMSE,R-square指标讲解
  3. JQuery获取下拉列表框选中项
  4. android+动画队列,Android属性动画详解
  5. Apache-Shiro-权限缓存
  6. Angular自学笔记(?)ViewChild和ViewChildren
  7. 最优化作业第6章——无约束多维非线性规划方法
  8. [CEOI2016] kangaroo(排列dp)
  9. java客户端作为kafka生产者测试
  10. mysql报错乱码_连接mysql服务器报错时,出现乱码
  11. 红旗linux mysql_恢复 - 红旗Linux案例精选:Amanda集中备份实例详细讲解_数据库技术_Linux公社-Linux系统门户网站...
  12. 乒乓球比赛赛程_10月5日至10月11日中央电视台直播录播乒乓球比赛安排
  13. linux之shell脚本管理(一)
  14. jumpserver 0.4.0 安装使用
  15. OpenStack还是OpenStack,云已不是那朵云!
  16. Lyapunov稳定性分析3(离散时间系统)
  17. 广州规划新增30条地铁 来看看线路图?
  18. 如何准确获取地点位置的经纬度?
  19. 前端程序员简历制作建议
  20. Excel不能自动求和的可能原因

热门文章

  1. 解决Flink案例DataStream中使用keyBy(0),keyBy弃用的问题
  2. joblib 读取模型后对单条数据做预测并解决Reshape your data either using array报错
  3. pandas 保存数据到excel,csv
  4. Django账号绑定邮箱时发送链接
  5. android使用自定义,Android 自定义View的使用
  6. HTTP1.1/2.0与QUIC协议
  7. [Swift]LeetCode478. 在圆内随机生成点 | Generate Random Point in a Circle
  8. 查询表达式和LINQ to Objects
  9. 批处理打开和关闭oracle11g 服务
  10. maven nexus myeclipse 学习