前言:
Qt把C++的特性利用的很给力,你读Qt源码就能学习很多C++的技巧。
Qt的moc系统,让静态的C++模拟了动态语言的很多特性,例如反射、、
Qt的很多设计思想很给力,那几种设计模式在Qt中也有很多应用的,而且很优雅、、
Qt的跨平台封装、、
关于五子棋:“棋类游戏,棋具与围棋相同,兩人对局,轮流下子,先将五子连成一行者为胜。”--《辞海》
在Ubuntu系統下编写,用的软件是Qt,学习C++啊~~
代码实现时,绘制界面沒什么难度,比较费心的是算法的实现以及优化。。。
实现界面,创建一个window类(部分code...):
class Window : public QMainWindow
{
Q_OBJECT
public:
Window(QWidget * parent = 0);
~Window();
protected:
void paintEvent(QPaintEvent * event); //处理重绘消息
void mousePressEvent(QMouseEvent * event); //鼠标事件消息处理
//自定义槽函数
protected slots:
void startGame(void); //开始游戏
void stopGame(void); //结束游戏
void showAbout(void); //显示关于对话框
void setAlgorithm1(void); //设置使用第一个算法
void setAlgorithm2(void); //设置使用第二个算法
void setAlgorithm3(void); //设置使用第三个算法
void fightAgainst(void); //算法2,3之间对战
private:
void dealMenu(void); //创建菜单
private:
int MenuBarSize; //菜单栏所占的位置
Wuziqi game; //五子棋游戏类
vector<vector<int> > gamedata; //游戏数据
int N; //棋盘边长
POINT lastPs; //记录计算机最后落子的座标
bool bRun; //标志游戏是否开始
int Method; //选择计算机下棋使用的算法
SelectDialog SelectDia; //选择对战时的算法的对话框
};
算法:贪心算法 随机算法 (嗯,要好好复习数据结构和算法了)
//算法1:随机算法,测试用的AI = 0,模拟完全不会玩棋的人
void Wuziqi::Way1(POINT & ps)
{
int x = 0, y = 0;
srand(time(NULL));
x = rand()%N;
y = rand()%N;
while (Data[x][y] != 0)
{
x = rand()%N;
y = rand()%N;
}
ps.x = x;
ps.y = y;
}
//算法2:只考虑当前情况,不递归的(贪心法)
void Wuziqi::Way2(POINT & ps)
{
//如果是开局先走,随机下第一个点
if (Total == 0)
{
ps.x = rand()%N;
ps.y = rand()%N;
return;
}
//初始化计算机和人的状态矩阵
vector<vector<int> > HumanState, ComputerState;
vector<int> temp(N, 0);
for (int i = 0; i < N; i++)
{
HumanState.push_back(temp);
ComputerState.push_back(temp);
}
POINT ps1, ps2;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (Data[i][j] == 0)
{
SetScore(i, j, 1, HumanState);
SetScore(i, j, 2, ComputerState);
}
}
}
int maxP = 0, maxC = 0; //计算机和人状态值的最大值
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (HumanState[i][j] > maxP)
{
maxP = HumanState[i][j];
ps1.x = i;
ps1.y = j;
}
if (ComputerState[i][j] > maxC)
{
maxC = ComputerState[i][j];
ps2.x = i;
ps2.y = j;
}
}
}
if (maxP >= maxC)
{
ps.x = ps1.x;
ps.y = ps1.y;
}
else
{
ps.x = ps2.x;
ps.y = ps2.y;
}
}
最后看看效果: