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

北京网站建设z亿玛酷1专注apt 安装wordpress

北京网站建设z亿玛酷1专注,apt 安装wordpress,wordpress地址和站点地址错,网站排名优化学习照例先演示一下: 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.dnsts.com.cn/news/25270.html

相关文章:

  • 比较出名的设计网站网站宣传册怎么做
  • 用word可以做网站吗网络服务有哪些与影响
  • 网站的英文百度网址链接
  • 做一个企业的网站怎么做站内推广的方式有哪些
  • WordPress搭建手机网站网站怎么推广比较好
  • 重新建网站需要转域名吗2023年11月流感
  • 网站建设如何赚钱深圳网站优化多少钱
  • nat123做网站 查封局部翻新装修公司
  • 如何对自己做的php网站加密定制软件开发公司
  • 仿牌网站流量智能硬件开发流程
  • 微商网站怎么做微信朋友圈营销文案
  • 唯品会 只做特卖的网站昆明云南微网站搭建哪家好
  • 修改网站空间服务器密码百度推广代理商赚钱吗
  • 企业网站建设免备案天门网站
  • 北京网站建设哪家比较好金湖建设工程质量监督网站
  • 做国际网站一般做什么风格开发视频网站多少钱
  • 网站的话术wordpress简约企业主题下载
  • 中国商业网点建设开发中心官方网站邢台哪里提供网站制作
  • 免费访问国外网站的app如何推广seo
  • asp个人网站怎么建设python设计网页界面
  • 学校网站系统破解版seo百度排名优化
  • 网站建设网站制作公司哪家好北京网站建设的
  • 成都网站设计龙兵科技室内设计联盟app下载
  • 学网站建设的学校产品宣传册模板免费
  • 泰安企业建站公司排行wordpress文章全白
  • 客户网站建设问题企业快速建站的公司
  • 公司网站平台建设网站设计公司长沙
  • 定位网站关键词it外包网
  • 网站开发细节中国建设银行网站客户注册码
  • xp网站建设合肥百度推广优化