QT PySide 连连看小游戏

【Python】Pyside6简易版教程 应该有用 阅读详情
学了PySide,花了一天时间做出了以前很想写的一个游戏,然后写完主体的逻辑之后就不想再接着往下写了。
在windows下写的
6*6的方格,总共6种图像,网上找的6张gif图片,然后把大小用windows的画图变成50*50像素的图像,这是点击之前的图像。然后把gif图中白色的像素涂黑变成点击之后的图像(这个也是用windows画图解决的)。刚接触python,感觉格式会很好,但是self这个有点不爽的。
myvis[i][j] 表示(i,j)这个点是未点击的,点击过的,还是空白
mymap[i][j] 这个点应该显示何种图像
InitBoard 初始化连连看的地图
图像的绘制交给paintEvent
在鼠标点击的时候,检查两个点之后是否可以连接首先检查两个点的图像是不是相同的,然后检查是不是经过至多三条线段就能到达(这个我是用DFS(深度优先搜索)的,深搜的代价有点大,可以用BFS(宽度优先搜索)来优化,但是由于我不想接着写下去,就没有优化了)。
写的很粗糙,只是练习用。
# -*- coding:utf-8 -*-
import sys,random
from PySide import QtGui, QtCore

class Link(QtGui.QWidget):
    def __init__(self):
        super(Link,self).__init__()
        self.initUI()
    def initUI(self):
        hbox = QtGui.QHBoxLayout()
        board = Board(self)
        hbox.addWidget(board)
        #side = Side(self)
        #hbox.addWidget(side)
        self.setLayout(hbox)
        #self.setGeometry(300,300,350,300)
        #print self.size()
        #center()
        self.setWindowTitle("Link")
        self.show()

