`

两种不同风格写成的五子棋——C++

 
阅读更多
#include <iostream> 
using namespace std; 
void init(char flag[20][20]);//初始化棋盘 
void draw(char flag[20][20]);//划出指定棋盘 
int test(char flag[20][20],char);//判断是否棋局结束 
bool check(int,int);//检查玩家输入坐标是否合法

int main() 
{ 
//设置棋盘大小 ,可以设置成变量 x,y 
char flag[20][20]; 
//初始化数据 
char* lp = (char*)flag; for(int i=0; i <400; i++) *lp++ = '|';

draw(flag);

for(int x =0;x <400;    ) 
{//棋盘上总共能乘放下 x*y 个棋子 
char i,j; 
if(x%4==0) 
{ 
cout < <"请A方走:"; 
//cin>>i; 
//cin>>j; 
scanf("%c %c", &i, &j);getchar(); i-='a'; j-='a';


while(flag[i][j]=='X'||flag[i][j]=='O')//判断输入位置是否有棋子 
{ 
cout < <endl; 
cout < <"此地已经有棋子!请重新走:"; 
cin>>i; 
cin>>j; 
}    
if(check(i,j)==false) 
{ 
cout < <endl; 
cout < <"输入坐标不合法!请重新输入:"; 
cin>>i; 
cin>>j;                  
}                                    
flag[i][j]='X';//指定位置放上棋子 
draw(flag); 
if(test(flag,'X'))//判断是否获胜(A) 
{ 
char replay; 
cout < <"A方胜利!是否再来一局?Y/N:"; 
cin>>replay; 
if (replay=='Y'||replay=='y') 
{ 
main(); 
} else 
{ 
break; 
}                                           

} 
x+=2; 
}else{ 
cout < <"请B方走:"; 
//cin>>i; 
//cin>>j; 
scanf("%c %c", &i, &j);getchar(); i-='a'; j-='a'; 
while(flag[i][j]=='X'||flag[i][j]=='O') 
{ 
cout < <endl; 
cout < <"此地已经有棋子!请重新走:"; 
cin>>i; 
cin>>j; 
} 
if(check(i,j)==false) 
{ 
cout < <endl; 
cout < <"输入坐标不合法!请重新输入:"; 
cin>>i; 
cin>>j;                  
} 
flag[i][j]='O'; 
draw(flag); 
if(test(flag,'O'))//判断是否获胜(B) 
{ 
char replay; 
cout < <"B方胜利!是否再来一局?Y/N:"; 
cin>>replay; 
if (replay=='Y'||replay=='y') 
{ 
main(); 
} else 
{ 
break; 
}                                           

} 
x+=2; 
} 
} 
return 0; 
}


int test(char flag[][20],char f){ 
int mark =0; 
for(int i=0;i <15;i++){ 
for(int j=0;j <15;j++){ 
if(//判断横着,数着,斜着三种成立情况 
(f==flag[i][j]&&f==flag[i+1][j]&&f==flag[i+2][j]&&f==flag[i+3][j]&&f==flag[i+4][j]) 
||(f==flag[i][j]&&f==flag[i][j+1]&&f==flag[i][j+2]&&f==flag[i][j+3]&&f==flag[i][j+4]) 
||(f==flag[i][j]&&f==flag[i+1][j+1]&&f==flag[i+2][j+2]&&f==flag[i+3][j+3]&&f==flag[i+4][j+4])) 
{ 
cout < <endl;      
mark =1;                                                                                                                              
} 
} 
} 
return mark; 
}

void draw(char flag[][20] ){ 
printf("  "); 
for(int i=0; i <20; i++) printf("%c ", 'a'+i); 
printf("\n"); 
for(int i=0;i <20;i++){ 
printf("%c ", 'a'+i); 
for(int j=0;j <20;j++){ 
cout < <"-"; 
cout < <flag[i][j]; 
} 
cout < <endl; 
} 
} 
bool check(int x,int y){ 
if(x>20 || y>20 || x <0 || y <0) 
return false; 
else 
return true; 
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include"iostream"
using namespace std;

int main() 
{
    char weizhi[20][20];//定义二维数组用于保存坐标
    int c,d,x,y,flag=0;//flag作为标记符号
    cout<<"欢迎使用简易的双人对战的五子棋游戏"<<endl<<endl;
    //输出棋盘的形状
    cout<<"五子棋棋盘如下图所示" <<endl;
    cout<<"  ";
    for(int a=1;a<=10;a++)
        cout<<" "<<a<<"";
    cout<<endl;
    for(a=0;a<=9;a++)
    {
        if(a<9)
            cout<<a+1<<"  ";
        else
            cout<<a+1<<" "; 
        for(int b=0;b <=9;b++)
        {
            weizhi[a][b]='-';
            cout<<weizhi[a][b]<<" ";
        }
        cout<<endl;
    }
    while(flag==0)
    {
        if(flag==0)
        {
            cout<<"红方使用符号o,请红方输入您要落子的位置" <<endl;
            cout<<"横坐标:";
            cin>>x;
            cout<<"纵坐标:";
            cin>>y;

            if(weizhi[x-1][y-1]=='o'||weizhi[x-1][y-1]=='*')
            {
                cout<<"对不起,您不可以在这里落子"<<endl;
                continue;
            }//判断是否已经有子了

            weizhi[x-1][y-1]='o';
            cout<<"  ";
            for(a=1;a<=10;a++)
                cout<<" "<<a<<"";
            cout<<endl;
            for(int a=0;a<=9;a++)
            {
                if(a <9)
                    cout<<a+1<<"  ";
                else
                    cout<<a+1<<" ";
                for(int b=0;b<=9;b++)
                    cout<<weizhi[a][b]<<" ";
                cout<<endl;
            }
        }
        if(flag==1||flag==9)
            break;
        for(int e=0;e<=5;e++)
        {
            for(int f=0;f<=5;f++)
            {
                if((weizhi[e][f]=='o')+(weizhi[e][f+1]=='o')+(weizhi[e][f+2]=='o')+(weizhi[e][f+3]=='o')+(weizhi[e][f+4]=='o')==5)
                    flag=1;
                if((weizhi[f][e]=='o')+(weizhi[f+1][e]=='o')+(weizhi[f+2][e]=='o')+(weizhi[f+3][e]=='o')+(weizhi[f+4][e]=='o')==5)
                    flag=1;
                if((weizhi[e][f]=='o')+(weizhi[e+1][f+1]=='o')+(weizhi[e+2][f+2]=='o')+(weizhi[e+3][f+3]=='o')+(weizhi[e+4][f+4]=='o')==5)
                    flag=1;
                if((weizhi[e][f]=='o')+(weizhi[e-1][f-1]=='o')+(weizhi[e-2][f-2]=='o')+(weizhi[e-3][f-3]=='o')+(weizhi[e-4][f-4]=='o')==5)
                    flag=1;
                if(flag==1)
                    break;
                if((weizhi[e][f]=='*')+(weizhi[e][f+1]=='*')+(weizhi[e][f+2]=='*')+(weizhi[e][f+3]=='*')+(weizhi[e][f+4]=='*')==5)
                    flag=9;
                if((weizhi[f][e]=='*')+(weizhi[f+1][e]=='*')+(weizhi[f+2][e]=='*')+(weizhi[f+3][e]=='*')+(weizhi[f+4][e]=='*')==5)
                    flag=9;
                if((weizhi[e][f]=='*')+(weizhi[e+1][f+1]=='*')+(weizhi[e+2][f+2]=='*')+(weizhi[e+3][f+3]=='*')+(weizhi[e+4][f+4]=='*')==5)
                    flag=9;
                if((weizhi[e][f]=='*')+(weizhi[e-1][f-1]=='*')+(weizhi[e-2][f-2]=='*')+(weizhi[e-3][f-3]=='*')+(weizhi[e-4][f-4]=='*')==5)
                    flag=9;
                if(flag==9)
                    break;
            }
        }
        if(flag==0)
        {
        oop:cout<<"黑方使用符号*,请黑方输入您要落子的位置"<<endl;
            cout<<"横坐标:";
            cin>>c;
            cout<<"纵坐标:";
             cin>>d;

            if(weizhi[c-1][d-1]=='o'||weizhi[c-1][d-1]=='*')
            {
                cout<<"对不起,您不可以在这里落子"<<endl;
                goto oop;
            }//判断是否已经有子了

            weizhi[c-1][d-1]='*';
            cout<<"  ";
            for(a=1;a<=10;a++)
                cout<<" "<<a<<"";
            cout<<endl;
            for(int a=0;a<=9;a++)
            {
                if(a<9)
                    cout<<a+1<<"  ";
                else
                    cout<<a+1<<" ";
                for(int b=0;b<=9;b++)
                    cout<<weizhi[a][b]<<" ";
                cout<<endl;
            }
        }
        if(flag==9)
            break;
    }
    if(flag==1)
        cout<<"您输了,红方赢得了比赛"<<endl;
    else
        cout<<"您输了,黑方后走一步,黑方赢得了比赛"<<endl; 
    system("pause"); 
    return 0;
}

check 函数调用也不对吧? 
if只能检查一次输入,如果多次输入错误呢,应该改为while吧 
while(check(i,j)==false) 
{ 
cout < <endl; 
cout < <"输入坐标不合法!请重新输入:"; 
cin>>i; 
cin>>j;                  
}
check函数错误,应改为 
bool check(int x,int y){ 
if(x >= 20 || y >= 20 || x < 0 || y < 0) 
return false; 
else 
return true; 
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics