当前位置: 首页 > news >正文

长沙做网站品牌做网站四百全包

长沙做网站品牌,做网站四百全包,门户网站设计欣赏,优化算法有哪些照例先演示一下: QT井字棋游戏#xff0c;可以悔棋。 会在鼠标箭头处跟随一个下棋方的小棋子图标。 棋盘和棋子是自己画的#xff0c;可以自行在对应的代码处更换自己喜欢的图片#xff0c;不过要注意尺寸兼容。 以棋会友#xff1a; 井字棋最关键的就是下棋了#xf…照例先演示一下: QT井字棋游戏可以悔棋。 会在鼠标箭头处跟随一个下棋方的小棋子图标。 棋盘和棋子是自己画的可以自行在对应的代码处更换自己喜欢的图片不过要注意尺寸兼容。 以棋会友 井字棋最关键的就是下棋了我们需要重写窗口的鼠标点击事件并且根据坐标进行判断。 如果鼠标点击的范围在棋盘里那么就接着判断此处能否下棋是否已经有棋子在这个地方了。 我这里下棋的逻辑是拿一个3*3的vector来缓存下棋状态 0为没棋1为白棋2为黑棋。 只需要更新缓存更新绘图事件让绘图事件按照缓存来重绘即可达到下棋的效果 。 每次下棋之后轮到对方下棋白棋下完黑棋下需要将记录谁下棋的标志更新。 为了悔棋的功能还需要将下棋的坐标存在一个vector里。 void TTT::mousePressEvent(QMouseEvent* e){ //按下鼠标int x e-x(), y e-y();if (x 65 x 490 y115 y540 ) { //是否在棋盘范围内x - 65, y - 115; //经过测试计算得到的结果,因为棋盘在中间,因此需要减去这些像素值才可以准确判断点击位置对应的缓存位置x / 140, y / 140; //获取对应的缓存下标if (cache[x][y] 0) { //如果该位置没有棋子就下棋if (iswhite) cache[x][y] 1;else cache[x][y] 2; iswhite !iswhite; //更新下棋方last.push_back(vectorint{x,y}); //添加缓存,用于悔棋check(); //检测是否赢棋以及和棋update(); //手动调用绘图事件}} } 并且还需要检测落完子之后有没有人赢棋以及是否和棋。 重写一个函数用于检测因为井字棋是3*3的比较简单赢棋的情况就8种所以直接用8条if来判断试过用for循环来检测结果还不如8条if来的简洁。 void TTT::check(){ //检测是否赢棋已经是否和棋bool iswin false;if (cache[0][0] cache[0][1] cache[0][0] cache[0][2] cache[0][0] ! 0) iswin true;if (cache[1][0] cache[1][1] cache[1][0] cache[1][2] cache[1][0] ! 0) iswin true;if (cache[2][0] cache[2][1] cache[2][0] cache[2][2] cache[2][0] ! 0) iswin true;if (cache[0][0] cache[1][0] cache[0][0] cache[2][0] cache[0][0] ! 0) iswin true;if (cache[0][1] cache[1][1] cache[0][1] cache[2][1] cache[0][1] ! 0) iswin true;if (cache[0][2] cache[1][2] cache[0][2] cache[2][2] cache[0][2] ! 0) iswin true;if (cache[0][0] cache[1][1] cache[0][0] cache[2][2] cache[0][0] ! 0) iswin true;if (cache[0][2] cache[1][1] cache[0][2] cache[2][0] cache[0][2] ! 0) iswin true;if (iswin) { //如果有人赢棋QString who;if (cache[(*(last.end() - 1))[0]][(*(last.end() - 1))[1]] 1) { //根据最后一个落子是谁来判断谁赢棋who QString::fromLocal8Bit(白棋);}else {who QString::fromLocal8Bit(黑棋);}//弹出提示框,是否继续游戏int checkQMessageBox::question(this, whoQString::fromLocal8Bit(赢了), whoQString::fromLocal8Bit(赢了,是否重新开始));if (check QMessageBox::Yes) {//如果继续游戏,则清空下棋记录,恢复棋盘清空,更新绘图事件cache { {0,0,0},{0,0,0},{0,0,0} };last.clear();update();return;}//不继续游戏就退出程序.exit(0);}for (int i 0; i 3; i) { //判断是否和棋,只要有一个地方是0(没下棋)就是没和棋,直接returnfor (int j 0; j 3; j) {if (cache[i][j] 0) return;}}//弹出提示框,和棋,是否继续游戏,逻辑和上面赢棋的逻辑一样int check QMessageBox::question(this, QString::fromLocal8Bit(和棋), QString::fromLocal8Bit(和棋,是否重新开始));if (check QMessageBox::Yes) {cache { {0,0,0},{0,0,0},{0,0,0} };last.clear();update();return;}exit(0); } 落子无悔 悔棋这个功能我是后面大致都写完了才想加上去的然后窗口的大小棋子的大小棋盘的大小以及他们的坐标位置我都设计完了没地方再插一个按钮来悔棋了所以我直接加在了菜单栏里。 我们在下棋的时候就有把每一步下棋的坐标存起来想要悔棋的话我们只需要把最后一个下棋的落子坐标取出把棋盘缓存中对应的位置改为0没下棋然后在更新绘图事件即可。 不要忘了把下棋方再改回去并且把下棋记录的最后一个删去。 void TTT::initMenubar() { //初始化菜单栏QMenuBar* qb new QMenuBar(this);QMenu* item new QMenu(QString::fromLocal8Bit(选项), this);QAction* restart new QAction(QString::fromLocal8Bit(重新开始), this);QAction* revoke new QAction(QString::fromLocal8Bit(悔棋), this);connect(restart, QAction::triggered, []() { //重新开始//清空下棋记录,恢复棋盘初始状态,更新绘图事件cache { {0,0,0},{0,0,0},{0,0,0} };last.clear();update();});connect(revoke, QAction::triggered, []() { //悔棋if (last.size() 0) { //如果有下棋记录才能悔棋//将最后一个下棋的位置设为0(没下棋),并且需要把下棋方再变回去(取个反),再把最后一个下棋记录删去cache[(*(last.end() - 1))[0]][(*(last.end() - 1))[1]] 0;iswhite !iswhite;last.pop_back();update();}});item-addAction(restart);item-addAction(revoke);QMenu* about new QMenu(QString::fromLocal8Bit(关于), this);QAction* me new QAction(QString::fromLocal8Bit(我), this);QAction* help new QAction(QString::fromLocal8Bit(帮助), this);QAction* quit new QAction(QString::fromLocal8Bit(退出), this);quit-setShortcut(QKeySequence(Qt::CTRL Qt::Key_Q));connect(quit, QAction::triggered, this, QMainWindow::close);connect(me, QAction::triggered, [] {QMessageBox::information(this, QString::fromLocal8Bit(这里是折途), QString::fromLocal8Bit(bilibili:折途想要敲代码/折途想要长高高\nCSDN:折途\n微信公众号:折途想要敲代码));});connect(help, QAction::triggered, [] {QMessageBox::information(this, QString::fromLocal8Bit(使用帮助), QString::fromLocal8Bit(井字棋游戏 TicTacToe(TTT)));});about-addAction(me);about-addAction(help);about-addAction(quit);qb-addMenu(about);qb-addMenu(item);qb-setFixedHeight(50);this-setMenuBar(qb); } 脑袋跟着屁股走 脑袋跟着屁股走棋子跟着鼠标走。 从开头的动图可以看出鼠标剪头所指有下棋方的棋子小图标要做到这个就需要重写窗口的鼠标移动事件每次鼠标移动我们都更新鼠标的坐标然后重写调用绘图事件在相应的位置画上小棋子。 如果直接重写鼠标移动事件函数的话只有在鼠标点击的时候才会调用我们需要在加上构造函数的开头加上行代码用于设置跟踪鼠标 setMouseTracking(true); //设置跟踪获取鼠标坐标,用于更改鼠标指向的棋子 然后重写鼠标移动事件 void TTT::mouseMoveEvent(QMouseEvent* e){ //实时获取鼠标坐标,用于修改鼠标指向的小图标mouse[0] e-x();mouse[1] e-y();update(); } 然后剩下就是绘图事件的工作了。 绘图 其实要绘的图不多一个是棋盘一个是下的棋子另一个就是跟着鼠标的棋子小图标。 void TTT::paintEvent(QPaintEvent* e){QPainter* p new QPainter(this);QPixmap board;board.load(:/image/board.png);p-drawPixmap(50,100,board);//绘制已经下过的棋for (int i 0; i 3; i) {for (int j 0; j 3; j) {if (cache[i][j] ! 0) {QPixmap piece;if (cache[i][j] 1) piece.load(:/image/white.png); //根据缓存的数值决定下什么颜色的棋else piece.load(:/image/black.png);p-drawPixmap(150*i75,150*j125,piece); //下在格子里}}} //修改鼠标坐标的指向的图片以及位置QPixmap mou;if (iswhite) {mou.load(:/image/white.png);}else {mou.load(:/image/black.png);}mou mou.scaled(50, 50);p-drawPixmap(mouse[0] - 30, mouse[1] - 30, mou); //让鼠标在图标的中间p-end(); } 免费领取完整代码 完整的代码我已经上传到CSDN了大家可以进入我的主页找到对应资源直接免费下载。 也可以关注我的微信公众号 折途想要敲代码  回复关键词“qt井字棋”免费下载完整代码。 我上传的是VS的完整工程文件已经自己绘制的图片如果小伙伴用的是QtCreater可以直接把cpp和h的文件内容复制过去再把资源文件配置一下就好啦。
http://www.laogonggong.com/news/134157.html

相关文章:

  • 做网站是咋收费的上海市建设工程安全生产协会网站
  • 公司做网站费用和人员配备软件开发
  • 做网站很麻烦吗友好链接
  • iis7 发布静态网站wordpress15天教
  • 网站建设与维护招投标书wordpress导航网
  • 访问不到自己做的网站中国建设执业资格注册中心网站
  • 监控摄像头做斗鱼直播网站京东物流网站
  • ipv6域名解析 做网站免费ppt模板下载可爱
  • 用ps给旅游网站做前端网页自己设计家装的app
  • 网址导航网站建设有哪些网站是可以做会计题目的
  • 上海网站开发公司外包一张图片切块做网站背景
  • 简单的网站开发的软件有哪些ps做网站首页规范尺寸
  • 湛江做网站的公司网络媒体有哪些
  • 通信网站模板网站建设备案
  • 松江区网站建设公司网络文化经营许可证价格
  • 电商网站平台建设资金预算网站工作室
  • 新手怎么优化网站如何做adsense网站
  • 汽车用品网站附近cad制图培训班
  • 延安网站建设公司建设网站审批
  • 泉州做网站做蔬菜的网站有哪些
  • 海阳网网站设计相关网站
  • 网站服务器搭建XP网站权重2的网站
  • 爱网站在线观看视频中国科技成就的例子
  • 布吉网站建设找哪家公司好承包网站开发
  • 新乡电商网站建设如何查看一个网站流量
  • 网站左侧悬浮导航有声小说网站开发
  • 网站系统定制北京朝阳网站制作
  • 高大上网站欣赏中信建设有限责任公司深圳中信金融中心项目工期专业招标
  • 做搜狗网站优化点权威的扬中网站建设
  • 如何查看网站用什么代码做的关于合肥的网站好