[人工智能]五子棋

#include<iostream>
#include<memory.h>
#include<string>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int N = 20; //定义棋盘规模
int pace = 0;//统计步数
const char chess[2] = {'X', 'O'}; //定义数组显示棋子颜色 黑 白

bool SystemError = 0;

int lastI = 0, lastJ = 0;
int maxI = 9, maxJ = 9;

void InitChess(char *board)//初始化棋盘√
{
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            board[i * N + j] = '.';
    return;
}

void PrintChess(char *board)//打印棋盘√
{
    for(int i = 0; i < N; i++)
       printf("%2d", i + 1);
    cout << endl;
    for(int i = 0; i < N; i++)
    {
        printf("%2d", i + 1);

        for(int j = 0; j < N; j++)
        {
            cout << board[i * N + j];
            cout << " ";
        }
        cout << endl;
    }
    return;
}

void Player(char * board, int color)//玩家落子√
{
    int i, j;
    while(1)
    {
        cout << "请玩家输入坐标(x y)" << endl;

        cin >> j >> i;

        i--;
        j--;

        if(i < 0 || i > 20 || j < 0 || j > 20)
            cout << "请输入1--20有效数" << endl;
        else if(board[i * N + j] != '.')
            cout << "已有棋子,请重下" << endl;
        else
            break;
    }

    board[i * N + j] = chess[color];//在棋盘上标记
    //记录当前棋子坐标
    lastI = i;
    lastJ = j;
    pace++;//步数+1
    return;
}


void ComputeValue(int color, char *board)//计算落子位置值评估函数√
{
    int maxmax = 0, mark[400] = {0};//初始分数为0
    char I;
    char U;

    if(color == 0)
    {
        I = 'X';
        U = 'O';
    }
    else
    {
        I = 'O';
        U = 'X';
    }

    for(int i = 1; i < N; i++)
    {
        for(int j = 1; j < N; j++)//全局扫描寻找最佳的落子位置
        {
            if(board[i * N + j] == '.')
            {
                if((board[(i - 1) * N + j] == I )|| (board[(i + 1) * N + j] == I )||
                   (board[i * N + (j + 1)] == I) || (board[i * N + (j - 1)] == I) )
                {
                    mark[i * N + j] += 9;
                }//四周有己方1棋o

                if((board[(i - 1) * N + j] == U) || (board[(i + 1) * N + j] == U) ||
                   (board[i * N + (j + 1)] == U) || (board[i * N + (j - 1)] == U))
                {
                    mark[i * N + j] += 10;
                }//四周有对方1棋x

                if((board[(i - 1) * N + j] == I && board[(i - 2) * N + j] == I)
                || (board[i * N + (j - 1)] == I && board[i * N + (j - 2)] == I)
                || (board[i*N+(j+1)]==I && board[i*N+(j+2)]==I)
                || (board[(i + 1) * N+j]==I && board[(i+2)*N+j]==I)
                || (board[(i - 1)*N+(j+1)]==I && board[(i-2)*N+(j+2)]==I)
                || (board[(i+1)*N+(j+1)]==I && board[(i+2)*N+(j+2)]==I)
                || (board[(i-
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值