请教关于一个纯c语言编写的五子棋游戏的问题

本人是c新手,目前有个课程设计是c做的五子棋游戏。基本的代码已经写好,但在操作上还没有符合老师的课程实践的要求

因为规定是用纯c语言在vc++6.0环境下编译的,不能用tc

所以在里面出现的<bios.h>和<graphics.h>都会提示编译错误

下面是我们写的代码,菜鸟级的

(经vc++6.0调试是可以通过的)

— — — — — — — — — — — — — — — — — — — — — — — — — — — —

#include <stdio.h>

#include <conio.h>

#include <windows.h>

#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'颜色,玩家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 ] <= '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;

}

/*

任何一个输入都可以看成是一个不定长的字符串,此函数用来处理非法输入问题,比如输入整型数据时输入了含有字母等非数字字符

*/

 

void Print_Chess( int (*a)[N] )/*输出棋局,或者说画棋盘*/

{

int i, j;

HANDLE setcolor=GetStdHandle( STD_OUTPUT_HANDLE );

SetColor( 11 );/*设定颜色*/

printf("Designed by 黎喜裕|郑汉成|何信|杨华健\n");

SetColor( LineNo_Color );

printf("L\\R 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n");

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( a[i][j] == 'X' )

SetColor( X_Color );

else

SetColor( O_Color );

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;" not "j < j+5;" */

{

if( a[i][j] == chess_symbol )/* "-"形呈龙 */

l++;

if( a[j][i] == 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;

for( i=k , j=k+m; i < k+5; i++ , j++ )

{

if( a[i][j] == chess_symbol )/* 对角线"\"上及其右上方的"\"形呈龙 */

RightUp++;

if( a[j][i] == chess_symbol )/* 对角线"\"上及其左下方的"\"形呈龙 */

LeftDown++;

}

if( RightUp == 5 || LeftDown == 5 )

return 1;

}

return 0;

}

 

int Game_Over3( int (*a)[N] , int chess_symbol )/* "/"形呈龙 */

{

int i, j, k, m, LeftUp, RightDown;

for( m=N-1; m >= 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( 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 )

return 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(" Can't open file \"Save.sav\" !\n");

return 0;

}

else

printf("当前棋局已经成功保存到存档文件\"Save.sav\"中!\n");

else /*保存棋局终局*/

if( ( fp = fopen( "Ending.txt" , "a" ) ) == NULL )

{

printf(" Can't open file \"Ending.txt\" !\n");

return 0;

}

else

printf("棋局终局已经成功保存到文本文件\"Ending.txt\"中!\n");

fprintf( fp , "Designed by 黎喜裕|郑汉成|何信|杨华健\n" );

fprintf( fp , "L\\R 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n" );

for( i = 0; i < N; i++ )

{

fprintf( fp , " |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n" );

fprintf( fp , "%2d|" , i + 1 );

for( j = 0; j < N; j++ )

fprintf( fp , " %c |" , a[ i ][ j ] );

fprintf( fp , "\n" );

}

fprintf( fp , " |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n" );

fclose(fp);

return 1;

}

 

int Save_Options( )/*保存游戏设定*/

{

FILE* fp;

if( ( fp = fopen( "Config.ini" , "w" ) ) == NULL )

{

printf("Can't open file \"Config.ini\" !\n");

return 0;

}

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");

return 1;

}

 

int Load_Chess( int (*a)[N] )/*读取棋局*/

{

int j , k , X_Number =0 , O_Number = 0 ;

char c;

double i = - 1.5;

FILE* fp;

if( ( fp = fopen ( "Save.sav" , "r" ) ) == NULL )/*检测存档文件"Save.sav"是否在当前目录下*/

return 0;

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 < N )/*确保数组不越界*/

{

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);

return X_Number > O_Number ? 2 : 1;/*返回读档后的优先下棋的玩家*/

}

 

int Load_Options( )/*读取游戏设定*/

{

char c;

short Option_Value[10] = { 0 } , i = 0 ;

FILE* fp;

if( ( fp = fopen( "Config.ini" , "r" ) ) == NULL )/*检测配置文件"Config.ini"是否在当前目录下*/

return 0;

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];

