【附源码/完整教程】如何使用C语言打造人机对战版五子棋? 您所在的位置:网站首页 简单游戏代码c语言教程 【附源码/完整教程】如何使用C语言打造人机对战版五子棋?

【附源码/完整教程】如何使用C语言打造人机对战版五子棋?

2024-07-17 03:23| 来源: 网络整理| 查看: 265

#include  //memset函数

// 最关键的计算评分函数

void calculateScore(ChessData* data)

{

    if (!data) return;

    // 统计玩家或者电脑连成的子

    int personNum = 0; // 玩家连成子的个数

    int botNum = 0; // AI连成子的个数

    int emptyNum = 0; // 各方向空白位的个数

    // 清空评分数组

    memset(data->scoreMap, 0, sizeof(data->scoreMap));

    for (int row = 0; row < BOARD_GRAD_SIZE; row++)

        for (int col = 0; col < BOARD_GRAD_SIZE; col++) {

            // 空白点就算

            if (row >= 0 && col >= 0 && data->chessMap[row][col] == 0)

            {

                // 遍历周围4个方向,分别计算正反两个方向

                int directs[4][2] = { {1,0}, {1,1}, {0,1}, {-1,1 } };

                for (int k = 0; k < 4; k++) {

                    int x = directs[k][0];

                    int y = directs[k][1];

                    // 重置

                    personNum = 0;

                    botNum = 0;

                    emptyNum = 0;

                    // 对黑棋评分(正向)

                    for (int i = 1; i

                        if (row - i * y >= 0 && row - i * y < BOARD_GRAD_SIZE &&

                                col - i * x >= 0 && col - i * x < BOARD_GRAD_SIZE &&

                                data->chessMap[row - i * y][col - i * x] == 1) { // 玩家的子

                            personNum++;

                        }

                        else if (row - i * y >= 0 && row - i * y < BOARD_GRAD_SIZE &&

                                col - i * x >= 0 && col - i * x < BOARD_GRAD_SIZE &&

                                data->chessMap[row - i * y][col - i * x] == 0) { // 空白位

                            emptyNum++;

                            break;

                        }  else            // 出边界,或者有AI自己的棋子

                            break;

                    }

                    if (personNum == 1)                      // 杀二

                        data->scoreMap[row][col] += 10;

                    else if (personNum == 2) {                // 杀三

                        if (emptyNum == 1)     // 死三

                            data->scoreMap[row][col] += 30;    

                        else if (emptyNum == 2) // 活三

                            data->scoreMap[row][col] += 40;

                    } else if (personNum == 3) {              // 杀四

                        if (emptyNum == 1)    //死四

                            data->scoreMap[row][col] += 60;

                        else if (emptyNum == 2) //活四

                            data->scoreMap[row][col] += 200;

                    }

                    else if (personNum == 4)                 // 杀五

                        data->scoreMap[row][col] += 20000;

                    // 进行一次清空

                    emptyNum = 0;

                    // 对白棋评分(正向)

                    for (int i = 1; i

                        if (row - i * y > 0 && row - i * y < BOARD_GRAD_SIZE &&

                                col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE &&

                                data->chessMap[row - i * y][col - i * x] == -1) { // AI的子

                            botNum++;

                        } else if (row - i * y > 0 && row - i * y < BOARD_GRAD_SIZE &&

                                col - i * x > 0 && col - i * x < BOARD_GRAD_SIZE &&

                                data->chessMap[row - i * y][col - i * x] == 0) { // 空白位

                            emptyNum++;

                            break;

                        } else            // 出边界

                            break;

                    }

                    if (botNum == 0)                      // 普通下子

                        data->scoreMap[row][col] += 5;

                    else if (botNum == 1)                 // 活二

                        data->scoreMap[row][col] += 10;

                    else if (botNum == 2) {

                        if (emptyNum == 1)                // 死三

                            data->scoreMap[row][col] += 25;

                        else if (emptyNum == 2)

                            data->scoreMap[row][col] += 50;  // 活三

                    } else if (botNum == 3) {

                        if (emptyNum == 1)                // 死四

                            data->scoreMap[row][col] += 55;

                        else if (emptyNum == 2)

                            data->scoreMap[row][col] += 300; // 活四

                    } else if (botNum >= 4)

                        data->scoreMap[row][col] += 30000;   // 活五,应该具有最高优先级

                }

            }

        }

}



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有