2022年五子棋游戏 .pdf
人机对战五子棋游戏项目文档思维分析:1.分为显示部分和棋子的选址之处2.选子分为: 机器选址和人工先址,如果是机器选址话,这是大算法 (算法越先进, 越智能 )。3.显示:初始,下棋时4.整个程序:初始+循环下棋(算法+显示)功能分析:1.显示画面功能2.有输入时的反应3.没输入时怎么操作4.结束功能任务分析: 在一个 2020 的棋盘里,进行循环轮流交替下棋,如果五子连珠,则该方胜,退出游戏。初步设计 (系统分析 ):1.显示:初始化 +画面2.进行循环游戏人输入时:移动的方向显示移动后的结果移动后是否五子连珠,如果是,则人胜出,游戏结束机器输入时:选择移动的目标位置显示移动的路径移动后是否五子连珠,如果是,则机器胜出,游戏结束返回到循环开始位置3.结束游戏具体设计 (系统设计 ):1.显示:初始化 +画面初始化图形驱动绘制棋盘底部颜色棋盘 2020 个方格2.进行游戏设置初始的棋手,棋子的位置设置当前棋手棋子的初始位置初始棋手的显示(提示 ) 进行循环游戏:每替换选手一次,就做一次循环人输入时:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 等待人的输入 (键盘的输入 ), 提示人应按输入如有输入,则处理输入方向如果是出格或已有棋子,则报警,不输入如果条件允许,则刷新显示,记录该棋子判断是否五子连珠,如果是,则人胜利,结束游戏2.2.2 机器输入输入时:2.2.2.1 提示机器输入2.2.2.2 选择输入的地方(智能算法,需要当前棋子情况) 2.2.2.3 移动显示效果 (垂直或水平移动) 2.2.2.4 判定是否五子连珠,如果是,则机器胜利,结束游戏2.3.2 是 ESC 的话,则退出2.3.3 是其他的话,则不反映3.结束游戏显示 game over YOU WIN !SORRY!结束显示,返回详细设计 :1.显示:初始化 +画面1.1 初始化图形驱动: initgraph(); /初始化图形系统int iDriver,iMode; detectgraph(&iDriver,&iMode); initgraph(&iDriver,&iMode,); 1.2 绘制游戏界面1.2.1 20X20 的方格for(i=0;iMAXLIE;i+) /画白格子for(ii=0;iiMAXHANG;ii+) xtemp=xlong*(i+1);ytemp=ylong*(ii+1); setcolor(normalcolor); rectangle (xtemp,ytemp,xtemp+xstart,ytemp+ystart); 1.2.2 下面的文字显示outtextxy(xLong,yLong*(MAXHANG+2)+3,Its player1s turns); outtextxy(xLong,yLong*(MAXHANG+3),Player1 win, press any key to quit); 1.2.3 画棋子及边框fillellipse(xtemp+xr+1,ytemp+yr+1,xr,yr); rectangle () 2.进行游戏2.1 设置初始的棋手,棋子的位置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 2.1.1设置当前棋手playernow=player1; 2.1.2棋子的初始位置不设置初始棋子位置,可设置提示框在chess00; rectangle () 2.1.3初始棋手的显示(提示 ) 2.2 进行死循环游戏:棋子移动一次,就做一次循环/或者:每替换选手一次,就做一次循环while(1) 2.2.1由人输入时:2.2.1.1 接收方向键if(playernow=player1) c=getch(); 2.2.1.2 暂存棋子的位置case RIGHT: if(x0) x-; else x=MAXLIE-1; case UP: if(y0) y-; else y=MAXHANG-1; case DOWN: if(yMAXHANG-1) y+; else y=0; 2.2.2机器输入时:2.2.2.1 选择落子之处basefind(chess,&xfind,&yfind,playernow);/重要算法, 通过当前的棋/局(棋盘情况、当前的棋手)来确定棋子的位置。if(xxfind)c=RIGHT; else if(yxfind)c=LEFT; else if(yyfind)c=UP; else c=r; /设定为回车,即确定输入2.2.2.2 进行移动switch(c) case RIGHT: if(x0) x-; else x=MAXLIE-1; case UP: if(y0) y-; else y=MAXHANG-1; case DOWN: if(yMAXHANG-1) y+; else y=0; 2.2.3回车输入 :判定五子连珠2.2.3.1 确定棋子,看此处是否为空,能否落子名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - if(chessyx=0) chessyx=playernow; /被现在方占else printf(a); /报警2.2.3.2 判定棋盘上是否有同方五子连珠islianzhu(chess);/函数,根据棋盘存储情况来判定是否连珠2.2.3.3 判定胜方if(playernow=player1) outtextxy(); else outtextxy(); 2.2.3.4 退出:调用结束游戏函数2.2.3.4 交换棋手 (在判定落子有效的情况下) if(playernow=player1) playernow=player2; /确定后交换对手else playernow=player1; 2.2.4显示设置2.2.4.1清除原来的提示框和棋子:把原来位置重新用棋面颜色画一遍2.2.4.2显示现在的提示框和棋子:把现在位置重新用棋子颜色画一遍2.2.4.3显示提示语句/while( 有输入完 ) 3.结束游戏显示 game over cleardevice(); PrScore(); setcolor(RED); settextstyle(); outtextxy(200,200,GAME OVER); outtextxy(200,200,YOU WIN!);/ outtextxy(200,200,Sorry!) getch(); 结束显示,返回closegraph(); 数据结构设计(模块接口 ):int chessMAXHANGMAXLIE;/棋盘二维数组,记录棋子。20*20,=1:棋手 1 占/2:棋手2 占/0:空int x,y,xr,yr,xb,yb,xstart,ystart,xtemp,ytemp,xfind,yfind;/记录坐标:上一次,下一次,找到的int player1=1,player2=2,playernow;/纪录选手int player1color,player2color,movecancolor,movecannotcolor;/记录颜色编程中修正的数据结构设计:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 编程中修正的算法设计:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -