码迷,mamicode.com
首页 > 其他好文 > 详细

五子棋

时间:2020-02-25 00:27:40      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:board   image   img   分配   对齐   图片   span   stream   tga   

1.画棋盘

画出一个16×16的棋盘,用 *号表示空棋盘

//建立一个棋盘
void build()         
{
    for(int i=1;i<17;i++)
    {
        for(int j=1;j<17;j++)
        {
            board[i][j]=*;     //初始化棋盘,全为*号
        }
    }
}

 

2.显示棋盘

利用序号将棋盘行列表示出来,随后显示一个空棋盘

#include <iomanip>
cout<<left<<setw(5)<<i;    
表示向左对齐,i占5个间隔
void display()          
{
    int k=1;
    cout<<setw(3)<<"";
    for(int i=1;i<17;i++)
    {
        //第一行的序号
        cout<<left<<setw(5)<<i;
    }
    cout<<endl;
    for(int i=1;i<17;i++)
    {
        for(int j=0;j<17;j++)
        {
            //第一列的序号
            if(j==0)
            {
               cout<<right<<setw(2)<<k;
                cout<<setw(1)<<"";
                k++;
            }
            //显示空棋盘
            else
            {
                cout<<left<<setw(5)<<board[i][j];
            }
            if(j==16)
            cout<<endl<<endl;
        }
    }
}

 

                                                                     

 

3.判断胜负

假设落子的坐标为(x,y),我们先来判断

1.水平方向

int num=1;

4<y<16;判断(x,y)水平向左的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

0<y<13;判断(x,y)水平向右的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

if(num>=5) ,判定下子方胜利

 

2. 垂直方向

重新赋值 num=1;

同理

4<x<16;判断(x,y)正上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

0<x<13;判断(x,y)正下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

if(num>=5) ,判定下子方胜利

 

3.斜向

Ⅰ.正斜向

重新赋值 num=1

4<x<16,4<y<16;判断(x,y)斜上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

0<x<13,0<y<13;判断(x,y)斜下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

if(num>=5) ,判定下子方胜利

 

Ⅱ.反斜向

重新赋值 num=1

0<y<13,4<x<16;判断(x,y)斜上方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

4<y<16,0<x<13;判断(x,y)斜下方的方向,是否存在与(x,y)相同且连续的棋子,如果存在,num++;

if(num>=5) ,判定下子方胜利

//判断胜负条件
int winner(int over,int x,int y)
{
    //判断落子左右是否连成5个
    //水平方向判断
    //水平向左判断
    int num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y-i]&&y>5)
        num++;
        else
        {
            break;
        }
        
    }
    //水平向右判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y+i]&&y<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //垂直方向判断
    //垂直向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y]&&x>5)
        num++;
        else
        {
            break;
        }
        
    }
    //垂直向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y+i]&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //正斜向判断
    //斜向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y-i]&&x>5&&y>5)
        num++;
        else
        {
            break;
        }
        
    }
    //斜向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x+i][y+i]&&y<13&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //反斜向判断
    //斜向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y+i]&&x>5&&y<13)
        num++;
        else
        {
            break;
        }
        
    }
    //斜向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x+i][y-i]&&y>5&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    return over;

此处over用于下一步跳出死循环

 

4.游戏运行

1.黑白双方轮流下子问题

建立一个死循环

for(int k=1;;k++)           //k为下棋的部数

k为奇数的时候,黑方落子     k为偶数的时候,白方落子

利用k对2求余,实现黑白双方轮流下子

上方over用于跳出死循环

 

2.落子重复问题

判断落子位置原来是否为*号

if(board[x][y]==’*‘) 正常下子

else   退一步,重新下子,k--

 

3.位置合理问题

cin>>x>>y

输入的坐标需满足大于0小于16

满足   进行胜负条件判断

else   退一步,重新下子,k--

 

4.屏幕刷新问题

system("cls")

 