class Board(QtGui.QWidget):
    BW = 6
    BH = 6
    def __init__(self,parent):
        super(Board,self).__init__()
        self.is_press = False
        self.setMinimumSize(400,400)
        self.setGeometry(0,0,400,400)
        self.InitBoard()
        self.ex = 0
        self.ey = 0
        self.prex = 0
        self.prey = 0
    def InitBoard(self):
        self.mypix = ["nouse"]
        self.mypixc = ["nouse"]
        self.mymap = [([0]*(self.BW+1)) for i in range(self.BH+1)]
        self.myvis = [([0]*(self.BW+2)) for i in range(self.BH+2)]
        for i in range(1,7):
            self.mypix.append(QtGui.QPixmap("link0"+str(i)+".gif"))
            self.mypixc.append(QtGui.QPixmap("link0"+str(i)+"_c.gif"))

        USE = ["nouse"]
        for i in range(1,self.BW+1):
            for j in range(1,self.BH+1):
                USE.append(i)
        LIM = self.BW * self.BH
        for i in range(1,self.BW+1):
            for j in range(1,self.BH+1):
                rint = random.randint(1,LIM)
                self.mymap[i][j] = USE[rint]
                del USE[rint]
                LIM = LIM - 1

        for i in range(0,self.BW+2):
            self.myvis[i][0] = 2
            self.myvis[i][self.BH+1] = 2
        for i in range(0,self.BH+2):
            self.myvis[0][i] = 2
            self.myvis[self.BW+1][i] = 2
        #print "size : "
        #print self.size()
        self.rectW = self.size().width() / (self.BW + 2)
        #print "rectW : "+str(self.rectW)
        self.rectH = self.size().height() / (self.BH + 2)
        #print "rectH : "+str(self.rectH)

    def paintEvent(self,event):
        qp = QtGui.QPainter(self)
        qp.begin(self)
        self.drawBoard(qp)
        qp.end()

    def drawBoard(self,qp):
        # 给6*6的棋盘画上图画
        for i in range(1,self.BW+1):
            for j in range(1,self.BH+1):
                if self.myvis[i][j] == 0:
                    #print "("+str(i)+","+str(j)+")"
                    qp.drawPixmap(i*self.rectW,j*self.rectH,self.mypix[self.mymap[i][j]],0,0,self.rectW,self.rectH)
                elif self.myvis[i][j] == 1:
                    qp.drawPixmap(i*self.rectW,j*self.rectH,self.mypixc[self.mymap[i][j]],0,0,self.rectW,self.rectH)

    def mousePressEvent(self,e):
        px = e.pos().x()
        py = e.pos().y()
        if px < self.rectW or py < self.rectH :
            return
        for i in range(1,7):
            if px >= i * self.rectW :
                self.ex = i
            if py >= i * self.rectH :
                self.ey = i
        if self.myvis[self.ex][self.ey] != 0:
            return
        self.myvis[self.ex][self.ey] = 1
        if not self.is_press:
            self.prex = self.ex
            self.prey = self.ey
            self.is_press = True
        else:
            self.is_press = False
            if self.mymap[self.prex][self.prey] == self.mymap[self.ex][self.ey] and self.checkRoute(self.prex,self.prey,self.ex,self.ey):
                self.myvis[self.ex][self.ey] = 2
                self.myvis[self.prex][self.prey] = 2
            else:
                self.myvis[self.ex][self.ey] = 0
                self.myvis[self.prex][self.prey] = 0
        self.update()

    def checkRoute(self,prex,prey,ex,ey):
        self.is_find = False
        self.FRvis = [([0]*(self.BW+2)) for i in range(self.BH+2)]
        self.fx = [1,-1,0,0]
        self.fy = [0,0,1,-1]
        self.Find_Route(prex,prey,ex,ey,0,-1)
        print self.fx
        print self.fy
        #print self.is_find
        return self.is_find

    def Find_Route(self,prex,prey,ex,ey,bend,d):
        if bend > 3:
            return 
        print "(%d,%d)->(%d,%d) d:%d bend :%d"%(prex,prey,ex,ey,d,bend)
        if self.is_find:
            return
        for i in range(4):
            tmpx = self.fx[i] + prex
            tmpy = self.fy[i] + prey
            if tmpx >= 0 and tmpx <= self.BW+1 and tmpy >= 0 and tmpy <= self.BH+1 and not self.FRvis[tmpx][tmpy]:
                self.FRvis[tmpx][tmpy] = 1
                if i != d:
                    bend = bend + 1
                if tmpx == ex and tmpy == ey and bend <= 3:
                    print "(%d,%d)->(%d,%d) d:%d bend :%d"%(prex,prey,ex,ey,d,bend)
                    self.is_find = True
                    return
                if self.myvis[tmpx][tmpy] != 2:
                    self.FRvis[tmpx][tmpy] = 0
                    if i != d:
                        bend = bend - 1
                    continue
                self.Find_Route(tmpx,tmpy,ex,ey,bend,i)
                self.FRvis[tmpx][tmpy] = 0
                if i != d:
                    bend = bend - 1

class Side(QtGui.QWidget):
    def __init__(self,parent):
        super(Side,self).__init__()
        self.setMinimumSize(100,400)
    def paintEvent(self,event):
        qp = QtGui.QPainter(self)
        qp.begin(self)
        self.drawRect(qp)
        qp.end()
    def drawRect(self,qp):
        col = QtGui.QColor(0,255,0)
        qp.setPen(col)
        brush = QtGui.QBrush(QtCore.Qt.SolidPattern);
        brush.setColor(col)
        qp.setBrush(brush)
        #print "\nSide:"
        #print self.geometry()
        #print self.size()
        qp.drawRect(0,0,self.size().width(),self.size().height())

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Link()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
PySide6、PyQt6、ui文件转py文件、Qt Designer 使用 QT 官网:https://www.qt.io/zh-cn/develop 1、PySide6、PyQt6、PyQt5 PySide6、PySide2、PyQt5 都是基于 Qt 库,Qt 是一组 C++ 库和开发工具,包括图形用户界面、网络、线程、正则表达式、SQL 数据库、SVG、OpenGL、XML、用户和应用程序设置、定位和定位服务、短程通信... 阅读详情

