五子棋程序的一种实现

本文提供一种五子棋程序的c++代码实现。
代码目录如下:
- main.cpp
- Player.cpp
- Player.h
- ChessBoard.cpp
- ChessBoard.h

以下是main.cpp

//main.cpp
#include"ChessBoard.h"
#include"Player.h"

int main()
{
    ChessBoard *board = ChessBoard::getinstance();
    Player playA("A", '*');//玩家A的棋子形状是'*'
    playA.attachToBoard(board);
    Player playB("B", '#');//玩家B的棋子形状是'#'
    playB.attachToBoard(board);
    board->show();
    while (1)
    {
        playA.setChess();//玩家A放下一个棋子
        if (playA.isWin())
        {
            cout << "Winer!"; break;
        }
        board->show();

        playB.setChess();//玩家B放下一个棋子
        if (playB.isWin())
        {
            cout << "Winer!"; break;
        }
        board->show();
    }
    return 1;
}

以下是Player.cpp

//Player.cpp
#include"Player.h"

bool Player::isInChessBoard(int x, int y)
{
    if (x<ROW - 1 && x>0 && y<COL - 1 && y>0)
        return true;
    else
        return false;
}
/*下面是核心代码:如何判断五子是否连成线。
这里采用的是以玩家此刻放下的棋子为中心,从四种方向逐个判断是否在此方向上连成了线。
*/
bool Player::isLine(int x, int y)
{
    int re = 1; 
    int dis_x = x, dis_y = y;
    int i = 0;
    int flag[4][4] = { {-1,0,1,0}, 
                       {0,-1,0,1},
                       {-1,-1,1,1},
                       {-1, 1, 1, -1} };
    for (i = 0; i < 4; i++){
        while (isInChessBoard(x + flag[i][0], y + flag[i][1]) && m_ptBoard->m_cSquare[x + flag[i][0]][y + flag[i][1]] == m_chessType){
            x += flag[i][0];
            y += flag[i][1];
            re++;
        }
        x = dis_x;
        y = dis_y;
        while (isInChessBoard(x + flag[i][2], y + flag[i][3]) && m_ptBoard->m_cSquare[x + flag[i][2]][y + flag[i][3]] == m_chessType){
            x += flag[i][2];
            y += flag[i][3];
            re++;
        }
        x = dis_x;
        y = dis_y;
        if (re >= 5){
            return true;
        }
        else{
            re = 1;
        }
    }
    return false;   
}

void Player::setChess()
{
    cout << "请输入玩家" << m_name << "的x坐标和y坐标:" << endl;
    cin >> m_x >> m_y;
    while (cin.fail() || m_ptBoard->m_cSquare[m_x][m_y] != ' ')//输入不是int型变量或者此位置上已有棋子
    {
        cout << "输入有误,请再次输入玩家" << m_name << "的x坐标和y坐标:" << endl;
        cin.clear();    //清除fail状态  
        cin.sync();   //清除缓冲区
        cin >> m_x >> m_y;
    }
    if (isInChessBoard(m_x, m_y))
        m_ptBoard->m_cSquare[m_x][m_y] = m_chessType;
}

bool Player::isWin()
{
    return isLine(m_x, m_y) ? true : false;
}

以下是Player.h

//Player.h
#pragma once
//宏定义四种检测五子是否连成线的方向
#define HORIZON         0
#define VERTICAL            1
#define LEFTBOTTOMTORIGHTTOP    2
#define LEFTTOPTORIGHTBOTTOM    3

#include"ChessBoard.h"
#include<iostream>
using namespace std;
#include<string>

class Player
{
private:
    string m_name;
    char m_chessType;
    int m_x;
    int m_y;
    ChessBoard* m_ptBoard;
public:
    Player(string name, char chessType) :m_name(name), m_chessType(chessType), m_ptBoard(NULL){}
    void attachToBoard(ChessBoard* ptBoard){ m_ptBoard = ptBoard; }
    bool isInChessBoard(int x, int y);
    bool isLine(int x, int y);
    bool isWin();
    void setChess();
};

以下是ChessBoard.cpp

//ChessBoard.cpp
#include"ChessBoard.h"
void ChessBoard::show()
{
    system("cls");
    for (int i = 0; i<ROW; i++)
    {
        for (int j = 0; j<COL; j++)
            cout << m_cSquare[i][j] << ' ';//这里的“ <<' ' ”很重要,这样才能使屏幕上ROW*COL输出为方形
        cout << endl;
    }
}

以下是 ChessBoard.h

//ChessBoard.h
#pragma once
#define ROW 15
#define COL 15
#include<iostream>
using namespace std;

class ChessBoard//棋盘类
{
public:
    char m_cSquare[ROW][COL];
public: 
    static ChessBoard* getinstance(){
        static ChessBoard instance;
        return &instance;
    }
    void show();
private:
    ChessBoard()
    {
        for (int i = 1; i<ROW - 1; i++)
            for (int j = 1; j<COL - 1; j++)
                m_cSquare[i][j] = ' ';
        for (int j = 0; j<COL; j++)
            m_cSquare[0][j] = m_cSquare[ROW - 1][j] = '-';
        for (int i = 1; i<ROW; i++)
            m_cSquare[i][0] = m_cSquare[i][COL - 1] = '|';
    }
    ChessBoard(const ChessBoard &s){}
    ChessBoard& operator=(const ChessBoard &s){}
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值