return 1;

}
int Game_Options( )/*游戏设定*/

{

HANDLE setcolor=GetStdHandle(STD_OUTPUT_HANDLE);

int temp;

short i;

char s[10];

while(1)

{

system("cls");

SetColor(11);

printf("Designed by 黎喜裕|郑汉成|何信|杨华健\n");

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 )

{

case 1:

system("cls");

for( i=1 ; i < 16 ; i++ )

{

SetColor( i );

printf( "%d是当前其显示的颜色的属性值!\n" , i );

}

break;

case 2:

printf("请输入行序号颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

LineNo_Color = temp;

printf("已成功设定行序号的颜色!\n");

}

else

printf("非法的颜色属性值!\n");

break;

case 3:

printf("请输入列序号颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

RowNo_Color = temp;

printf("已成功设定列序号的颜色!\n");

}

else

printf("非法的颜色属性值!\n");

break;

case 4:

printf("请输入棋局格线(棋盘)颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

Check_Color = temp;

printf("已成功设定棋局格线(棋盘)的颜色!\n");

}

else

printf("非法的颜色属性值!\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");

}

else

printf("非法的颜色属性值!\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");

}

else

printf("非法的颜色属性值!\n");

break;

case 7:

printf("请输入游戏主菜单Game_Menu的颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

Menu_Color = temp;

printf("已成功设定游戏主菜单Game_Menu的颜色!\n");

}

else

printf("非法的颜色属性值!\n");

break;

case 8:

printf("请输入游戏设定菜单Game_Options的颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

Game_Options_Color = temp;

printf("已成功设定游戏设定菜单Game_Options的颜色!\n");

}

else

printf("非法的颜色属性值!\n");

break;

case 9:

printf("请输入\"关于游戏\"的颜色的属性值(1-15):");

scanf("%s",s);

temp = String_to_Int( s , 15 );

if( temp > 0 )

{

Help_Color = temp;

printf("已成功设定\"关于游戏\"的颜色!\n");

}

else

printf("非法的颜色属性值!\n");

break;

case 10:

printf("请输入\"yes\"(不含引号\",下同)开启游戏提示音或输入\"no\"关闭游戏提示音:");

scanf("%s",s);

if( strcmp( s , "yes" ) == 0 )

{

Open_Sound = 1 ;

printf("游戏提示音已开启!\n");

}

else

if( strcmp( s , "no" ) == 0 )

{

Open_Sound = 0 ;

printf("游戏提示音已关闭!\n");

}

else

printf("对不起,输入错误!\n");

break;

case 11:

printf("请输入\"yes\"开启棋局终局自动保存或输入\"no\"关闭自动保存:");

scanf("%s",s);

if( strcmp( s , "yes" ) == 0 )

{

Auto_Save_Ending = 1 ;

printf("棋局终局自动保存已开启!\n");

}

else

if( strcmp( s , "no" ) == 0 )

{

Auto_Save_Ending = 0 ;

printf("棋局终局自动保存已关闭!\n");

}

else

printf("对不起,输入错误!\n");

break;

case 12:

Save_Options( );

break;

case 13:

temp = Load_Options( );/*读取配置文件"Config.ini"中的游戏设定,并检查配置文件数据是否合法*/

if( temp == 0 )

printf("对不起,无法打开配置文件\"Config.ini\"!\n请确保配置文件\"Config.ini\"在当前文件夹下.\n");

else

if( temp == -1 )

printf("对不起,无法加载配置文件\"Config.ini\"!因为文件中存在非法数据.\n");

else

if( temp = 1 )

printf("已经成功读取配置文件\"Config.ini\"中的游戏设定!\n");

break;

case 14:

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;

printf("游戏设定已经恢复为默认值!\n");

break;

case 15:

return 0;

default:

printf("对不起,输入错误! 请在游戏设定菜单Game_Options中重新输入.\n");

}

SetColor( Game_Options_Color );

printf("按任意键返回游戏设定菜单Game_Options.");

getch();

}

return 1;

}

 

void About_Game( )/*游戏帮助*/

