c语言设计的鼠标操作五子棋源代码。

# include & ltstdlib.h & gt

# include & ltstdio.h & gt

# include & ltconio.h & gt

# include & ltstring.h & gt

#define MAXIMUS 15 //定义棋盘的大小。

int p[MAXIMUS][MAXIMUS];//存储游戏信息

char buff[MAXIMUS * 2+1][MAXIMUS * 4+3];//输出缓冲器

int Cx,Cy;//当前光标位置

int Now//当前玩家,1代表黑,2代表白。

int wl,WP;//当前写入缓冲区的列数和行数。

char * showText//显示在棋盘中央的文本信息

int计数;//回合数

Char * copy (char * strtest,const char * strrc)//修改字符串复制函数,忽略末尾的\0。

{

char * strDestCopy = strDest

while(* strrc!='\0')

{

* strdest++ = * str src++;

}

返回strDestCopy

}

Void Initialize()//初始化游戏函数

{

int i,j;//循环变量

showText =//重置显示信息

count = 0;//回合数归零

for(I = 0;我& lt马克西姆斯;I++)//重置游戏数据

{

for(j = 0;j & lt马克西姆斯;j++)

{

p[I][j]= 0;

}

}

CX = Cy = MAXIMUS/2;//将光标重置到中心

现在= 1;//重置当前黑边。

}

Char* getStyle(int i,int j)//获取棋盘中指定坐标交点位置的字符,通过tab拼成棋盘。

{

If(p[i][j]==1)//1是黑子。

返回“●”;

Else if(p[i][j]==2)//2是白子。

回车“○”;

else if(I = = 0 & amp;& ampJ==0)//以下是边缘棋盘样式。

返回“┏”;

else if(I = = MAXIMUS-1 & amp;& ampj==0)

返回“┓”;

else if(I = = MAXIMUS-1 & amp;& ampj==MAXIMUS-1)

返回“┛”;

else if(I = = 0 & amp;& ampj==MAXIMUS-1)

返回“┗”;

else if(i==0)

返回“┠”;

else if(i==MAXIMUS-1)

返回“┨”;

else if(j==0)

返回“┯”;

else if(j==MAXIMUS-1)

返回“┷”;

返回“┼”;//中间的空格

}

Char* getCurse(int i,int j){//获取指定坐标交点处左上网格的样式,通过tab模拟光标的显示。

if(i==Cx){

if(j==Cy)

返回“┏”;

else if (j==Cy+1)

返回“┗”;

}

else if(i==Cx+1)

{

if(j==Cy)

返回“┓”;

else if (j==Cy+1)

返回“┛”;

}

返回“”;//如果不在光标附近,则为空。

}

Void write(char* c)//将字符串写入缓冲区。

{

Copy(buff[wl]+wp,c);

WP+= strlen(c);

}

Void ln()//缓冲区写位置行提升

{

wl+= 1;

WP = 0;

}

Void Display()//将缓冲区的内容输出到屏幕上。

{

int i,l = strlen(show text);//循环变量,中间文本消息的长度。

int Offset = MAXIMUS * 2+2-l/2;//计算中间文本信息显示在中央的横坐标位置。

If(Offset%2==1)//如果位置是奇数,则移到偶数,以免混淆。

{

偏移量-;

}

Copy(buff[MAXIMUS]+Offset,show text);//将中间文本信息复制到缓冲区。

If(l%2==1)//如果中间文本的长度为奇数,则填充空格以避免混淆。

{

*(buff[MAXIMUS]+Offset+l)= 0x 20;

}

系统(“cls”);//清空屏幕,准备写。

for(I = 0;我& ltMAXIMUS * 2+1;I++){//循环写每一行。

printf("%s ",buff[I]);

如果(我& ltMAXIMUS*2)//每行写完后,需要断行。

printf(" \ n ");

}

}

Void Print()//计算整个棋盘并存入缓冲区,然后调用显示函数显示。