相关推荐

Python QT 之PySide6简单入门

从 Tools -> External Tools -> PySide6_Designer 打开 QT Designer。④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)① 2000多本Python电子书(主流和经典的书籍应该都有了)③ 项目源码(四五十个有趣且经典的练手项目及源码)⑤ Python学习路线图(告别不入流的学习)② Python标准库资料(最全中文版)

2401_84585316的博客 1054

QT连连看(RPG玩法)

不同于传统的连连看,我们的 QLink 使⽤ RPG 模式进⾏,即玩家需要控制⼀个⻆⾊在地图的空地上移动(⻆⾊显示可⾃⾏选择)。 激活:当⻆⾊处于⽅块旁且再次向⽅块⽅向移动,会激活该⽅块(请使⽤某种⽅式表示该⽅块被激活)。 消除:如果此次激活的⽅块和上次激活的⽅块是同种类,且可以通过两次以内的折线连接,则该两个⽅块被消 除,玩家获得分数。(请绘制出将两个⽅块连接在⼀起的折线) 否则,上次激活的⽅块被⾃动变为未激活状态,换句话说,每个⻆⾊在地图中只有 0 个(游戏刚开始时,或刚刚消除完⼀对⽅块时)或者 1 个

程序设计 1282

PySide2介绍

1.介绍PySide2 PySide2是一个Python模块,它提供了对Qt5.12+完整框架的访问,简单点说就是在Python下使用的Qt。使用PySide2既能开发出完美的界面,又能享受Python的便捷开发。与PySide和PyQt相比,PySide2是开源的,使用不受限制;与Qt的C++相比,使用PySide2能大大减少代码量。PySide2的这些优点,很适合团队规模不大,项目需要快速推进,需开发精美界面的场合。 使用PySide2需要有一定的Python基础以及一些Qt的基础。Qt有非常详细的

00汪汪00的博客 2万+

Qt项目__连连看

qt项目,有代码有注释

BBS_S的博客 1315

Python Qt PySide6简介

自今天起开学学习,白月黒羽的教程,有网页介绍,有视频,非常的详细。

weixin_42422318的博客 4348

QT、PYQT、PySide许可证分析

简单来说,LGPL协议要求,如果我们的类使用了LGPL库的代码,那么必须把这个类开源。为了避免这种情况,通常编写一个封装器,把 LGPL库的代码封装起来,这样就只需要开放这个封装器的代码,而其他使用了这个封装器的代码就不需要开放。第四条是对第三条的一种补充,那些使用了封装器的程序不需要开源,但是必须把编译的那些中间文件开放出来。QT支持开源许可和商业许可,其中开源许可包括:LGPL v3、GPL v2、GPL v3。可以发布闭源的商业程序,但是有一些限制,需要遵守许可证的规定。

Hi~ o(* ̄▽ ̄*)ブ 4576

Qt实现一个连连看小游戏

Qt实现一个连连看小游戏

m0_73443478的博客 1040

PySide6 : Qt for Python 教程

Qt for Python 教程:https://doc.qt.io/qtforpython/tutorials/index.html 官方文档示例:https://doc.qt.io/qtforpython/examples/index.html Qt for Python 提供了一系列带有演练指南的教程,以帮助新用户入门。 其中一些文档是从 C...

墨鱼菜鸡 2469

【python】python制作 连连看 游戏脚本(二)

现在存在的问题:1、如果一次未消除完,需要手动重新执行程序。2、图像识别算法还需要优化。

sunriver2000的专栏 2953

Qt实现的连连看游戏源码

Qt实现的连连看游戏,可自行设计关卡。目前只能在Windows下编译,因为mid播放使用的是Windows库。

基于QT的C语言实现连连看游戏源码

