用c++做五子棋

#include<iostream>
//#include"data.h"
#define N 10//棋盘规格
using namespace std;
static int chessboard[N][N];//棋盘
struct chess{//棋子
    int x,y;
    int color;//0为无子,1为白,-1为黑
};
void init_chessboard()//初始化棋盘函数;
{
    int i,j;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
        {
            chessboard[i][j]=0;
        }
}
bool is_win(struct chess che)//判断胜负函数,ture 未分出胜负,可以继续下棋;false分出胜负
{
    int x,y,num;
    int xmin,xmax,ymin,ymax,min,max;
    //begin判断左右方向
    num=0;
    xmin=(che.y-4>0)?che.y-4:0;//左边界
    xmax=(che.y+4<N-1)?che.y+4:N-1;//右边界
    //cout<<xmin<<"左右"<<xmax<<endl;
    for(y=xmin;y<=xmax;y++)
    {
        if(chessboard[che.x][y]==che.color&&num<5)
        {
            num++;
            //cout<<num<<endl;
            if(num==5)
                return false;
        }
        else
            num=0;
    }
    //end 判断左右方向
    //begin判断上下方向
    num=0;
    ymin=(che.x-4>0)?che.x-4:0;//上边界
    ymax=(che.x+4<N-1)?che.x+4:N-1;//下边界
    //cout<<ymin<<"上下"<<ymax<<endl;
    for(x=ymin;x<=ymax;x++)
    {
        if(chessboard[x][che.y]==che.color&&num<5)
        {
            num++;
            //cout<<num<<endl;
            if(num==5)
                return false;
        }
        else
            num=0;
    }
    //end 判断上下方向
    //begin判断135度方向
    num=0;
    xmin=(che.y<4)?che.y:4;//左边界到点的距离
    xmax=(N-1-che.y<4)?N-1-che.y:4;//右边界到点的距离
    ymin=(che.x<4)?che.x:4;//上边界到点的距离
    ymax=(N-1-che.x<4)?N-1-che.x:4;//下边界到点的距离
    min=xmin<ymin?xmin:ymin;//左上方边界到点的距离
    max=xmax<ymax?xmax:ymax;//右下放边界到点的距离
    //cout<<"左上边界距离"<<min<<endl;
    //cout<<"右下边界距离"<<max<<endl;
    for(x=che.x-min,y=che.y-min;x<=che.x+max;x++,y++)//左上到右下遍历
    {
        if(chessboard[x][y]==che.color&&num<5)
        {
            num++;
        //    cout<<num<<endl;
            if(num==5)
                return false;
        }
        else
            num=0;
    }
    //end判断135度方向
//begin判断45度方向
    num=0;
    min=ymin<xmax?ymin:xmax;//右上距离
    max=xmin<ymax?xmin:ymax;//左下距离
    //cout<<"右上距离"<<min<<endl;
    //cout<<"左下距离"<<max<<endl;
    for(x=che.x-min,y=che.y+min;x<=che.x+max;x++,y--)//由右上到左下判断
    {
        if(chessboard[x][y]==che.color&&num<5)
        {
            num++;
        //    cout<<num<<endl;
            if(num==5)
            return false;
        }
        else
            num=0;
    }
    //end 45度方向
    return true;
}
bool is_right_chess(struct chess che)
{
    if(che.x>=0&&che.x<N&&che.y>=0&&che.y<N&&chessboard[che.x][che.y]==0){
        chessboard[che.x][che.y]=che.color;
        return true;
    }
    else
    {
        cout<<"落子不合法,重新下子!"<<endl;
        return false;
    }
}
void show_chessboard()
{
    int i,j;
    cout<<"   0 1 2 3 4 5 6 7 8 9"<<endl;
    for(i=0;i<N;i++)
    {
        cout<<i<<"  ";
        for(j=0;j<N;j++)
        {
            //cout<<chessboard[i][j]<<" ";
            if(chessboard[i][j]==-1)
                cout<<"*"<<" ";
            else if(chessboard[i][j]==1)
                cout<<"o"<<" ";
            else
                cout<<"-"<<" ";
        }
        cout<<endl;
    }
}
struct chess put_chess(int colo)
{
    if(colo==1)
        cout<<"白方下子"<<endl;
    else if(colo==-1)
        cout<<"黑方下子"<<endl;
    struct chess che;
    cin>>che.x;
    cin>>che.y;
    che.color=colo;
    return che;
}
int renrenModle()
{
    init_chessboard();
    struct chess pre;
    //int colo;
    while(1)
    {
        show_chessboard();
        do{//黑方下棋
            pre=put_chess(-1);
        }while(!is_right_chess(pre));//下子不合法,重下
        show_chessboard();
        if(!is_win(pre))//黑方胜,胜时返回0,未分胜负返回1;
        {
            cout<<"黑方胜"<<endl;
            return -1;
        }
        do{//白方下棋
            pre=put_chess(1);
        }while(!is_right_chess(pre));//下子不合法,重下
        show_chessboard();
        if(!is_win(pre))//白方胜
        {
            cout<<"白方胜"<<endl;
            return 1;
        }
    }
}
int main()
{
    renrenModle();
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值