基于QT的黑白棋游戏设计与实现.ppt
火烈鸟,基于QT的黑白棋游戏设计与实现,火烈鸟队 队呼:乘风破浪会有时,直挂云帆济沧海 队歌:十年 成员:,黑白棋简介 黑白棋游戏规则 黑白棋需求分析 黑白棋总体设计 飞信未来发展,目录,黑白棋的简介,黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋起源中世纪的英国,18世纪传入日本,并在日本得到了发展。现在,黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它,黑白棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。黑白棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。,黑白棋的游戏规则,(1)两人对弈,以轮流方式持黑子与白子。 (2)开辟新局者持白子,加入者持黑子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。 (3)在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。 (4)当下满64个棋子,棋子多者为胜。,黑白棋程序界面的需求,通过上述网上常见的一些具有代表性的黑白棋程序的对比分析,现在一个基于界面上的用户需求已经基本确立。该需求包含以下几点: 1. 作为按钮出现在主界面上的: 先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、开始新游戏。 2. 能够直观显示在游戏界面上的: 棋子数目显示、显示上步棋位置、提示下棋点、动画翻转棋子。,黑白棋的需求分析,为了开发出真正满足用户需求的程序,尤其是游戏程序,首先必须知道用户的需求。把用户需求作为前提条件,来指导程序的开发,黑白棋游戏规则的需求,1.两人对弈,以轮流方式持黑子与白子。 2.开辟新局者持黑子,加入者持白子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。 3.在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。 4.当下满64个棋子,棋子多者为胜。 5.双方都无棋可走的其他局面,游戏结束,以子多者为胜。,黑白棋的总体设计,,,棋盘绘制,规划和定义,#include class chessboard:public QWidget {Q_OBJECT public:chessboard(QWidget *parent = 0);public slots:void restartGame();void skip();void playwithpc(); signals:,,void RedNumChanged(int newyellowNum);void BlueNumChanged(int newBlackNum);void flagChanged(int newFlag); protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *event); private:void paintchessboard(QPainter #endif,双方定义,#ifndef _GAMEBOARD_H_ #define _GAMEBOARD_H_#include #include #include #include #include #include #include #include“chessboard.h“ #include“movie.h“,,class gameboard:public QWidget {Q_OBJECT public:gameboard(QWidget *parent = 0); public slots:void NewGame(); private:chessboard *chessBoard;movie *Movieblack;movie *Movieyellow; };#endif,#ifndef _MOVIE_H_ #define _MOVIE_H_#include #include #include #includeclass QTimer;class movie : public QWidget {Q_OBJECT public:movie(int color, QWidget *parent = 0); public slots:void MySlot(int FLAG); protected:,棋子,颜色变化,void paintEvent(QPaintEvent *event); private:QTimer *timer;int flag;int Color; };#endif,棋子的位置定位,棋子的位置可以根据八个个方向的八条线的交点。来确定棋子的位置的,,left,right,up,down,top left corner,under right corner,top right corner,under left corner,颜色跳变,胜负判断,void movie::MySlot(int FLAG) {if(FLAG == 0) //if receive redChessman s signal{if(Color == 0) //redChessman start flashing{timer-start(200);}if(Color == 1) //blueChessman stop flashing{timer-stop();}},,else if(FLAG == 1) //if receive blueChessman s sigal{if(Color == 1) //blueChessman start flashing{timer-start(200);}if(Color == 0) //redChessman stop flashing{timer-stop();}}else //if game over,redChessman and blueChessman stop flashing{timer-stop();,重新开始,胜负比较,游戏从新开始,#include“gameboard.h“gameboard::gameboard(QWidget *parent):QWidget(parent),void gameboard::NewGame() {chessBoard-restartGame(); },谢谢大家,