部分效果图:
- 总体设计
这里我将叙述一个大概的设计过程。
玩家一使用的棋子是’*’ 玩家二以及电脑使用的棋子是’#’。这两个字符只是方便做相关操作。
实际显示时,我将玩家一显示为白棋子,玩家二显示为黑棋子。而不是直接把’*’和’#’显示给用户。
棋盘用的是二维数组。
一盘游戏几乎所有操作都是在这个二维数组上面实现。主要功能有:游戏背景音乐,实时棋盘的更新,棋子的移动,判断胜负,胜负播报音乐,电脑实现智能化落子。
本程序分为两大部分,一部分是人机对战,另一部分是人人对战。人人对战就不说了。人机对战让电脑实现了一定的智能化,主要算法是Ai()函数。
以下是各个功能函数的简要概述。
int isWin();//判定胜负
void Ai6();//电脑随机放子
void Ai5();//阻止玩家冲三
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void load();//初始界面
void printS();//打印棋盘
void newgame();//游戏主体
void gamer();//双人对战
void movedown(int *x,int *y,int ret);//向上
void moveup(int *x,int *y,int ret);//向下
void moveright(int *x,int *y,int ret);//向右
void moveleft(int *x,int *y,int ret);//向左
void move();//人机模式移动
void move1();//双人对战 玩家一
void move2(); //双人对战 玩家二
void end(int flag);//结束界面
2. 算法设计
主要算法函数:电脑智能下棋。
使用了函数嵌套,
优先级:
Ai1() ->Ai2() ->Ai3() ->Ai4() ->Ai5() ->Ai6()
阻止玩家冲五->让电脑实现冲五->阻止玩家冲四->电脑实现冲四->阻止玩家冲三->随机放子
函数说明:
阻止玩家冲五:通过遍历棋盘(用两个for循环),得到玩家的棋子位置,判断它的棋子里面是否有连四的情况出现,如果有就进行防守。其它防守函数同理。电脑实现冲五则是通过遍历棋盘上自己的棋子,如果有连四的情况,那么就补上最后一个棋子完成胜局。其它进攻函数同理。
怎样实现优先级?通过函数嵌套,把Ai1()(阻止玩家冲五)作为第一个返回函数,如果能找到相应的位置(成功防守)那么就返回该位置,否则继续进行下一个判断也就是Ai2()(让自己实现冲五),以此类推。
void Ai6();//电脑随机放子
void Ai5();//阻止玩家冲三
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void Ai1()//阻止玩家冲五
以下是Ai1()的示例:
void Ai1()
{
int i,j;
/*遍历棋盘,找出玩家的棋子是否有连四的情况,四种连四情况都得查找,即
横/纵/左上斜/右下斜*/
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return; //如果找到该位置那么把棋子放好之后直接return
}
if(game[i][j+4]=='.'){
game[i][j+4]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+4][j]=='.'){
game[i+4][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+4][j+4]=='.'){
game[i+4][j+4]='#';return;
}
}
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-4][j+4]=='.'){
game[i-4][j+4]='#';return;
}
}
}
Ai2();//如果没找到那么进入下一个函数
return;
}
个人总结
首先对我的编程思维的提升是巨大的,在此之前我从未尝试过去敲一个几百行的代码,甚至在写这个程序的前期(未修改完善之前)一度达到了上千行。写这种工程量稍大的程序项目,令我不敢太马虎应对,因为如果出现bug,那修复Bug 的工作量也是比较恐怖的。所以我在写的时候打了不少的草稿。一开始这个程序的下棋方式是输入坐标进行棋子的定位。但是自己试玩的时候发现这样的方式极不方便,密密麻麻的棋盘线条看着眼睛也很不舒服,下棋的时候很容易出现落下的棋子位置跟自己的意愿不一样的情况。用户体验感极差。于是我就想能不能改成用方向键去移动棋子。这样移动比较直观,也不会出现下错位置的尴尬情况。但是通过方向键去移动棋子,画面就应该实时刷新。不然移动的跨度大了,用户界面上会出现很多个棋盘。所以我又去网上搜索刷新界面的方法。又查到了一个清屏的命令。“system(“cls”)”.这样,我就能够实现棋子的移动并且实时更新画面了。我写完这个程序之后又去学习了一点图形编程,安装了相关的软件。并且又写出了一个小小的图形游戏。总的来说,就是这种自主查阅能力提升了,编程思维也提升了。深刻体会到程序中把若干功能分成各个功能函数的重要性。既美观,排查bug也方便。
不足之处:应该把这个棋盘写成图形界面的,这样会更好看。
以下是完整代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
int FLAG=1;
char game[21][21];//棋盘矩阵
int isWin();//判定胜负
void Ai6();
void Ai5();//电脑随机放子
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void load();//初始界面
void printS();//打印棋盘
void newgame();//游戏主体
void gamer();//双人对战
void movedown(int *x,int *y,int ret);//向上
void moveup(int *x,int *y,int ret);//向下
void moveright(int *x,int *y,int ret);//向右
void moveleft(int *x,int *y,int ret);//向左
void move();//人机模式移动
void move1();//双人对战 玩家一
void move2(); //双人对战 玩家二
void end(int flag);//结束界面
int main()
{
while(FLAG)
{
load();//游戏入口
}
return 0;
}
void movedown(int *x,int *y,int ret)
{
/*这里将棋盘返回之前状态*/
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
game[*x][*y]='.';
*x+=1;
if(*x>=19||*x<=0)return;
if(game[*x][*y]!='.'){
*x+=1;
return;
}
system("cls");
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
{
if(ret==1)game[*x][*y]='O';
if(ret==2)game[*x][*y]='Q';
}
printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
return;
}
void moveup(int *x,int *y,int ret)
{
/*这里将棋盘返回之前状态*/
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
game[*x][*y]='.';
*x-=1;
if(*x>=19||*x<=0)return;
if(game[*x][*y]!='.'){
*x-=1;
return;
}
system("cls");
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
{
if(ret==1)game[*x][*y]='O';
if(ret==2)game[*x][*y]='Q';
}
printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
return;
}
void moveright(int *x,int *y,int ret)
{
/*这里将棋盘返回之前状态*/
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
game[*x][*y]='.';
*y+=1;
if(*x>=19||*x<=0)return;
if(game[*x][*y]!='.'){
*y+=1;
return;
}
system("cls");
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
{
if(ret==1)game[*x][*y]='O';
if(ret==2)game[*x][*y]='Q';
}
printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
return;
}
void moveleft(int *x,int *y,int ret)
{
/*这里将棋盘返回之前状态*/
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
game[*x][*y]='.';
*y-=1;
if(*x>=19||*x<=0)return;
if(game[*x][*y]!='.'){
*y-=1;
return;
}
system("cls");
if(game[*x][*y]!='*'&&game[*x][*y]!='#')
{
if(ret==1)game[*x][*y]='O';
if(ret==2)game[*x][*y]='Q';
}
printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
return;
}
void move()
{
int x=1,y=1;
char ret;
int shift=1;
while(shift)
{
ret=getch();
switch(ret)
{
case 72: moveup(&x,&y,1);break;
case 80: movedown(&x,&y,1);break;
case 75: moveleft(&x,&y,1);break;
case 77: moveright(&x,&y,1);break;
case 's':movedown(&x,&y,1);break;
case 'S':movedown(&x,&y,1);break;
case 'W':moveup(&x,&y,1);break;
case 'w':moveup(&x,&y,1);break;
case 'a':moveleft(&x,&y,1);break;
case 'A':moveleft(&x,&y,1);break;
case 'd':moveright(&x,&y,1);break;
case 'D':moveright(&x,&y,1);break;
case ' ':
game[x][y]='*';
system("cls");
printS();
shift=0;
break;
}
}
return;
}
void move1()
{
int x=1,y=1;
char ret;
int shift=1;
while(shift)
{
ret=getch();
switch(ret)
{
case 's':movedown(&x,&y,1);break;
case 'S':movedown(&x,&y,1);break;
case 'W':moveup(&x,&y,1);break;
case 'w':moveup(&x,&y,1);break;
case 'a':moveleft(&x,&y,1);break;
case 'A':moveleft(&x,&y,1);break;
case 'd':moveright(&x,&y,1);break;
case 'D':moveright(&x,&y,1);break;
case ' ':
game[x][y]='*';
system("cls");
printS();
shift=0;
break;
}
}
return;
}
void move2()
{
int x=1,y=1;
char ret;
int shift=1;
while(shift)
{
ret=getch();
switch(ret)
{
case 72: moveup(&x,&y,2);break;
case 80: movedown(&x,&y,2);break;
case 75: moveleft(&x,&y,2);break;
case 77: moveright(&x,&y,2);break;
case ' ':
game[x][y]='#';
system("cls");
printS();
shift=0;
break;
}
}
return;
}
int isWin()//判定胜负
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='*')return 1;//横向赢
if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='*') return 1;//纵向赢
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='*') return 1; //从左上到右下
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='*') return 1;//从右上到左下
/*相同的条件,判定电脑胜利*/
if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='#')return 2;//横向
if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='#') return 2;//纵向
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='#')return 2;//斜向1
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='#') return 2;//斜向2
}
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='.')
return -1;//比赛继续
}
return 0;//平局即是棋盘上没有.了
}
void Ai6()//电脑随机放子
{
int i,j;
srand(time(NULL)*10);
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='#')
{
if(game[i+1][j]=='.'){
game[i+1][j]='#';return;
}
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i][j+1]=='.')
{
game[i][j+1]='#';return;
}
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
}
}
while(game[i][j]!='.')
{
i=rand()%19+1;
j=rand()%19+1;
}
game[i][j]='#';
return;
}
void Ai5()//阻止玩家冲三
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='*'&&game[i][j+1]=='*')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
if(game[i][j+2]=='.'){
game[i][j+2]='#';return;
}
}
if(game[i][j]=='*'&&game[i+1][j]=='*') //纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+2][j]=='.'){
game[i+2][j]='#';return;
}
}
if(game[i][j]=='*'&&game[i+1][j+1]=='*')//斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+2][j+2]=='.'){
game[i+2][j+2]='#';return;
}
}
if(game[i][j]=='*'&&game[i-1][j+1]=='*') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-2][j+2]=='.'){
game[i-2][j+2]='#';return;
}
}
}
Ai6();
return;
}
void Ai4()//电脑实现冲四
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
if(game[i][j+3]=='.'){
game[i][j+3]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='#') //纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+3][j]=='.'){
game[i+3][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='#') //斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+3][j+3]=='.'){
game[i+3][j+3]='#';return;
}
}
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='#') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-3][j+3]=='.'){
game[i-3][j+3]='#';return;
}
}
}
Ai5();
return;
}
void Ai3()//阻止玩家冲四
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
if(game[i][j+3]=='.'){
game[i][j+3]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='*') //纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+3][j]=='.'){
game[i+3][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='*')//斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+3][j+3]=='.'){
game[i+3][j+3]='#';return;
}
}
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='*') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-3][j+3]=='.'){
game[i-3][j+3]='#';return;
}
}
}
Ai4();
return;
}
void Ai2()//让电脑实现冲五
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#'&&game[i][j+3]=='#')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
if(game[i][j+4]=='.'){
game[i][j+4]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='#') //纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+4][j]=='.'){
game[i+4][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='#') //斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+4][j+4]=='.'){
game[i+4][j+4]='#';return;
}
}
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='#') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-4][j+4]=='.'){
game[i-4][j+4]='#';return;
}
}
}
Ai3();
return;
}
void Ai1()//阻止玩家冲五
{
int i,j;
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return;
}
if(game[i][j+4]=='.'){
game[i][j+4]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+4][j]=='.'){
game[i+4][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1
{
if(game[i-1][j-1]=='.'){
game[i-1][j-1]='#';return;
}
if(game[i+4][j+4]=='.'){
game[i+4][j+4]='#';return;
}
}
if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2
{
if(game[i+1][j-1]=='.'){
game[i+1][j-1]='#';return;
}
if(game[i-4][j+4]=='.'){
game[i-4][j+4]='#';return;
}
}
}
Ai2();
return;
}
void load()//初始界面
{
int i,j;
char ret;
for(i=0;i<17;i++){
for(j=0;j<34;j++)
{
if(i!=8)printf("**");
else
{
printf("\n <<<欢迎进入五子棋游戏>>>\n");
printf(" <<<输入【1】开始人机游戏>>>\n");
printf(" <<<输入【2】开始双人对战模式>>>\n <<<输入【ESC】退出游戏>>>\n");
printf(" <<<祝你玩得开心>>>\n");
system("color 70");
break;
}
}
printf("\n");
}
ret=getch();puts("\a");
switch(ret)
{
case '1':system("cls");newgame(); break;
case '2':system("cls");gamer(); break;
case 27:FLAG=0;return;break;
}
return;
}
void printS()//打印棋盘
{
int i,j;
for(i=0;i<21;i++)
for(j=0;j<21;j++)
{
if(i==0&&j==0)printf(" 0");
if((i==0&&j!=0&&j!=20)||(i==20&&j!=0&&j!=20))printf(" %2d",j);
if(j==0&&i!=0)printf("%2d",i);
if(i!=0&&j!=0)
{
if(game[i][j]=='.'||game[i][j]=='O'||game[i][j]=='Q')
printf("_%c|",game[i][j]);
else
{
if(game[i][j]=='*')
printf("_Ο");
else if(game[i][j]=='#')
printf("_●");
}
}
if(j==19&&i!=20&&i!=0)printf("_%2d",i);
if(j==20)printf("\n");
}
}
void newgame()//游戏主体
{
PlaySound(TEXT("song.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐
int i,j,x=1,y=1,flag,cnt=0;
char tip,ret;
srand(time(NULL));
for(i=0;i<20;i++)
for(j=0;j<20;j++)
game[i][j]='.';
printf("开始游戏之前,请选择你想先手还是想后手\n输入【1】你先手,输入【2】你后手,【ESC】返回");
tip=getch();puts("\a");
if(tip==27){
load(); return;
}
if(tip=='1')//玩家先手
{
while(1){
system("cls");printS();
printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");
move();
flag=isWin();
if(flag==1||flag==0||flag==2)end(flag);
else
Ai1();//还未分出胜负 电脑落子:智能化
system("cls");printS();
flag=isWin(); //判定胜负,否则一直循环下棋
if(flag==1||flag==0||flag==2){
end(flag); break;
}
}
}
else if(tip=='2')//玩家后手
{
while(1){
Ai1();
system("cls");system("cls");printS();
flag=isWin();
if(flag==1||flag==0||flag==2)end(flag);
printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");
move();
flag=isWin();
if(flag==1||flag==0||flag==2){
end(flag); break;
}
}
}
}
void gamer()
{
PlaySound(TEXT("song2.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐
int i,j,x=1,y=1,flag,cnt=0;
char tip,ret;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
game[i][j]='.';
printf("始游戏之前,请选择:\n输入【1】玩家一先手\n输入【2】玩家二先手\n【ESC】返回");
tip=getch();puts("\a");
if(tip==27){
load();return;
}
if(tip=='1')//玩家一先手
{
while(1){
system("cls");printS();
printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
move1();
flag=isWin();
if(flag==1||flag==0||flag==2)end(flag);
else
{
printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
move2();
}
system("cls");printS();
flag=isWin(); //判定胜负,否则一直循环下棋
if(flag==1||flag==0||flag==2){
end(flag);break;;
}
}
}
else if(tip=='2')//玩家二先手
{
while(1){
printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
move2();system("cls");printS();
flag=isWin();
if(flag==1||flag==0||flag==2)end(flag);
printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
move1();
flag=isWin();
if(flag==1||flag==0||flag==2){
end(flag); break;
}
}
}
return;
}
void end(int flag)
{
switch(flag)
{
case 1:
system("cls");
printf("************WINNER**************\n");
printf("************你赢啦*************\n");
printf("*************666*****************\n");
PlaySound(TEXT("win.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐
system("pause");
load();
break;
case 2:
system("cls");
printf("************LOSER**************\n");
printf("************你输啦*************\n");
printf("*************菜鸡*****************\n");
PlaySound(TEXT("lose.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐
system("pause");
load();
break;
case 0:
system("cls");
printf("************PEACE**************\n");
printf("************平局*************\n");
printf("******************************\n");
PlaySound(TEXT("peace.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐
system("pause");
load();
break;
}
}