{

HANDLE setcolor = GetStdHandle( STD_OUTPUT_HANDLE );

system(" cls ");

SetColor( 11 );

printf("Designed by 黎喜裕|郑汉成|何信|杨华健\n");

SetColor( Help_Color );

printf("一个简朴的五子棋游戏,希望你能喜欢!\\<^+^>/\n\n1.游戏规则:\n\n");

printf("玩家1和玩家2轮流在棋盘(19X19)上任意空闲位置(没有棋子)放置一个棋子,放置的方法是输入要放置的棋子的位置(即该棋子所在");

printf("的行的序号和所在的列的序号,棋盘中L、R分别表示行(Line)、列((Row)),同一玩家所放棋子中任意五个或五个以上棋子较先呈现");

printf("连续在同一直线(四种形式|、-、/、\\)上的玩家获胜!\n\n2.游戏操作:\n\n");

printf("(1)在游戏主菜单“Game_Menu”中输入相应的数字并回车即可执行相应的操作,第一次玩请先输入5并回车查看游戏帮助,然后返");

printf("回“Game_Menu”后输入1并回车选择“新的棋局”开始游戏.“新的棋局”将开始一场新的游戏,棋盘数据将被初始化,在进行“新");

printf("的棋局”前有必要的话(比如第n次玩,n>1且是整数)请注意保存之前的棋局;\n\n1/4\n按任一键跳至下一页");

getch();

system("cls");

 

printf("(2)“新的棋局”开始后如果中途想返回游戏主菜单“Game_Menu”执行其他操作请在“请输入要放的棋子所在的行(L)的序号:”时");

printf("输入“exit”(不含引号,下同)并回车即可,如果想要继续游戏的话请输入2并回车选择“继续当前棋局”,注意“当前棋局”指的");

printf("是在游戏程序没有关闭情况下的当前棋局,如果没有进行游戏,则当前棋局则为空棋局;\n\n");

printf("(3)如果想保存棋局请在“请输入要放的棋子所在的行(L)的序号:”时输入“save”即可将当前棋局存至存档文件Save.sav中,并");

printf("且存档文件会自动在游戏主程序“五子棋.exe”所在的文件夹(目录)下建立,以便下次启动游戏时可以在“游戏主菜单”中输入3");

printf("并回车选择“从文件中读取已存档的棋局”继续游戏;\n\n");

printf("(4)关于游戏设定中设定颜色时,请在游戏设定菜单“Game_Options”先输入1查看各种颜色对应的属性值(范围1-15),然后根据个");

printf("人喜好(输入颜色的属性值以)设定各个选项的颜色;\n\n");

printf("(5)“游戏提示音”是在游戏进行过程中对玩家的非法输入和玩家的获胜进行提醒的,“棋局终局自动保存”是任一玩家获胜后游戏");

printf("自动对棋局终局的保存,终局保存在Ending.txt中,以便玩家在游戏结束后对棋局进行研究;\n\n2/4\n按任一键跳至下一页");

getch();

system("cls");

 

printf("(6)游戏设定是可以保存在配置文件“Config.ini”中,配置文件中各参数及值(以下是默认值)的意义分别是:LineNo_Color=15(");

printf("行序号颜色=亮白),RowNo_Color=15(列序号颜色=亮白),Check_Color=6(棋局格线(棋盘)颜色=暗黄),X_Color=10(玩家1的棋子");

printf("颜色=鲜绿),O_Color=12(玩家2的棋子颜色=鲜红),Menu_Color=7(游戏主菜单颜色=白),Game_Options_Color=7(游戏设定菜单");

printf("颜色=白),Help_Color=7(“关于游戏”颜色=白),Open_Sound=1(是否开启提示音=是),Auto_Save_Ending=1(是否开启棋局终局");

printf("自动保存=是).内行的玩家可以在配置文件中对游戏的各个选项进行设定,但是颜色属性值请控制在1-255,提示音及自动保存的");

printf("值只有两个,分别是0(关)和1(开),注意修改时请不要更改文本内容结构!每次启动游戏时都是先加载Config.ini中的设定,如果");

printf("没有Config.ini,则加载默认的设定;\n\n");

printf("(7)棋局存档只能存一个,多次存档会覆盖,并且以最后一次存的档案为准,游戏设定存档也是.棋局终局自动保存则是以追加的");

printf("方式保存,即每次的棋局终局都将保存,所以此功能请慎用,因为文本文件Ending.txt将随玩家的多次试玩会越来越大,系统默");

printf("认是开启自动保存,主要是想让玩家可以预览此项功能\\<^+^>/.如果已开启此功能,请定期清理文件Ending.txt,以免浪费存储");

printf("空间.读取档案时请确保相应的存档文件与游戏主程序“五子棋.exe”在同一文件夹(目录)下,而且尽量不要自行修改存档数据,");

printf("以免发生错误.\n\n3/4\n按任一键跳至下一页");

getch();

system("cls");

 

printf("3.游戏说明:\n\n(1)启动游戏后请将游戏窗口最大化并将右侧的滚动条滑至最上端以获得最佳的游戏显示效果;\n\n");

printf("(2)这是我编的第一个成型游戏,由于本人水平有限,所以游戏界面只能做到如此程度了,甚是简陋,请各位玩家见谅;\n\n");

printf("(3)此游戏可以免费传播,但请不要修改游戏程序本身,不得用于商业用途;(*^+^*)\n\n");

printf("(4)游戏中遇到任何问题请和黎喜裕(QQ:805782483)联系,欢迎各位玩家提出宝贵的意见,同时也希望各位玩家继续关注");

printf("黎喜裕的其他作品并支持我;\n\n最后祝各位玩家玩得愉快!\n\n\\<^+^>/\n\n4/4\n");

}
int main()

