『练手』五子棋

前言:

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;
    }
}

最后看看效果:

 

代码下载

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*