c语言设计的鼠标操作五子棋源代码。
# 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();
}
}