数据结构课程设计论文
void init(char flag[][20]){ //用二维数组形式定义一个棋盘 for(int i=0;i<20;i++){ for(int j=0;j<20;j++){ flag[i][j]='|'; cout<<\ cout< cout< 2.4.3玩家一方落子 例如让玩家A先行落子,则系统因该先判断玩家落子位置是否合法,如果不合法, 则系统提示玩家重新输入;如果玩家所走棋子位置合法,则输出标有玩家新输入的棋子的棋盘,并提示另一个玩家输入棋子位置。 for(int x =0;x<400; ){ //棋盘上总共能乘放下 x*y 个棋子 int i,j; if(x%4==0){ cout<<\请A方走:\ cin>>i; //A方输入落子的坐标 cin>>j; flag[i][j]='X'; //指定位置放上棋子x draw(flag); //在棋盘上画出A方棋子 在这里,若A方落子不合理,则应该有应错系统: while(flag[i][j]=='X'||flag[i][j]=='O') //判断输入位置是否有棋子 { cout< cout<<\此地已经有棋子!请重新走:\ cin>>i; cin>>j; } if(check(i,j)==false) { cout< cout<<\输入坐标不合法!请重新输入:\ cin>>i; cin>>j; - 15 - 数据结构课程设计论文 } 2.4.4 另一方玩家落子 另一方落子与前一方玩家落子算法基本相同,唯一的不同之处就是这个玩家在落子之前要先判断前一方玩家是否已赢了此局,以B为例,如果前一方玩家A已经赢了此局,则程序应该自动提示玩家B是否还要再来一局,选择是(Y)则玩家B首先输入棋子,若玩家B不想再继续,选择否(N)则程序自动退出: if(test(flag,'X')) //判断是否获胜(A) { char replay; cout<<\方胜利!是否再来一局?Y/N:\ cin>>replay; if (replay=='Y'||replay=='y') //Y或y表示再来一局 { main(); } else { break; //结束 } } (其余程序代码请查看源代码) 2.4.5 判断输赢编程 在此系统中如果一方玩家获得胜利,那么他所走的棋子中有五个棋子必须在一条 直线上,由于这个程序中,玩家输入的棋子是用二维数组存储的,要判断五个棋子是否在一条直线上,则计算机会从flag[0][0]到flag[20][20]进行逐个的判断,因此在设计判断输赢的算法中,应该用for循环嵌套语句,还要有if判断语句: int test(char flag[][20],char f){ //判断输赢的函数 int mark =0; for(int i=0;i<15;i++){ for(int j=0;j<15;j++){ if( //判断横着,竖着,斜着三种成立情况 (f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j]) ||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4]) - 16 - 数据结构课程设计论文 ||(f==flag[i][j]&&f==flag[i+1][j+1]&&f==flag[i+2][j+2]&&f==flag[i+3][j+3]&&f==flag[i+4][j+4])) { cout< return mark; } mark =1; 2.4.6 结束end 当用户玩完一局,不想再继续时,只需按界面要求,输出n/N(no)即可退出程序。 2.5 调试分析 在原有需求分析的基础上,调试过程中发现,棋谱的形状如果像需求分析中的样子,则会给玩家输入棋子坐标时带来麻烦,而且在算法设计中会平白增加一些程序代码,是整个程序的时间复杂度增加,这样就像是画蛇添足,费力却得不到效益。所以应该加以改进,使程序算法的空间复杂度有所减少,而且还要能更加方便用户的使用,所以在不改变棋盘的大小规格的基础上,对原预计表格形式的界面改为十字形棋盘。 2.5.1 测试数据: 开始时的运行界面: 2.5.2 测试数据: 用户A方输入的棋子坐标超出已给出的二维数组时,系统自动为用户提示错误, - 17 - 数据结构课程设计论文 并在此基础上,提示用户重新输入,以(100,100)为例: 2.5.3 测试数据: 用户输入正确的输入地址时,运行界面显示有用户棋子的棋盘,并提示用户B进行输入,以用户A方输入(1,1)为例: 2.5.4 测试数据: 如果用户B输入棋子地址不合法,则系统自动应对错误,并提醒用户重新输入,以用户B输入(1,1)为例: 如果用户再次输入地址,此地址在棋盘要求之内,并且此地址没有其他棋子时,棋 - 18 - 数据结构课程设计论文 盘再次在界面上输出,以用户B输入(1,2)为例: 2.5.5 测试数据: 当用户A方胜利时,体统给予提示: 2.6 五子棋系统总结: 通过五子棋系统的编程,使我对二维数组有了更新的了解,二维数组的形式通 常为: 类型说明符 数组名[常量表达式][常量表达式],二维数组有两种存储方式:按列存储和按行存储。对于这个五子棋系统来说,按行存储和按列存储没有实质上的影响。五子棋系统应该是所有程序里最简单的一个程序,知识含量要求不算是太高,只要求对二维数组的存储进行熟练的掌握。 这个程序还有一点是我尚未编辑成功的地方:如何让这个五子棋棋盘对鼠标的移动做出反应,直接在鼠标点击位置落子?如果棋盘可以增加这个功能,就能更方便用户的使用。但是,这个功能的程序代码我是心有余而力不足,目前尚未可以完善这个程序。 程序的顺利运行使我认识到我自己目前的脑袋就像一个电脑的内存一样,所有 - 19 - 数据结构课程设计论文 的知识不是我不会,只是我不去实践。刚看见这个程序的时候,我头脑里的知识是混乱的,学过那么多的知识,我不知道去应用哪个地方。看书,上网查询之后我才明白,原来一个二维数组就可以面对这个问题迎刃而解了。所以,在以后的学习中没有不会的问题,只有不想去弄会的问题。 - 20 -