五子棋源码

 

开始学习时写的五子棋

虽然是用c++写的

我感觉思想还是面向过程

惭愧惭愧

 

 

#include<iostream>
#include<iomanip>
#include<windows.h>
using namespace std;
const int MAX = 15;
int JudgeCross(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
    for(int i=0; i<MAX; i++)
    {
        for(int j=0; j<MAX-n+1; j++)
        {
            if(1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(1 == arr[i][j+k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return 1;
                }
            }
            if(-1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(-1 == arr[i][j+k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return -1;
                }
            }
        }
    }
    return 0;
}
int JudgeVertical(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
    for(int i=0; i<MAX-n+1; i++)
    {
        for(int j=0; j<MAX; j++)
        {
            if(1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(1 == arr[i+k][j])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return 1;
                }
            }
            if(-1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(-1 == arr[i+k][j])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return -1;
                }
            }
        }
    }
    return 0;
}
int JudgeDiagonalRight(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
    for(int i=0; i<MAX-n+1; i++)
    {
        for(int j=0; j<MAX-n+1; j++)
        {
            if(1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(1 == arr[i+k][j+k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return 1;
                }
            }
            if(-1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(-1 == arr[i+k][j+k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return -1;
                }
            }
        }
    }
    return 0;
}
int JudgeDiagonalLeft(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
    for(int i=0; i<MAX-n+1; i++)
    {
        for(int j=n-1; j<MAX; j++)
        {
            if(1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(1 == arr[i+k][j-k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return 1;
                }
            }
            if(-1 == arr[i][j])
            {
                int k=1;
                for(; k<n; k++)
                {
                    if(-1 == arr[i+k][j-k])
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                if(n == k)
                {
                    return -1;
                }
            }
        }
    }
    return 0;
}
int Judge(int arr[MAX][MAX], int MAX, int n)
{
    return (JudgeCross(arr,MAX,n) +
            JudgeVertical(arr,MAX,n) +
            JudgeDiagonalRight(arr,MAX,n) +
            JudgeDiagonalLeft(arr,MAX,n));
}
void Output(int arr[MAX][MAX], int MAX)
{
    for(int i=0; i<MAX; i++)
    {
        for(int j=0; j<MAX; j++)
            cout << setw(3)<<arr[i][j] ;
        cout << endl;
    }
    cout << endl;
    cout << endl;
}
int InputSize()
{
    int Size;
    do
    {
        cout << "请输入棋盘边长 最小为5" << endl;
        cin >> Size;
    }while(Size > MAX || Size < 5);
    return Size;
}
void Draw(int arr[MAX][MAX], int max_n) //max_n为棋盘大小
{
    for(int i = 0; i < max_n; i++)
    {
        cout << setw(5) << (max_n - i);
        for(int j = 0 ; j < max_n ; j++)
        {
            if(-1 == arr[i][j]) cout << setw(5)<< (char)2;
            if( 1 == arr[i][j]) cout << setw(5)<< (char)1;
            if(!arr[i][j]) cout << "     ";
        }
        cout << endl << endl;
    }
    cout << "     ";
    for(int i = 1; i <= max_n; i++)
        cout << setw(5) << i ;
    cout << endl;
}
bool FillChess(int arr[MAX][MAX], int max_n, int x, int y, int &count)
{
    int Size = max_n;
    if(x < 1 || x > Size || y < 1 || y > Size)
    {
        cout << "坐标输入错误 请重新输入" << endl;
        return false;
    }
    if(arr[Size - y][x -1])
    {
        cout << "此位置已有棋子 请重新输入" << endl;
        return false;
    }
    if( count % 2 )
    {
        arr[Size - y][x -1] = 1;
        return true;
    }
    arr[Size - y][x -1] = -1;
    return true;
}
void Play(int arr[MAX][MAX], int max_n,int &count)
{
    int x,y;
    cout << "请输入坐标 纵坐标: 横坐标:" << endl;
    do
    {
        cin >> x >> y;
    }while(!FillChess(arr,max_n,x,y,count));
    system("cls");
    cout << "第" << count << "局" << endl << endl;
    count++;
    Draw(arr,max_n);
    system("pause");
}
int main()
{
    int Array[MAX][MAX];
    start:
    for(int i=0; i<MAX; i++)
        for(int j=0; j<MAX; j++)
            Array[i][j] = 0;
    int count = 1;              //局数
    int n = 5;                  //n子棋
    int _s = InputSize();
    Draw(Array,_s);
    do
    {
        Play(Array,_s,count);
        if(1 == Judge(Array,_s,n))
        {
            cout << "先手获胜" << endl << endl;
            break;
        }
        if(-1 == Judge(Array,_s,n))
        {
            cout << "后手获胜" << endl << endl;
            break;
        }
    }while(count <= _s * _s );
    if(count > _s * _s)
        cout << "平局" << endl << endl;
    cout << "输入1再玩一局输入0退出"<<endl;
    int flag = 0;
    cin >> flag;
    if(1 == flag) goto start;
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值