【附源码/完整教程】如何使用C语言打造人机对战版五子棋? | 您所在的位置:网站首页 › 简单游戏代码c语言教程 › 【附源码/完整教程】如何使用C语言打造人机对战版五子棋? |
#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 实验室设备网 版权所有 |