{

int i,j;//循环变量

wl = 0;

WP = 0;

for(j = 0;j & lt= MAXIMUSJ++)//写出交集左上角的字符。因为要打印棋盘右下角,所以要横向和纵向多循环一次。

{

for(I = 0;我& lt= MAXIMUSi++)

{

write(getCurse(i,j));//写左上角字符

If(j==0||j==MAXIMUS)//如果国际象棋的上下边缘没有相连的垂直线,则用空格填充该位置。

{

如果(我!=MAXIMUS)

写(" ");

}

Else//如果是在棋盘中间,用竖线上下连接。

{

If(i==0||i==MAXIMUS-1)//左右边缘的垂直线较粗。

write("┃”);

else if(我!=MAXIMUS)//中间垂直线

写(" │");

}

}

If(j==MAXIMUS)//如果是最后一个循环,只需要处理边字符,交点要少一行。

{

打破;

}

ln();//抬起线,开始打印交集内容。

写(" ");//用空格填充位置

for(I = 0;我& lt马克西姆斯;I++)//根据横坐标循环正常时间。

{

write(getStyle(i,j));//写入交集字符

如果(我!=MAXIMUS-1)//如果不在最右边,加一条横线继续绕。

{

if(j==0||j==MAXIMUS-1)

{

写("━");//上下边缘的横线较粗。

}

其他

{

写(“—”);//中间的水平线

}

}

}

ln();//写完后提交一行。

}

显示();//将缓冲区的内容输出到屏幕。

}

Int Put(){//在当前光标位置移动。如果不为空,则返回0表示失败。

if(p[Cx][Cy]==0)

{

p[Cx][Cy]=现在;//更改位置数据

返回1;//返回1表示成功。

}

其他

{

返回0;

}

}

Int Check()//胜败检查,即判断跑者当前位置是否造成了五连珠的情况。

{

int w=1,x=1,y=1,z=1,I;//累计四个方向连续相同棋子的个数,即对错。

for(I = 1;我& lt5;i++)if(Cy+I & lt;马克西姆斯& amp& ampp[Cx][Cy+I]= =现在)w++;else break//向下检查

for(I = 1;我& lt5;i++)if(Cy-I & gt;0 & amp& ampp[Cx][Cy-I]= =现在)w++;else break//检查

如果(w & gt=5)现在返回;//如果达到5,则判定当前玩家为赢家。

for(I = 1;我& lt5;i++)if(Cx+I & lt;马克西姆斯& amp& ampp[Cx+I][Cy]= =现在)x++;else break//向右检查

for(I = 1;我& lt5;i++)if(Cx-I & gt;0 & amp& ampp[Cx-I][Cy]= = Now)x++;else break//向左检查

if(x & gt;=5)现在返回;//如果达到5,则判定当前玩家为赢家。

for(I = 1;我& lt5;i++)if(Cx+I & lt;马克西姆斯& amp& ampcy+I & lt;马克西姆斯& amp& ampp[Cx+I][Cy+I]= = Now)y++;else break//向右下方检查

for(I = 1;我& lt5;i++)if(Cx-I & gt;0 & amp& ampcy-I & gt;0 & amp& ampp[Cx-I][Cy-I]= =现在)y++;else break//向左上方检查

如果(y & gt=5)现在返回;//如果达到5,则判定当前玩家为赢家。

for(I = 1;我& lt5;i++)if(Cx+I & lt;马克西姆斯& amp& ampcy-I & gt;0 & amp& ampp[Cx+I][Cy-I]= = Now)z++;else break//向右上方检查

for(I = 1;我& lt5;i++)if(Cx-I & gt;0 & amp& ampcy+I & lt;马克西姆斯& amp& ampp[Cx-I][Cy+I]= = Now)z++;else break//向左下方检查

if(z & gt;=5)现在返回;//如果达到5,则判定当前玩家为赢家。

返回0;//如果没有检测到五连球,返回0表示还没有玩家赢。

}

Int RunGame()//执行整个游戏并返回赢家信息(虽然有用)。

{

int输入;//输入变量

int victor//获奖者信息

initialize();//初始化游戏

While(1){//开始无限循环,直到跳出一个胜利。

print();//打印棋盘

input = getch();//等待键盘按下一个字符。

If(input==27)//如果是ESC,退出程序。

{

退出(0);

}

Else if(input==0x20)//如果是空格,开始走。

{

If(Put())//如果跑者成功,判断胜负。

{

victor = Check();

现在= 3-现在;//旋转当前玩家。

count++;

If(victor==1)//如果黑方获胜,则显示提示文本并等待一个键返回胜利消息。

{

ShowText= "黑方赢了!";

print();

if(getch()==0xE0)

{

getch();

}

现在返回;

}

Else if(victor==2)//如果白棋获胜,则显示提示文本并等待一个键返回胜利消息。

{

ShowText= "白棋赢了!";

显示();

if(getch()==0xE0)

{

getch();

}

现在返回;

} else If(count = = maximus * maximus)//如果回合数达到棋盘总数,即棋盘已满,则为和局。

{

ShowText= "Tie!";

显示();

if(getch()==0xE0)

{

getch();

}

返回0;

}

}

}

Else if(input==0xE0)//如果方向键被按下,输入将被填充两次。第一次是0xE0,表示控制键被按下。

{

input = getch();//获取第二个输入信息

Switch(input)//确定方向键的方向,移动光标位置。

{

案例0x4B://

CX-;

打破;

案例0x48:

cy-;

打破;

案例0x4D:

cx++;

打破;

案例0x50:

cy++;

打破;

}

if(Cx & lt;0)Cx = MAXIMUS-1;//如果光标位置越界,则移动到对面。

if(Cy & lt;0)Cy = MAXIMUS-1;

if(Cx & gt;MAXIMUS-1)Cx = 0;

if(Cy & gt;MAXIMUS-1)Cy = 0;

}

}

}

Int main()//主函数

{

系统("标题简单五子棋-et staull制作");//设置标题

system("模式控制列=63行=32行");//设置窗口大小

系统("颜色E0 ");//设置颜色

While(1){//循环执行游戏。

RunGame();

}

}