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