{

int a[N][N], i, j, player = 1 , temp ;/*玩家1先下棋*/

char s[10];

HANDLE setcolor=GetStdHandle(STD_OUTPUT_HANDLE);

Init_Chess( a );/*初始化棋局*/

Load_Options( );/*加载配置文件"Config.ini"中的游戏设定,如果配置文件不在当前目录下,则游戏设定为默认值*/

while(1)

{

system("cls");

SetColor( 11 );

printf("Designed by 黎喜裕|郑汉成|何信|杨华健\n");

printf("A simple quintet game,hope you can enjoy!\\<^+^>/\n");

SetColor( Menu_Color );

printf("*-*-*-*-*GAME_MENU (坑爹的五子棋)*-*-*-*-*\n");

printf("1.新的棋局;\n");

printf("2.继续当前棋局;\n");

printf("3.从文件中读取已存档的棋局;\n");

printf("4.游戏设定;\n");

printf("5.关于游戏;\n");

printf("6.退出游戏.\n");

printf("请先输入一个数(1-6)后按\"Enter\"键执行相应操作:");

scanf("%s",s);

temp = String_to_Int( s , 6 );

switch( temp )

{

case 1:

Init_Chess( a );

player = 1;

loop:

while(1)

{

system("cls");

Print_Chess( a );/*输出即时棋局*/

SetColor( Menu_Color );

printf("玩家%d(棋子符号:'" , player );/*游戏玩家下棋提示*/

if( player == 1 )

SetColor( X_Color );

else

SetColor( O_Color );

printf( "%c" , player == 1 ? 'X' : 'O' );

SetColor( Menu_Color );

printf("')下棋:\n" );

printf("请输入要放的棋子所在的行(L)的序号:");

scanf("%s",s);

if( strcmp( s , "save" ) == 0 )/*输入"save"保存当前棋局至文件"Save.sav"中*/

{

Save_Chess( a , "save" );

break;

}

else

if( strcmp( s , "exit" ) == 0 )/*输入"exit"暂停游戏并返回游戏主菜单GAME_MENU*/

break;

i = String_to_Int( s , N );/* 显然, i <= N */

if( i < 1 )/*检测输入的数据是否合法*/

{

if( Open_Sound )/*游戏提示音*/

printf("\a");

printf("对不起,输入错误! 请按任意键返回后重新输入棋子位置.");/*输入错误提示*/

getch();

}

else

{

printf("请输入要放的棋子所在的列(R)的序号:");

scanf("%s",s);

j = String_to_Int( s , N );

if( j < 1 || a[i-1][j-1] != ' ' )/*检测输入的位置是否不合法:即该位置是否有棋子*/

{

if( Open_Sound )

printf("\a");

printf("对不起,输入错误! 请按任意键返回后重新输入棋子位置.");

getch();

}

else

if( player == 1 )

{

a[i-1][j-1]='X';

if( Game_Over1( a , 'X' ) || Game_Over2( a , 'X' ) || Game_Over3( a , 'X' ) )/*检测玩家1是否胜出*/

{

system("cls");

Print_Chess( a );

if( Open_Sound )

printf("\a\a");

SetColor( X_Color );

printf( "恭喜! 玩家1获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );

break;

}

player=2;/*轮到玩家2下棋了*/

}

else

{

a[i-1][j-1]='O';

if( Game_Over1( a , 'O' ) || Game_Over2( a , 'O' ) || Game_Over3( a , 'O' ) )/*检测玩家2是否胜出*/

{

system("cls");

Print_Chess( a );

SetColor( O_Color );

if( Open_Sound )

printf("\a\a");

printf( "恭喜! 玩家2获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );

break;

}

player=1;/*轮到玩家1下棋了*/

}

}

}

break;

case 2:

if( Game_Over1( a , 'X' ) || Game_Over2( a , 'X' ) || Game_Over3( a , 'X' ) )

{

system("cls");

Print_Chess( a );

if( Open_Sound )

printf("\a\a");

printf( "恭喜! 玩家1获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );

}

else

if( Game_Over1( a , 'O' ) || Game_Over2( a , 'O' ) || Game_Over3( a , 'O' ) )

{

system("cls");

Print_Chess( a );

if( Open_Sound )

printf("\a\a");

printf( "恭喜! 玩家2获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );

}/*检测棋局是否还有进行下去的必要*/

else

goto loop;/*继续当前棋局*/

break;

case 3:

temp = Load_Chess( a );

if( temp == 0 )

printf("无法打开存档文件\"Save.sav\"!\n请确保存档文件\"Save.sav\"在当前文件夹下.\n");

else

if( temp == -1 )

printf("非法的棋局存档文件!\n");

else

if( Game_Over1( a , 'X' ) || Game_Over2( a , 'X' ) || Game_Over3( a , 'X' ) )

{

system("cls");

Print_Chess( a );

if( Open_Sound )

printf("\a\a");

SetColor( X_Color );

printf( "恭喜! 玩家1获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );/*保存棋局终局*/

}

else

if( Game_Over1( a , 'O' ) || Game_Over2( a , 'O' ) || Game_Over3( a , 'O' ) )

{

system("cls");

Print_Chess( a );

if( Open_Sound )

printf("\a\a");

SetColor( O_Color );

printf( "恭喜! 玩家2获胜!\\<^+^>/\n" );

if( Auto_Save_Ending )

Save_Chess( a , "ending" );

}/*检测棋局是否还有进行下去的必要*/

else

{

player=temp;/*继续存档中的棋局*/

goto loop;

}

break;

case 4:

Game_Options( );/*游戏设定*/

break;

case 5:

About_Game( );/*关于游戏*/

break;

case 6:

SetColor( 11 );

printf("感谢你的试玩,请继续关注我们的其他作品.\n");

SetColor(Menu_Color);

printf("按任意键退出游戏.");

getch();

return 0;

default:

printf("对不起,输入错误! 请在游戏主菜单GAME_MENU中重新输入.\n");/*错误提示*/

}

SetColor( Menu_Color );

printf("按任意键返回游戏主菜单GAME_MENU.");

getch();

}

return 0;

}

— — — — — — — — — — — — — — — — — — — — — — — — — — — —

界面比较简陋

只能通过输入数字控制坐标来实现,而老师的要求是:五子棋:人机对弈和二人对弈,系统判断输赢和禁手,

具有计时记分功能,保留最高分纪录,支持鼠标和键盘操作,能悔棋一步。

 

因为我们是非计算机专业,平时也不多接触代码的一门学科,因为在这里提出一个菜鸟的问题:

在这种情况下,通过怎么样的修改代码来实现鼠标和键盘的操作?

希望各位们大虾能给点意见,谢谢

转载于:https://www.cnblogs.com/lixiyu/archive/2011/12/18/2291751.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值