c语言中编写下c语言编写五子棋游戏程序时,点击开始游戏跳转至下棋界面,这一步应该怎么用程序实现?

纯C语言实现五子棋
投稿:hebedich
字体:[ ] 类型:转载 时间:
本文给大家分享的是去年制作的一个纯C语言实现的五子棋的代码,虽然没有带漂亮的界面,还是推荐给大家,有需要的小伙伴可以参考下。
正在考虑增加一个MFC界面。不是人机对战的。
//date 日09:53:24
#define _CRT_SECURE_NO_WARNINGS
#include &stdio.h&
#include &stdlib.h&
#include &assert.h&
//棋盘初始化函数
//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL
void init_Chessboard(char Chessboard[][7], int ln)
if ((Chessboard != NULL) && (ln&0)){
int i = 0, j = 0;
for (i = 0; i& ++i){
for (j = 0; j& ++j){
Chessboard[i][j] = '\t';
// return C
// return NULL;
//显示棋盘函数
void show_Chessboard(char Chessboard[][7], int ln)
assert((Chessboard != NULL) && (ln & 0));
int i = 0, j = 0;
for (i = 0; i& ++i){
putchar('\t');
putchar(i + '0');
}//end for1
putchar('\n');
putchar('\n');
for (i = 0; i& ++i){
putchar(i + '0');
for (j = 0; j& ++j){
if ('\t' == Chessboard[i][j]){
putchar(Chessboard[i][j]);
putchar('\t');
putchar(Chessboard[i][j]);
putchar('\n');
putchar('\n');
}//end for2
//棋子下子函数
//下子成功返回1,不成功返回0
int play(char Chessboard[][7], int ln, int x, int y, char ChessPieces)
assert(Chessboard); //ChessPieces=NULL跳出
if ((x&ln) && (y&ln) && (x &= 0) && (y &= 0)){
if ('\t' == Chessboard[x][y]){
Chessboard[x][y] = ChessP
}//end if2
}//end if1
//满盘判断
//棋盘满了判断//满了就返回-1
int full_Chess(char Chessboard[][7], int ln)
int i = 0, j = 0;
for (i = 0; i& ++i){
for (j = 0; j& ++j){
if ('\t' == Chessboard[i][j]){
//棋盘未满
}//end for j
}//end for i
return 1;//棋盘满了
//是否连成五子线判断函数
//Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记
//连成线返回1,没有返回0
int judga_line(char Chessboard[][7], int ln, int XS, int YS, int dx, int dy)
assert((Chessboard != NULL) && (ln & 0));
if((XS &ln) && (YS&ln)
//起点坐标在棋盘内
&& (XS &=0) && (YS &=0)
&& (dx != 0 || dy != 0))
//坐标增量不为同时0
if (((XS + dx * 4) & ln) || ((XS + dx * 4)&0) || //判断终点坐标
((YS + dy * 4)&ln) || ((YS + dy * 4) & 0) || //在棋盘外
('\t' == Chessboard[XS][YS]))
//不在棋盘内,或者起点是没下子
int i = 0;
for (i = 1; i & 5; ++i){
if (Chessboard[XS][YS] != Chessboard[XS + (dx * i)][YS + (dy * i)])
//如果不是连续5个一样的
}//end if3
}//end for1
//五个都一样,且都在棋盘内
}//end if 2
//其他情况
//裁判函数
//Chessboard 棋盘数组,ln=棋盘宽度
//赢了返回1,否则返回0
int judga(char Chessboard[][7], int ln)
assert((NULL != Chessboard) && (ln&0));
int i = 0, j = 0;
//纵向成五子连线判断
for (i = 0; i&(ln - 4); ++i){
for (j = 0; j& ++j){
if (judga_line(Chessboard, ln, i, j, 1, 0)){
}//end for_j
}//end for_i
//横向成五子连线判断
for (i = 0; i& ++i){
for (j = 0; j&(ln - 4); ++j){
if (judga_line(Chessboard, ln, i, j, 0, 1)){
}//end for_j
}//end for_i
//左上到右下成五子连线判断
for (i = 0; i&(ln - 4); ++i){
for (j = 0; j&(ln - 4); ++j){
if (judga_line(Chessboard, ln, i, j, 1, 1)){
}//end for_j
}//end for_i
//左下到右上成五子连线判断
for (i = ln-1; i&(ln-4); --i){
for (j = 0; j &(ln - 4); ++j){
if (judga_line(Chessboard, ln, i, j, -1, 1)){
}//end for_j
}//end for_i
int main()
char CB[7][7];
char nameA[50] = "玩家A";
char nameB[50] = "玩家B";
int x = -1, y = -1;
init_Chessboard(CB, 7);
printf("请输入玩家A的名字:");
scanf("%s", nameA);
printf("请输入玩家B的名字:");
scanf("%s", nameB);
//显示棋盘
show_Chessboard(CB, 7);
while (1){
//判断是否棋盘已满
if (full_Chess(CB, 7)){
puts("\n棋盘已满,下次再战!");
//跳出最外层while
//玩家A下子
while (1){
printf("\n请玩家 %s 下子 @\n", nameA);
printf("棋子行坐标X=");
scanf("%d", &x);
printf("棋子列坐标Y=");
scanf("%d", &y);
if (play(CB, 7, x, y, '@')){
//@ ascii=64
//下子成功
puts("下子失败,请重新选定位置下子");
//下子不成功,重新下子
}//end while A
//显示棋盘
show_Chessboard(CB, 7);
//判断玩家A是否胜利
if (judga(CB, 7)){
printf("\n恭喜玩家 %s 成功取得胜利!!鲜花\n", nameA);
getchar();
getchar();
//跳出最外层while
}//不用下了
//玩家B下子
while (1){
printf("\n请玩家 %s 下子 O\n", nameB);
printf("棋子行坐标X=");
scanf("%d", &x);
printf("棋子列坐标Y=");
scanf("%d", &y);
if ((play(CB, 7, x, y, 'O'))){ //O ascii=79
//下子成功
puts("下子失败,请重新选定位置下子");
//下子不成功,重新下子
}//end while B
//显示棋盘
show_Chessboard(CB, 7);
//判断玩家B是否胜利
if (judga(CB, 7)){
printf("\n恭喜玩家 %s 成功取得胜利!! 鲜花\n", nameA);
getchar();
getchar();
//跳出最外层while
}//不用下了
以上所述就是本文的全部内容了,希望大家能够喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具9650人阅读
现在已经大2了 ,学校的实训课要我们编写一个五子棋游戏 ,虽然过程艰辛。但还是很有成就感的,一下是我的感悟
用C语言编写的五子棋游戏
这个五子棋游戏是站长刚学C语言两个月时所写!!
C语言制作五子棋
五子棋游戏是一个深受人们喜爱的游戏,通常是人机对弈,本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连。按键盘上的方向键可以移动光标,回车键可以摆放棋子。
一、 设计目的
这个程序是对编程基本功的一个训练,将分支、循环、数组、函数综合应用,而不仅限于编制独立的小程序,通过游戏过程增加编程的兴趣,提高编程水平。编制该程序我对以下的知识点进行的巩固和掌握:1.数组元素为结构体的数组应用。2.全局变量应用。3.按键的处理。4.数组元素与蛇、食物的对应关系。5.图形方式等等。虽然该程序是一个普通而又简单的程序,但是对于一C语言初级阶段的学生来说,是一个很好的锻炼甚至可以说是一个很好的提高。
二、 设计思路
棋盘设计为19&19格,初始状态光标在棋盘的中央,白棋先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。当游戏一方胜利后显示胜利信息,提示信息利用汉字点阵输出。
从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手1用Up、Down、Left、Right控制光标移动,回车键表示落子。棋手2用W、S、A、D控制光标移动,空格键表示落子。一旦接收到回车键或空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。如果想退出游戏,可以按Esc键。
三、程序设计
1.定义全局变量int gamespeed=5000;
struct Sor
/*x,y表示当前光标的位置*/
int yes[N][N];/* 0表示无棋子,1表示白色棋子,2表示黑色棋子*/
/* 1表示白棋准备落子,2表示黑棋落子*/
/*1表示白棋胜出,2表示黑棋胜出*/
2.Main()主函数
按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组yes[20][20],初值为0,表示空格。函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。
3.drawqp()画棋盘函数
背景颜色设为黑色,从坐标(100,100)开始每隔20个单位用绿色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle()可以设置填充模式和填充颜色,fillellipse(int x,int xradius,int yradius)以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。
4.win()判断是否胜出函数
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:红方获胜),否则继续落子。
5.Gameplay()双人对战函数
这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:
(1) 按Esc键程序可以随时结束。
(2) 按上下左右光标键,则改变棋子移动的坐标值。
(3) 按回车键后判断:
1) 如落子的位置已经有棋则无效,继续按键。
2) 如落子位置是空格,可以将棋子落入格内,调用win()函数。
3) 如果棋子变化后,棋盘已下满了棋子,则游戏结束。显示平局信息。
(4) 重复上述步骤,直到游戏结束。
6.Xandy()显示光标纵横坐标函数
该函数的作用是在每次移动光标后,在屏幕左下角显示出光标的纵横坐标。
7.图形功能函数
以下函数原形都在graphics.h中。
(1)registerbgidriver():
(2)initgraph(int *driver, int *mode, char *path):用于初始化图形系统,并装入相应的图形驱动器。该函数把由driver所指向的图形驱动器代码装入内存。如果图形驱动器未装入内存,图形函数将不能操作。图形函数所用的屏显模式由mode所指向的整数值确定。最后,图形驱动器的路径是由path所指向的字符串给出。如果没有指定路径,就在当前工作路径上寻找。
(3)rectangle(int left,int top,int right,int bottom):函数rectangle()用当前画出由坐标left,top及right,bottom所定义的矩形。
(4)setcolor(int color):把当前画线颜色设置为color所指定的颜色。每个图形显示卡的有效颜色由setpalette()提供。
(5)closegraph():该函数使图形状态失效,并且释放用于保存图形驱动器和字体的系统内存。当你的程序既用到图形输出又用到非图形输出时,应该用此函数。该函数还把系统屏显模式返回到调用initgragh()前的状态。
通过编制该程序我对以下的知识点进行的巩固和掌握:
1.数组元素为结构体的数组应用。
2.全局变量应用。3.按键的处理。4.图形方式等等。虽然该程序是一个普通而又简单的程序,但是对于一C语言初级阶段的学生来说,是一个很好的锻炼甚至可以说是一个很好的提高。由于个人能力的限制该程序还有许多的缺陷,若要进一步的完善还需要对C语言更深一步的学习。
程序运行部分截图:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:106018次
积分:2383
积分:2383
排名:第17178名
原创:88篇
评论:74条
(3)(4)(2)(3)(2)(4)(1)(1)(4)(9)(7)(1)(5)(3)(3)(1)(2)(2)(4)(1)(1)(1)(1)(5)(13)(5)请教关于一个纯c语言编写的五子棋游戏的问题 - c狼 - 博客园
随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
本人是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] )/*初始化棋盘,置棋盘上无任何棋子*/
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] )/*输出棋局,或者说画棋盘*/
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 );
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,
for( i=0; i & N; i++ )
for( k=0; k & N-4; k++ )
for( j=k; j & k+5; j++ )/* algorithm error: "j & k+5;" not "j & j+5;" */
if( a[i][j] == chess_symbol )/* "-"形呈龙 */
if( a[j][i] == chess_symbol )/* "|"形呈龙 */
if( l == 5 || r == 5 )/*连续的5个棋子在一条直线上时,游戏结束*/
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 )
int Game_Over3( int (*a)[N] , int chess_symbol )/* "/"形呈龙 */
int i, j, k, m, LeftUp, RightD
for( m=N-1; m &= 4; m-- )
for( k=0; k & m + 1 - 4; k++ )
RightDown=LeftUp=0;
for( i=k , j= m - i & k+5; i++ , j-- )
if( a[i][j] == chess_symbol )/* 对角线"/"上及其左上方的"/"形呈龙 */
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了
int Save_Chess( int (*a)[N] , char* ss )/*保存棋局*/
if( strcmp( ss , "save" ) == 0 )/*保存当前未结束的棋局*/
if( ( fp = fopen( "Save.sav" , "w" ) ) == NULL )
printf(" Can't open file \"Save.sav\" !\n");
printf("当前棋局已经成功保存到存档文件\"Save.sav\"中!\n");
else /*保存棋局终局*/
if( ( fp = fopen( "Ending.txt" , "a" ) ) == NULL )
printf(" Can't open file \"Ending.txt\" !\n");
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);
int Save_Options( )/*保存游戏设定*/
if( ( fp = fopen( "Config.ini" , "w" ) ) == NULL )
printf("Can't open file \"Config.ini\" !\n");
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");
int Load_Chess( int (*a)[N] )/*读取棋局*/
int j , k , X_Number =0 , O_Number = 0 ;
double i = - 1.5;
if( ( fp = fopen ( "Save.sav" , "r" ) ) == NULL )/*检测存档文件"Save.sav"是否在当前目录下*/
Init_Chess( a );/*先初始化棋盘*/
c = fgetc(fp);
while( c != EOF )
if( c == 'X' )
X_Number++;
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' )
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);
fclose(fp);
return X_Number & O_Number ? 2 : 1;/*返回读档后的优先下棋的玩家*/
int Load_Options( )/*读取游戏设定*/
short Option_Value[10] = { 0 } , i = 0 ;
if( ( fp = fopen( "Config.ini" , "r" ) ) == NULL )/*检测配置文件"Config.ini"是否在当前目录下*/
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;
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];
}int Game_Options( )/*游戏设定*/
HANDLE setcolor=GetStdHandle(STD_OUTPUT_HANDLE);
char s[10];
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 )
system("cls");
for( i=1 ; i & 16 ; i++ )
SetColor( i );
printf( "%d是当前其显示的颜色的属性值!\n" , i );
printf("请输入行序号颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
LineNo_Color =
printf("已成功设定行序号的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入列序号颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
RowNo_Color =
printf("已成功设定列序号的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入棋局格线(棋盘)颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
Check_Color =
printf("已成功设定棋局格线(棋盘)的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入玩家1的棋子(棋子符号'X')颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
printf("已成功设定玩家1的棋子的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入玩家2的棋子(棋子符号'O')颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
printf("已成功设定玩家2的棋子的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入游戏主菜单Game_Menu的颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
Menu_Color =
printf("已成功设定游戏主菜单Game_Menu的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入游戏设定菜单Game_Options的颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
Game_Options_Color =
printf("已成功设定游戏设定菜单Game_Options的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入\"关于游戏\"的颜色的属性值(1-15):");
scanf("%s",s);
temp = String_to_Int( s , 15 );
if( temp & 0 )
Help_Color =
printf("已成功设定\"关于游戏\"的颜色!\n");
printf("非法的颜色属性值!\n");
printf("请输入\"yes\"(不含引号\",下同)开启游戏提示音或输入\"no\"关闭游戏提示音:");
scanf("%s",s);
if( strcmp( s , "yes" ) == 0 )
Open_Sound = 1 ;
printf("游戏提示音已开启!\n");
if( strcmp( s , "no" ) == 0 )
Open_Sound = 0 ;
printf("游戏提示音已关闭!\n");
printf("对不起,输入错误!\n");
printf("请输入\"yes\"开启棋局终局自动保存或输入\"no\"关闭自动保存:");
scanf("%s",s);
if( strcmp( s , "yes" ) == 0 )
Auto_Save_Ending = 1 ;
printf("棋局终局自动保存已开启!\n");
if( strcmp( s , "no" ) == 0 )
Auto_Save_Ending = 0 ;
printf("棋局终局自动保存已关闭!\n");
printf("对不起,输入错误!\n");
Save_Options( );
temp = Load_Options( );/*读取配置文件"Config.ini"中的游戏设定,并检查配置文件数据是否合法*/
if( temp == 0 )
printf("对不起,无法打开配置文件\"Config.ini\"!\n请确保配置文件\"Config.ini\"在当前文件夹下.\n");
if( temp == -1 )
printf("对不起,无法加载配置文件\"Config.ini\"!因为文件中存在非法数据.\n");
if( temp = 1 )
printf("已经成功读取配置文件\"Config.ini\"中的游戏设定!\n");
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");
printf("对不起,输入错误! 请在游戏设定菜单Game_Options中重新输入.\n");
SetColor( Game_Options_Color );
printf("按任意键返回游戏设定菜单Game_Options.");
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按任一键跳至下一页");
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按任一键跳至下一页");
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按任一键跳至下一页");
system("cls");
printf("3.游戏说明:\n\n(1)启动游戏后请将游戏窗口最大化并将右侧的滚动条滑至最上端以获得最佳的游戏显示效果;\n\n");
printf("(2)这是我编的第一个成型游戏,由于本人水平有限,所以游戏界面只能做到如此程度了,甚是简陋,请各位玩家见谅;\n\n");
printf("(3)此游戏可以免费传播,但请不要修改游戏程序本身,不得用于商业用途;(*^+^*)\n\n");
printf("(4)游戏中遇到任何问题请和黎喜裕(QQ:)联系,欢迎各位玩家提出宝贵的意见,同时也希望各位玩家继续关注");
printf("黎喜裕的其他作品并支持我;\n\n最后祝各位玩家玩得愉快!\n\n\\&^+^&/\n\n4/4\n");
}int main()
int a[N][N], i, j, player = 1 ,/*玩家1先下棋*/
char s[10];
HANDLE setcolor=GetStdHandle(STD_OUTPUT_HANDLE);
Init_Chess( a );/*初始化棋局*/
Load_Options( );/*加载配置文件"Config.ini"中的游戏设定,如果配置文件不在当前目录下,则游戏设定为默认值*/
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 )
Init_Chess( a );
player = 1;
system("cls");
Print_Chess( a );/*输出即时棋局*/
SetColor( Menu_Color );
printf("玩家%d(棋子符号:'" , player );/*游戏玩家下棋提示*/
if( player == 1 )
SetColor( X_Color );
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" );
if( strcmp( s , "exit" ) == 0 )/*输入"exit"暂停游戏并返回游戏主菜单GAME_MENU*/
i = String_to_Int( s , N );/* 显然, i &= N */
if( i & 1 )/*检测输入的数据是否合法*/
if( Open_Sound )/*游戏提示音*/
printf("\a");
printf("对不起,输入错误! 请按任意键返回后重新输入棋子位置.");/*输入错误提示*/
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("对不起,输入错误! 请按任意键返回后重新输入棋子位置.");
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" );
player=2;/*轮到玩家2下棋了*/
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" );
player=1;/*轮到玩家1下棋了*/
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" );
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" );
}/*检测棋局是否还有进行下去的必要*/
/*继续当前棋局*/
temp = Load_Chess( a );
if( temp == 0 )
printf("无法打开存档文件\"Save.sav\"!\n请确保存档文件\"Save.sav\"在当前文件夹下.\n");
if( temp == -1 )
printf("非法的棋局存档文件!\n");
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" );/*保存棋局终局*/
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" );
}/*检测棋局是否还有进行下去的必要*/
player=/*继续存档中的棋局*/
Game_Options( );/*游戏设定*/
About_Game( );/*关于游戏*/
SetColor( 11 );
printf("感谢你的试玩,请继续关注我们的其他作品.\n");
SetColor(Menu_Color);
printf("按任意键退出游戏.");
printf("对不起,输入错误! 请在游戏主菜单GAME_MENU中重新输入.\n");/*错误提示*/
SetColor( Menu_Color );
printf("按任意键返回游戏主菜单GAME_MENU.");
& & & & & & & & & & & & & & & & & & & & & & & & & & & &
界面比较简陋
只能通过输入数字控制坐标来实现,而老师的要求是:五子棋:人机对弈和二人对弈,系统判断输赢和禁手,
具有计时记分功能,保留最高分纪录,支持鼠标和键盘操作,能悔棋一步。
因为我们是非计算机专业,平时也不多接触代码的一门学科,因为在这里提出一个菜鸟的问题:
在这种情况下,通过怎么样的修改代码来实现鼠标和键盘的操作?
希望各位们大虾能给点意见,谢谢}

我要回帖

更多关于 c语言五子棋课程设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信