void startGame()      
{
    int winner(int over,int x,int y);  //函数声明
    int over=0;
    build();
    display();
    for(int k=1;;k++)
    {
        if(over)           //利用over跳出循环
        break;
        if(k%2!=0)         //对2求余,使落子分配于黑白
        {
            cout<<"黑方落子:";
            cin>>x>>y;
            system("cls");
            //不能在已下子的地方继续下子
            if(board[x][y]==*)  //判断输入的位置是否合理
            {
                board[x][y]=B;
                display();
            }
            else
            {
                display();
                cout<<"输入错误,请重新输入"<<endl;
                k--;      //退回一步
            }
            if(x>0&&y>0&&x<17&&y<17)    //判断输入的位置是否合理
            over=winner(over,x,y);      //判断胜利条件
            if(over)
            cout<<"获胜者:黑方"<<endl;
        }
        else
        {
            cout<<"白方落子:";
            cin>>x>>y;
            system("cls");
            if(board[x][y]==*)
            {
                board[x][y]=W;
                display();
            }
            else
            {
                display();
                cout<<"输入错误,请重新输入"<<endl;
                k--;   //退回一步
            }
            if(x>0&&y>0&&x<17&&y<17)    //判断输入的位置是否合理
            over=winner(over,x,y);
            if(over)
            cout<<"获胜者:白方"<<endl;
        }
    }
}

 

五子棋全部代码

//五子棋
#include <iostream>
#include <iomanip>
using namespace std;
char board[17][17];
int x,y;              //x,y为棋盘横纵坐标
int main()
{
    void build();
    void display();
    void startGame();    //函数声明
    startGame();         //函数调用
    system("pause");
    return 0;
}
//建立一个棋盘
void build()         
{
    for(int i=1;i<17;i++)
    {
        for(int j=1;j<17;j++)
        {
            board[i][j]=*;     //初始化棋盘,全为*号
        }
    }
}
//显示棋盘
void display()          
{
    int k=1;
    cout<<setw(3)<<"";
    for(int i=1;i<17;i++)
    {
        //第一行的序号
        cout<<left<<setw(5)<<i;
    }
    cout<<endl;
    for(int i=1;i<17;i++)
    {
        for(int j=0;j<17;j++)
        {
            //第一列的序号
            if(j==0)
            {
               cout<<right<<setw(2)<<k;
                cout<<setw(1)<<"";
                k++;
            }
            //显示空棋盘
            else
            {
                cout<<left<<setw(5)<<board[i][j];
            }
            if(j==16)
            cout<<endl<<endl;
        }
    }
}
//游戏运行
void startGame()      
{
    int winner(int over,int x,int y);  //函数声明
    int over=0;
    build();
    display();
    for(int k=1;;k++)
    {
        if(over)           //利用over跳出循环
        break;
        if(k%2!=0)         //对2求余,使落子分配于黑白
        {
            cout<<"黑方落子:";
            cin>>x>>y;
            system("cls");
            //不能在已下子的地方继续下子
            if(board[x][y]==*)  //判断输入的位置是否合理
            {
                board[x][y]=B;
                display();
            }
            else
            {
                display();
                cout<<"输入错误,请重新输入"<<endl;
                k--;      //退回一步
            }
            if(x>0&&y>0&&x<17&&y<17)    //判断输入的位置是否合理
            over=winner(over,x,y);      //判断胜利条件
            if(over)
            cout<<"获胜者:黑方"<<endl;
        }
        else
        {
            cout<<"白方落子:";
            cin>>x>>y;
            system("cls");
            if(board[x][y]==*)
            {
                board[x][y]=W;
                display();
            }
            else
            {
                display();
                cout<<"输入错误,请重新输入"<<endl;
                k--;   //退回一步
            }
            if(x>0&&y>0&&x<17&&y<17)    //判断输入的位置是否合理
            over=winner(over,x,y);
            if(over)
            cout<<"获胜者:白方"<<endl;
        }
    }
}
//判断胜负条件
int winner(int over,int x,int y)
{
    //判断落子左右是否连成5个
    //水平方向判断
    //水平向左判断
    int num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y-i]&&y>5)
        num++;
        else
        {
            break;
        }
        
    }
    //水平向右判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y+i]&&y<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //垂直方向判断
    //垂直向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y]&&x>5)
        num++;
        else
        {
            break;
        }
        
    }
    //垂直向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x][y+i]&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //正斜向判断
    //斜向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y-i]&&x>5&&y>5)
        num++;
        else
        {
            break;
        }
        
    }
    //斜向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x+i][y+i]&&y<13&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    //反斜向判断
    //斜向上判断
    num=1;
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x-i][y+i]&&x>5&&y<13)
        num++;
        else
        {
            break;
        }
        
    }
    //斜向下判断
    for(int i=1;i<5;i++)
    {
        if(board[x][y]==board[x+i][y-i]&&y>5&&x<13)
        num++;
        else
        {
            break;
        }
        
    }
    if(num>4)
    over=1;
    return over;
}
    

 

效果图

技术图片

 

五子棋

标签:board   image   img   分配   对齐   图片   span   stream   tga   

原文地址:https://www.cnblogs.com/sped-/p/12355084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!