c++和python简易的五子棋实现

想要复习一些c++的内容,所以动手写了一些小代码。

Python版本

因为c++不熟,所以先用python实现了一遍,然后再迁移到c++中

import numpy as np
import os
class qipan():
    def __init__(self, w=10):
        self.w = w
        self.h = w
        self.qi = np.zeros([self.w,self.h])

    def pri_pan(self):
        os.system('cls')
        print(' ',end=' ')
        for i in range(self.w + 1):
            for j in range(self.h):
                if i == 0:
                    print(j,end=' ')
                    continue
                if j == 0:
                    print(i-1, end=' ')
                if self.qi[i - 1][j] == 0:
                    print('-',end=' ')
                elif self.qi[i - 1][j] == 1:
                    print('B',end=' ')
                elif self.qi[i - 1][j] == 2:
                    print('W',end=' ')
                else:
                    print('error')
                    break
            print('')
    def if_win(self):
        for i in range(self.qi.shape[0] - 4):
            for j in range(self.qi.shape[1] - 4):
                #横
                if self.qi[i][j] == self.qi[i][j+1] and self.qi[i][j] == self.qi[i][j+2] and self.qi[i][j] == self.qi[i][j+3] and self.qi[i][j] == self.qi[i][j+4]:
                    if self.qi[i][j] == 1:
                        return 1
                    elif self.qi[i][j] == 2:
                        return 2
                if self.qi[i][j] == self.qi[i+1][j] and self.qi[i][j] == self.qi[i+2][j] and self.qi[i][j] == self.qi[i+3][j] and self.qi[i][j] == self.qi[i+4][j]:
                    if self.qi[i][j] == 1:
                        return 1
                    elif self.qi[i][j] == 2:
                        return 2
                if self.qi[i][j] == self.qi[i+1][j+1] and self.qi[i][j] == self.qi[i+2][j+2] and self.qi[i][j] == self.qi[i+3][j+3] and self.qi[i][j] == self.qi[i+4][j+4]:
                    if self.qi[i][j] == 1:
                        return 1
                    elif self.qi[i][j] == 2:
                        return 2
        return 0
    def xiaqi(self,x,y,c):
        if self.qi[x][y] == 0:
            self.qi[x][y] = c
            return 0
        else:
            return 1
a = qipan(9)
a.pri_pan()
while True:
    print('黑方下棋')
    x,y = eval(input())
    while True:
        st = a.xiaqi(x,y,1)
        if st == 0:
            break
        else:
            print("输入有误,请重新输入。")
            x,y = eval(input())
    a.pri_pan()
    st = a.if_win()
    if st == 2:
        print("白棋获胜")
        break
    elif st == 1:
        print("黑棋获胜")
        break
    print('白方下棋')
    x, y = eval(input())
    while True:
        st = a.xiaqi(x, y, 2)
        if st == 0:
            break
        else:
            print("输入有误,请重新输入。")
            x,y = eval(input())
    st = a.if_win()
    a.pri_pan()
    if st == 2:
        print("白棋获胜")
        break
    elif st == 1:
        print("黑棋获胜")
        break

c++版本的实现

#include<iostream>
// #include<windows.h>
using namespace std;
class Qipan{
public:
    Qipan(int h);       //构造函数
    void pri_qipan();   //棋盘的打印
    int do_qi(int x,int y,int type);    //落子
    int if_win();       //判断输赢
    int weight;
    int high;
    int** qi = nullptr; //棋盘矩阵
};
int main(){
    Qipan a(9);     //初始棋盘构造
    a.pri_qipan();  
    int x,y;
    int st;
    int ss;
    while (1)
    {
        cout<<"bleak:";     //黑方落子
        cin>>x>>y;          //读取输入的坐标(两个数字之间用空格隔开)
        while (1)
        {
            ss = a.do_qi(x,y,1);    //进行落子操作。1代表黑子
            if(ss == 0){            //返回0代表操作成功
                break;
            }
            else{
                cout<<"re put"<<endl;       //否则重新输入
                cin>>x>>y;
            }
        }
        
        
        st = a.if_win();    //判断输赢
        a.pri_qipan();
        if(st == 1){
            cout<<"Bleak win"<<endl;
            break;
        }
        else if(st == 2){
            cout<<"withe win"<<endl;
            break;
        }
        cout<<"wihit:";     //白方落子
        cin>>x>>y;
        while (1)
        {
            ss = a.do_qi(x,y,2);    //2代表白棋
            if(ss == 0){
                break;
            }
            else{
                cout<<"re put"<<endl;
                cin>>x>>y;
            }
        }
        
        a.do_qi(x,y,1);
        st = a.if_win();
        a.pri_qipan();
        if(st == 1){
            cout<<"Bleak win"<<endl;
            break;
        }
        else if(st == 2){
            cout<<"withe win"<<endl;
            break;
        }
    }
    
    system("pause");
    return 0;
}


Qipan::Qipan(int h){
    this->weight = h;       //构造长宽相等的棋盘
    this->high = h;
    this->qi = new int*[weight];    //初始化二维矩阵
    for(int i=0; i<this->high;i++){
        qi[i] = new int[this->high];
    }
    for (int i=0;i<weight; i++)
    {
        for(int j=0;j<high;j++){
            qi[i][j] = 0;           //初始化为0
        }
    }
    

}

void Qipan::pri_qipan(){
    system ("cls");
    cout<<"  ";
    //便利二维矩阵从而实现棋盘的打印
    for(int i=0; i<weight + 1; i++){
        for(int j=0; j<high; j++){
            if(i==0){
                cout<<j<<" ";
                continue;
            }
            if(j==0){
                cout<<i-1<<" ";
            }
            if(qi[i-1][j] == 0){
                cout<<"- ";
            }
            else if (qi[i-1][j]==1)
            {
                cout<<"B ";
            }
            else if (qi[i-1][j]==2)
            {
                cout<<"W ";
            }
            else{
                cout<<"error"<<endl;
                break;
            }
            
        }
        cout<<endl;
    }
}

int Qipan::do_qi(int x,int y,int type){
    //通过改变二维矩阵的数字从而实现落子操作
    if(this->qi[x][y] == 0){
        this->qi[x][y] = type;
        return 0;
    }
    else{
        return 1;
    }
}

int Qipan::if_win(){
    for(int i;i<this->weight-4;i++){
        for(int j=0;j<this->high-4;j++){
            //横向判断
            if(this->qi[i][j] == this->qi[i][j + 1] && this->qi[i][j] == this->qi[i][j + 2] && this->qi[i][j] == this->qi[i][j + 3] && this->qi[i][j] == this->qi[i][j + 4] ){
                if(this->qi[i][j] == 1){
                    return 1;
                }
                else if(this->qi[i][j] == 2){
                    return 2;
                }
            }
            //纵向判断
            if(this->qi[i][j] == this->qi[i + 1][j] && this->qi[i][j] == this->qi[i + 2][j] && this->qi[i][j] == this->qi[i + 3][j] && this->qi[i][j] == this->qi[i + 4][j] ){
                if(this->qi[i][j] == 1){
                    return 1;
                }
                else if(this->qi[i][j] == 2){
                    return 2;
                }
            }
            //斜向判断
            if(this->qi[i][j] == this->qi[i + 1][j + 1] && this->qi[i][j] == this->qi[i + 2][j + 2] && this->qi[i][j] == this->qi[i + 3][j + 3] && this->qi[i][j] == this->qi[i + 4][j + 4] ){
                if(this->qi[i][j] == 1){
                    return 1;
                }
                else if(this->qi[i][j] == 2){
                    return 2;
                }
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值