1、C语言程序设计工程实训报告某某工程实训报告五子棋游戏 课程名称 C语言程序设计工程实训姓 名 院(系) 专业班级 学 号 指导教师 某某大学教务处制目 录1 需求分析 12 系统总框图和功能模块说明 12.1 系统总框图 12.2 功能模块说明 13 系统设计 23.1 主要结构体 23.2主要功能函数 23.3 关键函数的流程图 34.系统调试 55 总结 66 源程序清单 61 需求分析 系统以菜单方式工作 落子输入 实时浏览功能输出 存档,按文件查找。2 系统总框图和功能模块说明2.1 系统总框图图1 系统总框图2.2 功能模块说明棋局生成模块:生成棋局用户操作模块:用户落子,设定游戏等
2、。游戏判断模块:判断游戏哪方玩家赢得比赛,游戏是否结束。3 系统设计3.1 主要结构体short LineNo_Color=15,RowNo_Color=15,Check_Color=6,X_Color=10,O_Color=12,Menu_Color=7,Game_Options_Color=7,Help_Color=7,Open_Sound=1,Auto_Save_Ending=1;int Game_Over3( int (*a)N , int chess_symbol )/* /形呈龙 */*以上全局变量依次表示:行序号颜色,列序号颜色,棋盘格线颜色,玩家1的棋子X颜色,玩家2的棋子O颜
3、色,游戏主菜单GAME_MENU颜色,游戏设定菜单Game_Options颜色,关于游戏的颜色,是否开启游戏提示音,是否开启棋局终局自动保存3.2主要功能函数int main()void About_Game( )/*游戏帮助*/ int Game_Options( )/*游戏设定*/ int Game_Over1( int (*a)N , int chess_symbol )/* -形或者|形呈龙(事实上-与|关于对称) */ int Game_Over2( int (*a)N , int chess_symbol )/* 形呈龙 */int Game_Over3( int (*a)N ,
4、int chess_symbol )/* /形呈龙 */void Init_Chess( int (*a)N )/*初始化棋盘,置棋盘上无任何棋子*/int Load_Chess( int (*a)N )/*读取棋局*/int Load_Options( )/*读取游戏设定*/void Print_Chess( int (*a)N )/*输出棋局,或者说画棋盘*/int Save_Chess( int (*a)N , char* ss )/*保存棋局*/int Save_Options( )/*保存游戏设定*/int String_to_Int( char* s , int max )/*字符
5、串条件转化成整型*/3.3 关键函数的流程图void Init_Chess( int (*a)N )/*初始化棋盘,置棋盘上无任何棋子*/int String_to_Int( char* s , int max )/*字符串条件转化成整型*/int main()4.系统调试菜单如上图:5 总结本次做的五子棋游戏,界面有点简陋,可观性不强,因为操作是要靠输入坐标的方式落子的,可操作性不强,希望能在以后的学习中能够努力的学习这方面的不足。由于这个游戏是人人对战的,而非人际对战,缺少可玩性,但愿能在日后的学习中做出人机对战的程序来,这无疑是需要强大的算法和坚实的基础,熟练的技巧的,这对我也是很大的挑
6、战 。6 源程序清单#include #include #include #define N 19#define SetColor(x) SetConsoleTextAttribute(setcolor,x) short LineNo_Color=15,RowNo_Color=15,Check_Color=6,X_Color=10,O_Color=12,Menu_Color=7,Game_Options_Color=7,Help_Color=7,Open_Sound=1,Auto_Save_Ending=1;/*以上全局变量依次表示:行序号颜色,列序号颜色,棋盘格线颜色,玩家1的棋子X颜色,玩
7、家2的棋子O颜色,游戏主菜单GAME_MENU颜色,游戏设定菜单Game_Options颜色,关于游戏的颜色,是否开启游戏提示音,是否开启棋局终局自动保存*/void Init_Chess( int (*a)N )/*初始化棋盘,置棋盘上无任何棋子*/int i, j;for( i = 0; i N; i+ )for( j = 0; j N; j+ )a i j = ;int String_to_Int( char* s , int max )/*字符串条件转化成整型*/int i, n = 0;for( i=0; s i = 0; i+ )n = 10 * n + s i - 0 ; /*
8、s i - 0 , not s i - 0 */return ( ( s i = 0 ) & ( max 0 | n = max ) ) ? n : -1;/*任何一个输入都可以看成是一个不定长的字符串,此函数用来处理非法输入问题,比如输入整型数据时输入了含有字母等非数字字符*/void Print_Chess( int (*a)N )/*输出棋局,或者说画棋盘*/int i, j;HANDLE setcolor=GetStdHandle( STD_OUTPUT_HANDLE );SetColor( 11 );/*设定颜色*/SetColor( LineNo_Color );printf(LR
9、 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19n);for( i = 0; i N; i+ )SetColor( Check_Color );printf( |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|n);SetColor(RowNo_Color);printf( %2d , i + 1 );SetColor( Check_Color );printf(|);for( j = 0; j N; j+ )if( aij = X )SetColor( X_Color );elseSetColor( O_Color
10、);printf( %c , a i j );SetColor( Check_Color );printf(|);printf(n);printf( |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|n);int Game_Over1( int (*a)N , int chess_symbol )/* -形或者|形呈龙(事实上-与|关于对称) */int i, j, k, l, r;for( i=0; i N; i+ )for( k=0; k N-4; k+ )l=r=0;for( j=k; j k+5; j+ )/* algorithm error: j k+5;
11、 not j j+5; */if( aij = chess_symbol )/* -形呈龙 */l+;if( aji = chess_symbol )/* |形呈龙 */r+;if( l = 5 | r = 5 )/*连续的5个棋子在一条直线上时,游戏结束*/return 1;return 0;int Game_Over2( int (*a)N , int chess_symbol )/* 形呈龙 */int i, j, k, m, LeftDown, RightUp;for( m=0; m N-4; m+ )for( k=0; k N-4-m; k+ )RightUp=LeftDown=0;
12、for( i=k , j=k+m; i = 4; m- )for( k=0; k m + 1 - 4; k+ )RightDown=LeftUp=0;for( i=k , j= m - k; i k+5; i+ , j- )if( aij = chess_symbol )/* 对角线/上及其左上方的/形呈龙 */LeftUp+;if( aN-1-jN-1-i = chess_symbol )/* 对角线/上及其右下方的/形呈龙 */RightDown+;/* 上面应该是 aN-1-jN-1-i , 而不是 aN-jN-i */if( RightDown = 5 | LeftUp = 5 )re
13、turn 1;return 0;/*以上三个函数通过遍历棋盘所有的可能呈龙情况以判定游戏是否over了*/ int Save_Chess( int (*a)N , char* ss )/*保存棋局*/int i, j;FILE* fp;if( strcmp( ss , save ) = 0 )/*保存当前未结束的棋局*/if( ( fp = fopen( Save.sav , w ) ) = NULL )printf( Cant open file Save.sav !n);return 0;elseprintf(当前棋局已经成功保存到存档文件Save.sav中!n);else /*保存棋局终
14、局*/if( ( fp = fopen( Ending.txt , a ) ) = NULL )printf( Cant open file Ending.txt !n);return 0;elseprintf(棋局终局已经成功保存到文本文件Ending.txt中!n);fprintf( fp , LR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19n );for( i = 0; i N; i+ )fprintf( fp , |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|n );fprintf( fp , %2d|
15、 , i + 1 );for( j = 0; j 1 | X_Number - O_Number -1 )/*检查棋盘数据是否合法*/return -1;rewind(fp);/*文件指针移至文件首*/c = fgetc(fp);while( c != EOF & i O_Number ? 2 : 1;/*返回读档后的优先下棋的玩家*/ int Load_Options( )/*读取游戏设定*/char c;short Option_Value10 = 0 , i = 0 ;FILE* fp;if( ( fp = fopen( Config.ini , r ) ) = NULL )/*检测配置
16、文件Config.ini是否在当前目录下*/return 0;c=fgetc(fp);while( c != EOF )if( c = 0 )Option_Value i = 10 * Option_Value i + c - 0 ;/* c - 0 , not c */if( c = n )if( Option_Value i 1 & i 8 )/*确保颜色属性值合法,即不小于1*/return -1;i+;c=fgetc(fp);fclose(fp);LineNo_Color = Option_Value0;/*加载配置文件Config.ini中的设定*/RowNo_Color = Opt
17、ion_Value1;Check_Color = Option_Value2;X_Color = Option_Value3;O_Color = Option_Value4;Menu_Color = Option_Value5;Game_Options_Color = Option_Value6;Help_Color = Option_Value7;Open_Sound = Option_Value8;Auto_Save_Ending = Option_Value9;return 1;int Game_Options( )/*游戏设定*/HANDLE setcolor=GetStdHandle
18、(STD_OUTPUT_HANDLE);int temp;short i;char s10;while(1)system(cls);SetColor(11);SetColor(Game_Options_Color);printf(*-*-*-*-*-*-*Game_Options*-*-*-*-*-*-*n);printf( 1.查看各种颜色的属性值(1-15);n);printf( 2.设定行序号的颜色;n);printf( 3.设定列序号的颜色;n);printf( 4.设定棋局格线(棋盘)的颜色;n);printf( 5.设定玩家1的棋子的颜色;n);printf( 6.设定玩家2的棋子
19、的颜色;n);printf( 7.设定游戏主菜单Game_Menu的颜色;n);printf( 8.设定游戏设定菜单Game_Options的颜色;n);printf( 9.设定关于游戏的颜色;n);printf(10.设定是否开启游戏提示音;n);printf(11.设定是否开启棋局终局自动保存;n);printf(12.保存当前设定到配置文件Config.ini中;n);printf(13.加载配置文件Config.ini中的设定;n);printf(14.恢复游戏设定至默认值;n);printf(15.退出游戏设定菜单Game_Options.n);printf(请输入一个整数以决定你要
20、设定的项目:);scanf(%s,s);temp = String_to_Int( s , 15 );switch( temp )case 1:system(cls);for( i=1 ; i 0 )LineNo_Color = temp;printf(已成功设定行序号的颜色!n);elserintf(非法的颜色属性值!n);break;case 3:printf(请输入列序号颜色的属性值(1-15):);scanf(%s,s);temp = String_to_Int( s , 15 );if( temp 0 )RowNo_Color = temp;printf(已成功设定列序号的颜色!n)
21、;elseprintf(非法的颜色属性值!n);break;case 4:printf(请输入棋局格线(棋盘)颜色的属性值(1-15):);scanf(%s,s);temp = String_to_Int( s , 15 );if( temp 0 )Check_Color = temp;printf(已成功设定棋局格线(棋盘)的颜色!n);elseprintf(非法的颜色属性值!n);break;case 5:printf(请输入玩家1的棋子(棋子符号X)颜色的属性值(1-15):);scanf(%s,s);temp = String_to_Int( s , 15 );if( temp 0 )X_Color = temp;printf(已成功设定玩家1的棋子的颜色!n);elseprintf(非法的颜色属性值!n);break;case 6:printf(请输入玩家2的棋子(棋子符号O)颜色的属性值(1-15):);scanf(%s,s);temp = String_to_Int( s , 15 );if( temp 0 )O_Color = temp;printf(已成功设定玩家2的棋子的颜色!n);elseprintf(非法的颜色属性值!n);break;case 7:printf(请输入游戏主菜单Game_Menu的颜色的属性值(1-15):);scanf(%s,s);te