C语言程序设计工程实训报告.docx
《C语言程序设计工程实训报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计工程实训报告.docx(32页珍藏版)》请在冰豆网上搜索。
C语言程序设计工程实训报告
某某
工程实训报告
五子棋游戏
课程名称C语言程序设计工程实训
姓名
院(系)
专业班级
学号
指导教师
某某大学教务处制
目录
1需求分析1
2系统总框图和功能模块说明1
2.1系统总框图1
2.2功能模块说明1
3系统设计2
3.1主要结构体2
3.2主要功能函数2
3.3关键函数的流程图3
4.系统调试5
5总结6
6源程序清单6
1需求分析
●系统以菜单方式工作
●落子—输入
●实时浏览功能--输出
●存档,按文件查找。
2系统总框图和功能模块说明
2.1系统总框图
图1系统总框图
2.2功能模块说明
棋局生成模块:
生成棋局
用户操作模块:
用户落子,设定游戏等。
游戏判断模块:
判断游戏哪方玩家赢得比赛,游戏是否结束。
3系统设计
3.1主要结构体
{shortLineNo_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;
intGame_Over3(int(*a)[N],intchess_symbol)/*"/"形呈龙*/
/*
以上全局变量依次表示:
行序号颜色,列序号颜色,棋盘格线颜色,玩家1的棋子'X'颜色,玩家2的棋子'O'颜色,游戏主菜单GAME_MENU颜色,
游戏设定菜单Game_Options颜色,"关于游戏"的颜色,是否开启游戏提示音,是否开启棋局终局自动保存
3.2主要功能函数
intmain()
voidAbout_Game()/*游戏帮助*/intGame_Options()/*游戏设定*/intGame_Over1(int(*a)[N],intchess_symbol)/*"-"形或者"|"形呈龙(事实上"-"与"|"关于"\"对称)*/intGame_Over2(int(*a)[N],intchess_symbol)/*"\"形呈龙*/intGame_Over3(int(*a)[N],intchess_symbol)/*"/"形呈龙*/voidInit_Chess(int(*a)[N])/*初始化棋盘,置棋盘上无任何棋子*/intLoad_Chess(int(*a)[N])/*读取棋局*/intLoad_Options()/*读取游戏设定*/voidPrint_Chess(int(*a)[N])/*输出棋局,或者说画棋盘*/intSave_Chess(int(*a)[N],char*ss)/*保存棋局*/intSave_Options()/*保存游戏设定*/intString_to_Int(char*s,intmax)/*字符串条件转化成整型*/
3.3关键函数的流程图
voidInit_Chess(int(*a)[N])/*初始化棋盘,置棋盘上无任何棋子*/
intString_to_Int(char*s,intmax)/*字符串条件转化成整型*/
intmain()
4.系统调试
菜单如上图:
5总结
本次做的五子棋游戏,界面有点简陋,可观性不强,因为操作是要靠输入坐标的方式落子的,可操作性不强,希望能在以后的学习中能够努力的学习这方面的不足。
由于这个游戏是人人对战的,而非人际对战,缺少可玩性,但愿能在日后的学习中做出人机对战的程序来,这无疑是需要强大的算法和坚实的基础,熟练的技巧的,这对我也是很大的挑战。
6源程序清单
#include
#include
#include
#defineN19
#defineSetColor(x)SetConsoleTextAttribute(setcolor,x)
shortLineNo_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'颜色,玩家2的棋子'O'颜色,游戏主菜单GAME_MENU颜色,
游戏设定菜单Game_Options颜色,"关于游戏"的颜色,是否开启游戏提示音,是否开启棋局终局自动保存
*/
voidInit_Chess(int(*a)[N])/*初始化棋盘,置棋盘上无任何棋子*/
{
inti,j;
for(i=0;ifor(j=0;ja[i][j]='';
}
intString_to_Int(char*s,intmax)/*字符串条件转化成整型*/
{
inti,n=0;
for(i=0;s[i]<='9'&&s[i]>='0';i++)
n=10*n+s[i]-'0';/*"s[i]-'0'",not"s[i]-'\0'"*/
return((s[i]=='\0')&&(max<0||n<=max))?
n:
-1;
}
/*
任何一个输入都可以看成是一个不定长的字符串,此函数用来处理非法输入问题,比如输入整型数据时输入了含有字母等非数字字符
*/
voidPrint_Chess(int(*a)[N])/*输出棋局,或者说画棋盘*/
{
inti,j;
HANDLEsetcolor=GetStdHandle(STD_OUTPUT_HANDLE);
SetColor(11);/*设定颜色*/
SetColor(LineNo_Color);
printf("L\\R12345678910111213141516171819\n");
for(i=0;i{
SetColor(Check_Color);
printf("|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
SetColor(RowNo_Color);
printf("%2d",i+1);
SetColor(Check_Color);
printf("|");
for(j=0;j{
if(a[i][j]=='X')
SetColor(X_Color);
else
SetColor(O_Color);
printf("%c",a[i][j]);
SetColor(Check_Color);
printf("|");
}
printf("\n");
}
printf("|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
}
intGame_Over1(int(*a)[N],intchess_symbol)/*"-"形或者"|"形呈龙(事实上"-"与"|"关于"\"对称)*/
{
inti,j,k,l,r;
for(i=0;ifor(k=0;k{
l=r=0;
for(j=k;j"j{
if(a[i][j]==chess_symbol)/*"-"形呈龙*/
l++;
if(a[j][i]==chess_symbol)/*"|"形呈龙*/
r++;
}
if(l==5||r==5)/*连续的5个棋子在一条直线上时,游戏结束*/
return1;
}
return0;
}
intGame_Over2(int(*a)[N],intchess_symbol)/*"\"形呈龙*/
{
inti,j,k,m,LeftDown,RightUp;
for(m=0;mfor(k=0;k{
RightUp=LeftDown=0;
for(i=k,j=k+m;i{
if(a[i][j]==chess_symbol)/*对角线"\"上及其右上方的"\"形呈龙*/
RightUp++;
if(a[j][i]==chess_symbol)/*对角线"\"上及其左下方的"\"形呈龙*/
LeftDown++;
}
if(RightUp==5||LeftDown==5)
return1;
}
return0;
}
intGame_Over3(int(*a)[N],intchess_symbol)/*"/"形呈龙*/
{
inti,j,k,m,LeftUp,RightDown;
for(m=N-1;m>=4;m--)
for(k=0;k{
RightDown=LeftUp=0;
for(i=k,j=m-k;i{
if(a[i][j]==chess_symbol)/*对角线"/"上及其左上方的"/"形呈龙*/
LeftUp++;
if(a[N-1-j][N-1-i]==chess_symbol)/*对角线"/"上及其右下方的"/"形呈龙*/
RightDown++;/*上面应该是"a[N-1-j][N-1-i]",而不是"a[N-j][N-i]"*/
}
if(RightDown==5||LeftUp==5)
return1;
}
return0;
}
/*
以上三个函数通过遍历棋盘所有的可能呈龙情况以判定游戏是否over了
*/
intSave_Chess(int(*a)[N],char*ss)/*保存棋局*/
{
inti,j;
FILE*fp;
if(strcmp(ss,"save")==0)/*保存当前未结束的棋局*/
if((fp=fopen("Save.sav","w"))==NULL)
{
printf("Can'topenfile\"Save.sav\"!
\n");
return0;
}
else
printf("当前棋局已经成功保存到存档文件\"Save.sav\"中!
\n");
else/*保存棋局终局*/
if((fp=fopen("Ending.txt","a"))==NULL)
{
printf("Can'topenfile\"Ending.txt\"!
\n");
return0;
}
else
printf("棋局终局已经成功保存到文本文件\"Ending.txt\"中!
\n");
fprintf(fp,"L\\R12345678910111213141516171819\n");
for(i=0;i{
fprintf(fp,"|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
fprintf(fp,"%2d|",i+1);
for(j=0;jfprintf(fp,"%c|",a[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
fclose(fp);
return1;
}
intSave_Options()/*保存游戏设定*/
{
FILE*fp;
if((fp=fopen("Config.ini","w"))==NULL)
{
printf("Can'topenfile\"Config.ini\"!
\n");
return0;
}
fprintf(fp,"LineNo_Color=%d\nRowNo_Color=%d\nCheck_Color=%d\nX_Color=%d\n",LineNo_Color,RowNo_Color,Check_Color,X_Color);
fprintf(fp,"O_Color=%d\nMenu_Color=%d\nGame_Options_Color=%d\n",O_Color,Menu_Color,Game_Options_Color);
fprintf(fp,"Help_Color=%d\nOpen_Sound=%d\nAuto_Save_Ending=%d\n",Help_Color,Open_Sound,Auto_Save_Ending);
fclose(fp);
printf("当前游戏设定已经成功保存到配置文件\"Config.ini\"中!
\n");
return1;
}
intLoad_Chess(int(*a)[N])/*读取棋局*/
{
intj,k,X_Number=0,O_Number=0;
charc;
doublei=-1.5;
FILE*fp;
if((fp=fopen("Save.sav","r"))==NULL)/*检测存档文件"Save.sav"是否在当前目录下*/
return0;
Init_Chess(a);/*先初始化棋盘*/
c=fgetc(fp);
while(c!
=EOF)
{
if(c=='X')
X_Number++;
else
if(c=='O')
O_Number++;
c=fgetc(fp);
}
if(X_Number-O_Number>1||X_Number-O_Number<-1)/*检查棋盘数据是否合法*/
return-1;
rewind(fp);/*文件指针移至文件首*/
c=fgetc(fp);
while(c!
=EOF&&i{
if(c=='\n')
{
i+=0.5;
k=0;
}
if(c=='X')
{
j=k/4-1;/*棋盘数据的分布规律*/
a[(int)i][j]='X';/*读取档案数据*/
}
if(c=='O')
{
j=k/4-1;
a[(int)i][j]='O';
}
c=fgetc(fp);
k++;
}
fclose(fp);
returnX_Number>O_Number?
2:
1;/*返回读档后的优先下棋的玩家*/
}
intLoad_Options()/*读取游戏设定*/
{
charc;
shortOption_Value[10]={0},i=0;
FILE*fp;
if((fp=fopen("Config.ini","r"))==NULL)/*检测配置文件"Config.ini"是否在当前目录下*/
return0;
c=fgetc(fp);
while(c!
=EOF)
{
if(c<='9'&&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_Value[0];/*加载配置文件"Config.ini"中的设定*/
RowNo_Color=Option_Value[1];
Check_Color=Option_Value[2];
X_Color=Option_Value[3];
O_Color=Option_Value[4];
Menu_Color=Option_Value[5];
Game_Options_Color=Option_Value[6];
Help_Color=Option_Value[7];
Open_Sound=Option_Value[8];
Auto_Save_Ending=Option_Value[9];
return1;
}
intGame_Options()/*游戏设定*/
{
HANDLEsetcolor=GetStdHandle(STD_OUTPUT_HANDLE);
inttemp;
shorti;
chars[10];
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的棋子的颜色;\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("请输入一个整数以决定你要设定的项目:
");
scanf("%s",s);
temp=String_to_Int(s,15);
switch(temp)
{
case1:
system("cls");
for(i=1;i<16;i++)
{
SetColor(i);
printf("%d是当前其显示的颜色的属性值!
\n",i);
}
break;
case2:
printf("请输入行序号颜色的属性值(1-15):
");
scanf("%s",s);
temp=String_to_Int(s,15);
if(temp>0)
{
LineNo_Color=temp;
printf("已成功设定行序号的颜色!
\n");
}
else
rintf("非法的颜色属性值!
\n");
break;
case3:
printf("请输入列序号颜色的属性值(1-15):
");
scanf("%s",s);
temp=String_to_Int(s,15);
if(temp>0)
{
RowNo_Color=temp;
printf("已成功设定列序号的颜色!
\n");
}
else
printf("非法的颜色属性值!
\n");
break;
case4:
printf("请输入棋局格线(棋盘)颜色的属性值(1-15):
");
scanf("%s",s);
temp=String_to_Int(s,15);
if(temp>0)
{
Check_Color=temp;
printf("已成功设定棋局格线(棋盘)的颜色!
\n");
}
else
printf("非法的颜色属性值!
\n");
break;
case5:
printf("请输入玩家1的棋子(棋子符号'X')颜色的属性值(1-15):
");
scanf("%s",s);
temp=String_to_Int(s,15);
if(temp>0)
{
X_Color=temp;
printf("已成功设定玩家1的棋子的颜色!
\n");
}
else
printf("非法的颜色属性值!
\n");
break;
case6:
printf("请输入玩家2的棋子(棋子符号'O')颜色的属性值(1-15):
");
scanf("%s",s);
temp=String_to_Int(s,15);
if(temp>0)
{
O_Color=temp;
printf("已成功设定玩家2的棋子的颜色!
\n");
}
else
printf("非法的颜色属性值!
\n");
break;
case7:
printf("请输入游戏主菜单Game_Menu的颜色的属性值(1-15):
");
scanf("%s",s);
te