SDL 实现五子棋 GUI (三)

本文介绍了如何在拥有GUI的基础上,设计五子棋游戏的AI接口。通过BOARD类作为媒介,保存棋盘状态并提供操作。SearchArea类用于减少AI的查找面积,提高效率。AI接口设计允许指定玩家进行评估,并返回下一步走法。最终将GUI与BOARD类和AI接口结合,实现游戏逻辑。
摘要由CSDN通过智能技术生成

在拥有了 GUI 以后, 我们就可以专心研究其他的部分, 比如加入音乐, 比如加入 AI, 比如网络对战等. 本文只讨论加入 AI 接口一事, AI 的实现算法不做讨论. 现在我们主要面对的还是代码.

给出我的设计思路, 抛砖引玉尔.

AI 和 GUI 之间使用 BOARD 类作为媒介, 该类保存了棋盘状态, 并且提供棋盘的操作函数, 还有一个独立的判断输赢的函数. 之前还定义了一个 SearchArea 类用于 AI 减小查找面积. 我们来看代码:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <climits>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;

#ifndef BOARD_H
#define BOARD_H

//define constant varibles refer to the playerNo
#ifndef PLAYER
const int PLAYER1=1;
const int PLAYER2=2;
const int EMPTYPLAYER=0;//no stone on the position
#endif

struct SearchArea
{
 int top, left, right, bottom;
 int exTop, exLeft, exRight, exBottom;//extended area

 SearchArea(){top=1,left=1,right=1,bottom=1;}
 SearchArea(int t, int l, int r, int b){top=t,left=l,right=r,bottom=b;}
 void extendArea(int inc, int height, int width);//extends the search are by inc
};

class BOARD
{
 public:
  int width;
  int height;
  int counter_Player1;
  int counter_Player2;
  int counter_EmptyPos;
  SearchArea searchArea;
  char *board;//stores the board matrix into a linear structor

  BOARD();//default constructor
  BOARD(int w, int h);//constructor with w and h
  BOARD(const BOARD& b);//copy constructor
  ~BOARD();//destructor

  char operator ()(int x = 15, int y = 15);//return the value on board[x,y](x,y start from 1)
  void move(int x, int y, int playerNo);//put a stone into the board, 0 for legal while -1 for illegal move
};

//judge the winner
bool isWinned(BOARD & board, int x, int y, int player);

#endif


代码中变量名比较长, 但是很容易理解就不给详细注释了. 接下来看一看这个 SearchArea 是怎么工作的.


途中红色线是棋子组成的方框的四个边, 蓝色框子是用于搜索的 Extended Area, 图示中增量为 1. 显然搜索蓝色框速度比搜索整个棋盘快很多, 因为五子棋和围棋不同, 不需要考虑完全孤立的地区, 那些地方放置的棋子难以形成有效杀伤.

BOARD 的定义和操作部分文件打包后提供下载.

既然前文说了 BOARD 类是 GUI 和 AI 的桥梁, 那么我们可以这样设计 AI 接口:

void computerMove(BOARD& board, int playerToBeEvaluated, int& row, int& col);

其中 playerToBeEvalua

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XO_OX 0.0 这些是“XO_OX"的注解。它们会让你全面了解这个游戏,并会说明如何安装它。 什么是“XO_OX"? “XO_OX"又名“五子棋”,五子棋则咸信是流传于古中国的传统棋种之一,至今仍在民间广泛流传,规则相当简单。或许因没有形成一套独立完整的棋种理论及文化内涵,更无制定公平完善的规则来解决黑白平衡问题,一直没有得到发展,所以没有像六博、格五、弹棋等传统棋类流传广泛,导致缺少可考古的棋具或文献,直到流传到外国才规则改革。 不管是哪种五子棋,棋手在先后手的观念、空间的思维及对棋形的理解都十分重要。 游戏规则: * 行棋:一人流轮一著下于棋盘空点处,下后不得移动。 * 胜负:先把五枚或以上己棋相连成任何横纵斜方向为胜。 * 和棋: o 行棋中一方提出和棋,另一方同意则判和棋。 o 棋子落满整张棋盘仍未分出胜负为和棋。 o 一方PASS后另一方下一手也PASS为和棋。 技术规格说明: 1、用C语言调用SDL实现; 2、基于LGPL协议。 3、程序中用到了SDL_image扩展包 如何安装: 1、在终端中运行make 2、在终端中运行make install 如何卸载: make uninstall 历史: 一、2011年8月15日 项目开始,谢红负责图形模块,赵梓辰负责游戏逻辑,吕玉飞负责事件响应,范人豪负责整体架构。 二、2011年8月17日 为了增加游戏的可玩性,项目由圈叉棋升级为五子棋
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值