学了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(宽度优先搜索)来优化,但是由于我不想接着写下去,就没有优化了)。
写的很粗糙,只是练习用。
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)
self.setLayout(hbox)
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
self.rectW = self.size().width() / (self.BW + 2)
self.rectH = self.size().height() / (self.BH + 2)
def paintEvent(self,event):
qp = QtGui.QPainter(self)
qp.begin(self)
self.drawBoard(qp)
qp.end()
def drawBoard(self,qp):
for i in range(1,self.BW+1):
for j in range(1,self.BH+1):
if self.myvis[i][j] == 0:
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
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)
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()