IAMKCG / Embedded-System-lab_Qt

Embedded System course exercises of EECS, PKU - part II : Qt

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Embedded-System-lab_Qt

Embedded System course exercise of EECS, PKU - part II : Qt

嵌入式系统课程的项目练习。此处为第二部分:利用Qt实现一个五子棋对战软件。

五子棋游戏分为两个部分:单人离线游戏(和电脑对战)以及多人在线游戏(和玩家对战)。

首先是主窗口MainWindow。这里会有两个按钮,分别是“单人游戏”和“多人游戏”。点选任意之一都会关闭主窗口打开新窗口。

如果点击“单人游戏”,则会在新窗口里绘制出棋盘。默认玩家先手,电脑后手。后续的版本中会加入玩家选择先手还是后手的功能。

每次鼠标点击完成都是一个事件,会使我们进行一次处理,包括将棋子放下去以及判断输赢。同时,电脑也要进行落子和判断输赢。如此不断重复,直到分出胜负。

多人游戏则利用socket通信,每个玩家既是主机,又是服务器。在建立游戏后进行连接。每次玩家落子后,本机会发送落子信息,采用预定好的传递内容进行通信。其余绘图和各种实现与单人游戏一样。

模块细节:main.cpp是主程序。mainwindow是主窗口。其中mainwindow.ui是主窗口的界面设计内容,mainwindow.h定义了主界面上包含的按钮等内容组成的类。mainwindow.cpp给出了主窗口的代码逻辑。gamewindow.cpp是人机对战窗口的代码逻辑,包括绘制棋盘,进行落子等操作,gamewindow.h定义了下棋游戏内必要的变量、函数、对象等构成的类。ngamewindow、newnetgame、joinnetgamewindow则是网络对战的窗口及其所需要的类、函数、实现等。最后,还有最重要的game.h。它定义了下棋时要用的变量。包括棋盘数组、落子情况、先后手等。同时定义了很多函数,包括判断输赢、判断是否可以落子、进行落子等。同时也包括人机对战时BOT所使用的策略实现。

本游戏的BOT所采用的策略是参考了网络资料形成的。具体策略为:由于五子棋每连出五个子便可算赢,而棋盘又很小,所以我们可以采取贪心+枚举的方法。把棋盘所有合法的连五子序列罗列出来(也就是一个个的五元组),根据当前棋盘的局势,为每个五元组赋予权值,取当前权值最高的位置落子。权值有一个固定的数表。由高到低分别为:阻断对手已经连出的四元组以防其获胜、将自己已经得到的四元组补成五元组获胜、以及其他情形。

当然这个BOT并不及AI训练出来的机器人一样很智能。但是应对一般的棋局也是足够了的。

不过当前这个版本只实现了单机游戏模式,局域网对战模式还没有实现。

About

Embedded System course exercises of EECS, PKU - part II : Qt


Languages

Language:C++ 94.3%Language:QMake 5.7%