1模拟人机对弈---“一担挑游戏”【要求】简单设计计算机模拟棋盘对弈。其中棋盘左上角坐标为(1,1),右下角坐标为(3,3)。游戏规则如下:(1)计算机移动时,使用相应函数扫描棋盘矩阵,寻找未占单元:发现空单元后,置为“O”,未发现时,报告平局后退出。(2)轮到对弈者时,使用相应函数要求对弈者回答想把“X”放在哪里。(3)谁先三点一线了,则报告谁胜出。(4)计算机与对弈者每下一步棋都会使用相应位置变为“O”和“X”,便于在屏上显示矩阵。【提示】棋盘位置用二维数组表示,初始状态每一位置均应为“”(空)。其分隔线(即棋盘线)可用——或||来分隔。【分析】该程序模拟人机对弈,具有极大的趣味性。全程序主要模块包括“人移动棋子模块”,“计算机移动棋子模块”以及“判断胜负模块”。“移动棋子模块”模块的难点在于判断人或计算机在棋盘上选择的位置是否合法(包括选择的位置在不在棋盘上及所选择的位置是否为空),“判断胜负模块”的难点在于判断八个“三点一线”内容是否一致,及判断平局。1.总体流程图2.initialization(void)初始化棋盘模块一担挑游戏初始化棋盘显示棋盘人移动棋子计算机移动棋子判断胜负2初始化棋盘模块流程图该模块首先设置一个3X3的循环,将棋盘的每一个单元定义为空。在程序运行的第一步,主程序调用该模块功能,对棋盘进行初始化。3.display(void)显示棋盘模块显示棋盘模块流程图该模块与“初始化棋盘模块”类似,首先设置一个3X3的循环。不同之处在于显示同一行的一个单元后,棋盘每格之间显示“|”;换行之后显示“-|-|-”。在程序运行“判断胜负模块”功能之后,调用该模块功能。4.play_move()人移动棋子模块棋盘每格之间显示“|”开始已显示至第三行吗?换行,显示“-|-|-”换行将棋盘的每一格定义为空开始由位置(1,1)起,至位置(3,3)3人移动棋子模块流程图该模块首先选择放置棋子的位置(i,j),之后行变量i减一,列变量j减一。如果该位置为空,则将该单元内容定义为“X”;如果该位置不为空,则返回错误信息并重新运行该模块函数,让人重新选择放置棋子的位置。5.computermove()计算机移动棋子功能流程图计算机移动棋子模块流程图该模块首先设置3X3的循环,从(1,1)开始,依次判断每一个单元是否为空。为空时,则将该位置定义为“O”;若不为空,则继续运行。当移动至(3,3),即行变量i与列由位置(1,1)起判断开始该位置为空吗?该局比赛结果为平局行变量i与列变量j分别加一该位置定义为O退出i与j乘积为9吗?开始选择放置棋子的位置(i,j)行变量i减一,列变量j减一该位置为空吗?错误,重新选择该位置定义为X4变量j乘积为9时,若该单元依然不为空,则判定该局比赛结果为平局。6.charjudge(void)判断胜负模块判断胜负模块流程图该模块首先设置3X3的循环,依次判断每行,每列以及左斜列,右斜列的内容是否相同。不相同时,返回至主函数;若相同,则将变量result定义为相同的内容。最后,根据result显示“playerwin!”或者“computerwin!”【一担挑程序】开始某列棋子相同吗?某行棋子相同吗?返回左斜列棋子返回右斜列棋子返回该列棋子返回该行棋子右斜列棋子相同吗?左斜列棋子相同吗?返回5#includestdio.h#includestdlib.hvoidinitialization();/*初始化棋盘*/voidplayer_move();/*人移动棋子*/voidcomputer_move();/*计算机移动棋子*/voiddisplay();/*显示棋盘*/charjudge();/*判断胜负*/intmain(void){charresult;/*变量result定义为判断胜负的结果*/result='';/*变量result初值为空*/initialization();/*初始化棋盘*/printf(Youwillplayagainstcomputer.\n);printf(GoodluckandGodblessesyou.\n);do{display();/*显示棋盘*/player_move();/*人移动棋子*/result=judge();/*调用判断胜负函数,并将结果赋予变量result*/if(result!='')/*当变量result不为空时*/break;/*跳出*/computer_move();/*计算机移动棋子*/result=judge();/*调用判断胜负函数,并将结果赋予变量result*/}while(result=='');/*当变量result为空时,继续循环*/if(result=='X')/*当变量result为X时*/printf(playerwin!\n);/*人获胜*/else/*否则*/printf(computerwin!\n);/*计算机获胜*/display();/*显示棋盘*/getchar();return0;}charchessboard[3][3];/*将棋盘定义为3x3模式*/voidinitialization(void)/*初始化棋盘*/{inti,j;/*变量i定义为行,变量j定义为列*/for(i=0;i3;i++)/*设定3x3的嵌套循环*/for(j=0;j3;j++)6chessboard[i][j]='';/*将棋盘的每一格定义为空*/}voidplayer_move(void)/*人移动棋子*/{inti,j;/*变量i定义为行,变量j定义为列*/printf(Pleaseselecttheunit:);/*选择放置棋子的位置*/scanf(%d%*c%d,&i,&j);/*输入放置棋子的位置*/i--;j--;/*行变量i减一,列变量j减一*/if(chessboard[i][j]!='')/*当该位置不为空时*/{printf(Error,reselect.\n);/*错误,重新选择*/player_move();/*人移动棋子*/}elsechessboard[i][j]='X';/*否则,该位置定义为X*/}voidcomputer_move(void)/*计算机移动棋子*/{inti,j;/*变量i定义为行,变量j定义为列*/for(i=0;i3;i++)/*设定3x3的嵌套循环*/{for(j=0;j3;j++)if(chessboard[i][j]=='')/*当该位置为空时*/break;/*跳出*/if(chessboard[i][j]=='')/*当该位置不为空时*/break;/*跳出*/}if(i*j==9)/*当变量i与变量j乘积为9时*/{printf(Thisgameisdraw.\n);/*平局*/exit(0);/*退出*/}elsechessboard[i][j]='O';/*否则,该位置定义为O*/}voiddisplay(void)/*显示棋盘*/{7intt;/*变量t*/for(t=0;t3;t++)/*设定循环*/{printf(%c|%c|%c,chessboard[t][0],chessboard[t][1],chessboard[t][2]);/*棋盘各单元之间显示|*/if(t!=2)printf(\n-|-|-\n);}printf(\n);}charjudge(void)/*判断胜负*/{inti;/*变量i*/for(i=0;i3;i++)/*设定循环*/if(chessboard[i][0]==chessboard[i][1]&&chessboard[i][0]==chessboard[i][2])/*当某行所有单元相同时*/returnchessboard[i][0];/*返回该行内容*/for(i=0;i3;i++)/*设定循环*/if(chessboard[0][i]==chessboard[1][i]&&chessboard[0][i]==chessboard[2][i])/*当某列所有单元相同时*/returnchessboard[0][i];/*返回该列内容*/for(i=0;i3;i++)/*设定循环*/if(chessboard[0][0]==chessboard[1][1]&&chessboard[0][0]==chessboard[2][2])/*当右斜列所有单元相同时*/returnchessboard[0][0];/*返回右斜列内容*/for(i=0;i3;i++)/*设定循环*/if(chessboard[0][2]==chessboard[1][1]&&chessboard[1][1]==chessboard[2][0])/*当左斜列所有单元相同时*/returnchessboard[0][2];/*返回左斜列内容*/return'';}【程序运行截屏】8【第二章“十佳运动员有奖评选系统”模块图】91.主函数流程2.统计模块流程显示一系列功能选项输入,判断是否是1-3根据的值调用十佳运动员有奖评选系统统计核对退出读入文件信息计算十佳运动员计算十个获奖者浏览选票查找选票返回主菜单103.加载模块流程4.计算十佳参选者模块流程5.计算十佳运动员模块流程从文件读入候选运动员记录显示候选运动员记录从文件读入选票记录定义指针及循环计数器文件打开成功否输出错误信息读到文件末尾了吗?调用读入一个学生信息,并存入结构体中关闭文件,返回值计算选票命中率依据命中率对选票记录排序显示10个获奖参选者信息输出10个获奖者信息到文件116.计算选票的命中率流程【第三章“学生成绩管理系统”模块图】开始选票核对完了吗?10个候选号码?20个候选人?函数结束处理下一张选票候选人得票数加一候选号=候选人?开始选票核对完了吗?10个候选号码?10个候选人?依据题意计算命中率函数结束处理下一张选票121.主函数流程2.追加模块流程3.插入模块流程调用加载函数n=load();并计算可以记录个数n输入用户要追加的人的记录个数mK=m+n从到调用输入函数input(i)保存追加的记录输入用户要输入的个数NI从0到N-1调用输入函数input(i)i!=0保存调用函数save(n)数据输入数据显示数据查找数据插入成绩排序学生成绩管理系统134.修改模块流程5.删除模块流程显示所有记录,让用户看哪个要修改输入要修改的名字是否有记录显示找到的记录,调用修改函数提示没有找到询问用户是否继续修改返回主菜单调用输入法单个记录的函数显示刚才输入的记录选择功能返回主菜单146.显示模块流程7.查找模块流程显示学生记录(10个一屏)按任意键显示下一屏按任意键返回主菜单显示所有记录,让用户看哪个要删除输入要删除的名字是否有记录显示找到的记录,调用删除函数提示没有找到询问用户是否继续删除返回主菜单158.排序模块流程用选择法排序保存返回住菜单输入学生名字是否有对应的记录显示找到的记录提示没有找到让用户选择功能返回主菜单询问该用户是否继续查找