/* run this program using the console pauser or add your own getch, system("pause") or input loop */ #include #include #include #include #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 count;//回合数 void endg() { system("color f0"); system("cls"); printf("\n ***********\n Game over!\n ***********\n "); system("pause"); exit(0); } char* Copy(char* strDest,const char* strSrc)//修改过的字符串复制函数,会忽略末端的\0 { char* strDestCopy = strDest; while (*strSrc) { *strDest++=*strSrc++; } return strDestCopy; } void Initialize()//初始化一个对局函数 { int i,j;//循环变量 showText="";//重置显示信息 count=0;//回合数归零 for(i=0;i0&&p[Cx][Cy-i]==Now)w++;else break;//向上检查 if(w>=5)return Now;//若果达到5个则判断当前走子玩家为赢家 for(i=1;i<5;i++)if(Cx+i0&&p[Cx-i][Cy]==Now)x++;else break;//向左检查 if(x>=5)return Now;//若果达到5个则判断当前走子玩家为赢家 for(i=1;i<5;i++)if(Cx+i0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;//向左上检查 if(y>=5)return Now;//若果达到5个则判断当前走子玩家为赢家 for(i=1;i<5;i++)if(Cx+i0&&p[Cx+i][Cy-i]==Now)z++;else break;//向右上检查 for(i=1;i<5;i++)if(Cx-i>0&&Cy+i=5)return Now;//若果达到5个则判断当前走子玩家为赢家 return 0;//若没有检查到五连珠,则返回0表示还没有玩家达成胜利 } int RunGame()//进行整个对局,返回赢家信息(虽然有用上) { int input;//输入变量 int victor;//赢家信息 Initialize();//初始化对局 while(1) {//开始无限回合的死循环,直到出现胜利跳出 Print();//打印棋盘 input=getch();//等待键盘按下一个字符 if(input==27)//如果是ESC则退出程序 endg(); else if(input==0x20)//如果是空格则开始走子 { if(Put())//如果走子成功则判断胜负 { victor=Check(); Now=3-Now;//轮换当前走子玩家 count++; if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息 { showText="黑方获得了胜利!"; Print(); if(getch()==0xE0) { getch(); } return Now; } else if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息 { showText="白方获得了胜利!"; Display(); if(getch()==0xE0) { getch(); } return Now; } else if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局 { showText="平局!"; Display(); if(getch()==0xE0) { getch(); } return 0; } } } else if(input==0xE0)//如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键 { input=getch();//获得第二次输入信息 switch(input)//判断方向键方向并移动光标位置 { case 0x4B:// Cx--; break; case 0x48: Cy--; break; case 0x4D: Cx++; break; case 0x50: Cy++; break; } if(Cx<0)Cx=MAXIMUS-1;//如果光标位置越界则移动到对侧 if(Cy<0)Cy=MAXIMUS-1; if(Cx>MAXIMUS-1)Cx=0; if(Cy>MAXIMUS-1)Cy=0; } } } int main()//主函数 { system("cls"); system("title 简易五子棋 ——大卫王制作");//设置标题 system("mode con cols=63 lines=32");//设置窗口大小 system("color 70");//设置颜色 while(1)//循环执行游戏 RunGame(); return 0; }