1、软件环境:安装VC+6.0第二章 功能描述本程序用C语言实现了五子棋游戏,能进行基本的五子棋操作。程序能实现界面的初始化功能、下棋功能、人机智能对战功能、胜负判断功能、悔棋功能、读档及存档功能,通过键盘操作控制下棋。(1)显示欢迎界面。在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;(2)初始化功能。程序初始化屏幕和棋盘,默认玩家先行。(3)下棋操作。利用W、S、A、D及空格键实现下棋操作,在下棋过程中能随时按ESC键退出。(4)人机智能对战功能。电脑根据玩家的下棋对棋盘进行智能分析,然后下棋,实现人机对弈。(5)悔棋功能。玩家可以有三次悔棋机会。(6)胜负判断功能。程序能对下棋的结果进行
2、判断,分出胜负。并显示获胜方。(7)读档、存档功能。游戏中途退出会提示是否存档,如果存档,则下次开始的时候会提示是否读档继续上次的游戏。第三章 总体设计3.1 功能模块设计 开始3.1.1 任务执行流程图 初始化程序 按Esc键玩家行棋玩家获胜?否是电脑行棋 显示玩家 获胜信息电脑 否 是显示电脑 获胜信息 结束3.1.2 下棋函数流程图向键值指示的方向移动一步key=SPACE?显示获胜信息Key=ESC?boardij等于 ?玩家 获胜?下一步超出边界?交换行棋方画棋子,显示运动轨迹获取key值boardij赋值为b 是 否 否 是 否 是否是3.2 数据结构设计3.2.1 定义结构体将棋
3、盘上每个点的左边定义为一个结构体;typedef struct int x, y;point;3.2.2 定义数组定义数组board1515表示棋盘,用来记录棋盘上每个棋子的状态;3.2.3 全局变量定义整形数组 back4 用来记录前两步双方下棋的状态,便于后面进行悔棋操作 定义整形 n = 3; 用来记录悔棋次数3.3 函数功能描述1、显示欢迎信息 bool welcome();2、初始化棋盘 void InitBoard();3、输出棋盘 void chessboard();4、判断胜负 int Win(char c); 5、下棋 void play(point &r);6、显示获胜 v
4、oid showsusscced(char c);7、悔棋 bool BackStep(int back);8、人机对战智能算法 void ComAlgo(point &9、存盘函数 bool SaveLoad();10、读盘函数 bool DownLoad();第四章 程序实现4.1源码分析1、显示欢迎信息bool welcome()char ch; printf(nnnn);printf(n Welcome you to gobang World! n1、You can use the A,D,W and S key to move the chessman; n2、You can pre
5、ss Space key to enter after you move it; n3、You can use Esc key to exit the game; n4、Dont move the pieces out of the chessboard. n Do you want to continue?(Y/N) nnwhile (! strchr(YN, ch = toupper(getch()putchar(aif(ch = N) return false;else return true;2、初始化棋盘void InitBoard() int i, j;nn是否读档?(Y/N)ni
6、f(ch = toupper(getch() = Y & DownLoad()printf(读档成功!nelsefor(i = 0; i 15; i +) for(j = 0; j j +)boardij = ;chessboard();3、输出棋盘void chessboard()/清屏system(cls/输出棋盘的上边缘 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 n n nfor(int i = 1;= 15; i +)/输出列序号及相应的列元素%02d, i); for(int j = 1;switch (boardi - 1j - 1)
7、/(由于在命令行模式下显示,所以,颜色是颠倒的)case : printf( break; /如果当前位置无子,则输出棋盘h /如果是黑子,则输出黑子的符号b /如果是白子,则输出白子的符号g /显示光标/输出每列的最后一个制表符%02dn n 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 n4、下棋void play(point &r)char key, c;dowhile (!ADWSZ, key = toupper(getch()if(key = 27 | key = 32) break;putchar(switch(key)case A /向
8、左if(r.y = 15) break;else r.y +;W /向上if(r.x else r.x +;case 32: /SPACE空格if(boardr.x - 1r.y - 1 != ) key = 0; /key的值修改为非32的数值else boardr.x - 1r.y - 1 = back0 = r.x - 1; back1 = r.y - 1; /记录当前位置,便于悔棋 chessboard();Z /悔棋BackStep(back);case 27: /ESC退出printf(Game Over!是否存档?if(c = toupper(getch() = SaveLoad
9、() printf(存档成功!exit(1);default:fflush(stdin);while(key != 32);注:1、W、S、A、D分别表示上下左右键。如果超出了棋盘则不进行操作。否则向键值指示的方向移动一步。2、c = boardr.x - 1r.y - 1;boardr.x - 1r.y - 1 = boardr.x - 1r.y - 1 = c;这四句表示记录当前移动位置,然后显示光标,显示完以后还原棋盘。3、按空格键表示下棋,如果当前位置有棋子则不进行操作。back0 = r.x - 1; 用于记录当前位置,便于悔棋 。4、按Z悔棋5、按ESC键退出,并且提示是否存档。5
10、、判断胜负int Win(char c) int i, j, ok = 1;/判断横着的5个是否都相等for(i = 0;for(j = 0; 11;if(boardij=c & boardij+1=c & boardij+2=c & boardij+3=c & boardij+4=c) return ok;/判断竖着的5个是否都相等for(j = 0; boardi+1j=c & boardi+2j=c & boardi+3j=c & boardi+4j=c) return 1;/判断左斜5个是否都相等 j +) boardi+1j+1=c & boardi+2j+2=c & boardi+
11、3j+3=c & boardi+4j+4=c) /判断右斜5个是否都相等for(j = 14; j 3; j -) boardi+1j-1=c & boardi+2j-2=c & boardi+3j-3=c & boardi+4j-4=c) return ok = 0;全篇扫面棋盘,从四个方向判断是否存在连着5个棋子6、显示获胜void showsusscced(char c)if(c = )游戏结束 白棋获胜!else if(c = 游戏结束 黑棋获胜!游戏结束 和棋!7、悔棋bool BackStep(int back)if(n 0)boardback0back1 = boardback2
12、back3 = chessboard();n -;悔棋成功,您还有%d次悔棋机会n, n);return true;悔棋超过三次,您不能悔棋了!return false;8、存盘函数bool SaveLoad() FILE *f;f = fopen(Load.TXT, wif(f = NULL)存档失败!fwrite(board, sizeof(char), 225, f);fclose(f);9、读盘函数bool DownLoad() r读档失败!fread(board, sizeof(char), 225, f);存盘存在当前文件夹内的Load.txt文件中,用fwrite()函数和fre
13、ad()函数读取和存储数组元素。10、人机对战智能算法void ComAlgo(point &/棋型数组int qiju2151582 = 0;/*其中第一个下标为0时表示白棋,为1时表示黑棋,第二和第三个下标表示(x,y),第四个下标表示8个方向,最后一个下标为0时表示棋子数,为1时表示空格数*/char d; /表示黑棋或白棋int k, i, j, q, a = 1; /(k, i, j, q, 0/1)表示棋型数组; a, b用来计数intb = 0, y1 = 0, y2 = 0, x1 = 0, x2 = 0; / b表示得分; (x1, y1)和(x2, y2)表示坐标int a
14、11515 = 0, a21515 = 0; /用来记录白棋和黑棋各个棋子位置的得分/*为双方填写棋型表*/for(k = 0; k 2; k +)if(boardij = for(q = 0; q = 0;if(boardij-a = d) b+; a+; continue;else break;qijukijq0 = b; b = 0;if(boardij-a = j - a = 0) qijukijq1 = 1; a = 1;else qijukijq1 = 0;/左上if(q = 1 & i = 0 &i - a if(boardi-aj-a = d) b+;if(boardi-aj-a = i - a else qijukijq1 = 0;/上if(q = 2 &if(bo