基于QT的C语言实现的连连看游戏源码,结合一些简单的C++代码在linux QT下编写完成的,包含登陆注册模块,游戏关卡、游戏排行统计等功能,主要的代码是C语言,非常适合初学者阅读。请注意,我所编写的QT Creator 4.6.2也许和您使用的QT版本不一,如果要直接编译看效果的话请保证和我编译的QT Creator 4.6.版本一致。

PySide6精简教程

近几年,受益于人工智能的崛起,Python语言几乎以压倒性优势在众多编程语言中异军突起,成为AI时代的首选语言。在很多情况下,我们想要以图形化方式将我们的人工智能算法打包提供给用户使用,这时候选择以python为主的GUI框架就非常合适了。QT是众多GUI框架里面非常著名的一款,它本身由C++开发,天然支持基于C++的GUI编程,编出来的图形化软件在当今众多GUI框架中运行效率几乎是天花板级别的,拥有完善的第三方库,极其适合数字图像处理、文档排版、多媒体、3D建模等专业软件开发。

你是怎么做到的?我为什么做不到 6万+

【源代码】Qt实现的具有各种效果的连连看(使用QGraphicsView)

使用Qt实现的练练看的源代码,有开场动画、洗牌动画等各种动画效果,此外每个砖块被消掉时有爆炸效果,此外有载入关卡、倒计时等功能。

【QT开发-Pyside】使用Pycharm与conda配置Pyside环境并新建工程

本文主要讲了如何利用conda配置Python环境,并且使用pycharm使用conda虚拟环境,然后配置Pyside环境并使用QT设计界面并运行

qq_39150957的博客 2097

QT连连看游戏_植物系

这是一个基于QT开发的简易连连看游戏,除计分外,增加了游戏提示、图片重置和游戏帮助模块,操作简单,代码明了。游戏程序是在社区中朋友分享的基础上修改而来的,本着向各位学习交流的态度,就免费分享给大家了。 为了增加游戏难度,默认是总共可以“提示”3次,“重置”1次,且“提示”一次扣10分,“重置”一次扣30分。

基于QT实现简单的连连看小游戏.zip

资源包含文件:设计报告word+源码及可执行exe文件 简单的连连看小游戏。 开发软件 Qt Creator 4.3.0 (community) 1)面向对象。 2)单元测试。 3)程序运行 详细介绍参考:https://biyezuopin.blog.youkuaiyun.com/article/details/125473767

PyQt、PySide、PySide2这三者到底有什么区别?

前言 总所周知,Python语言在这两年确实很火,作为一种“胶水”语言,似乎它是万能的,什么都能做,这依赖于它能够支持无数的外部库,这使得Python就变得无比强大。那么身为Qt的开发者,也自然不会放过Python语言的集成了,毕竟它这么牛叉,说不定哪天可以用到项目中来呢是吧,那就必须得提前了解一下了。 那么,面对网上那么多支持的模块:PyQt、PySide、PySide2,到底该用哪一个呢?这几...

luoyayun361的专栏 8万+

TekTronix 高速信号完整性基础以及测试方法分析

如果信号速率比较高,则CTLE与FFE都无法满足要求,尤其是大于10G,比如USB3.1Gen2 10Gbps,PCIe4.0 16Gbps,这些场合都会采用DFE均衡,DFE的优点是,它既可以识别当前比特,并且可以判决前面的n个比特(Tap的阶数越高,看到的前面的比特数越多),根据前面比特的变化来计算出要处理当前比特所要变化的幅度,来补偿由于前面比特变化所引起的信号幅度的变化。10G以下,一般都不太关心这个串扰,高于10G的信号,会发现相互之间的串扰越来越明显,已经成为引起误码的重要的原因之一。

weixin_45365488的博客 4141
上一篇: SICP 习题2.53~2.55 equal
下一篇: SICP 习题2.59 union-set操作
_NMfloat_
博客等级 码龄12年 7粉丝 315原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值