من رندمش رو نوشتم. به تابع سازنده کلاس gamePade یه آرگومان shuffle اضافه کردم که همون اول بازی رندم میکنه(در واقع بر میزنه) اما اینکه وسط بازی هم بشه این کارو کرد، نمیدونم چون با Qt آشنا نیستم. خودتون باید اضافه کنید. از تابع shuffle توی ماژول random باید استفاده بشه، این تابع یه لیست معمولی(تکبعدی) رو بر میزنه(ترتیب اعضاءش رو بصورت تصادفی تغییر میده). ولی اگه یه جدول(لیست دو بعدی) بهش بدید فقط ترتیب سطرهاش رو تغییر میده. برای همین من اون لیست 4x4 رو به یه لیست با طول تکبعدی با طول 16 تبدیل کردم، بعد بر زدم، بعد دوباره به لیست 4x4 تبدیل کردم.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, random
from PyQt4 import QtCore, QtGui
class gameButton(QtGui.QPushButton):
def __init__(self, parent=None):
QtGui.QPushButton.__init__(self, parent)
self.po = [] #mahdavi: we dont need it :) it was dreate automaticly when it used in gamepad class
def findmove(self):
self.moveable = []
# temp = widget.game.freespace
row1 = widget.game.freespace[0] - 1
row2 = widget.game.freespace[0] + 1
column1 = widget.game.freespace[1] - 1
column2 = widget.game.freespace[1] + 1
if row1 > -1 :
self.moveable.append([row1, widget.game.freespace[1]])
if column1 > -1:
self.moveable.append([widget.game.freespace[0], column1])
if row2 < 4 :
self.moveable.append([row2, widget.game.freespace[1]])
if column2 < 4:
self.moveable.append([widget.game.freespace[0], column2])
def moving(self):
self.findmove()
if self.po in self.moveable:
# print self.moveable
temp = widget.game.freespace
widget.game.grid.addWidget(widget.game.buttons[self.po[0]][ self.po[1]], widget.game.freespace[0], widget.game.freespace[1])
widget.game.freespace = self.po
widget.game.buttons[temp[0]][temp[1]]= widget.game.buttons[self.po[0]][ self.po[1]]
self.po = temp
self.findmove()
# print "free is: ", widget.game.freespace
# print "move is: ",self.moveable
class gamePade(QtGui.QWidget):
def __init__(self, parent=None, shuffle=True):
self.row = int()
self.column = int()
self.buttons = []
self.grid = QtGui.QGridLayout()
num = 1
blist = []
QtGui.QWidget.__init__(self, parent)
for row in range(4):
for column in range(4):
# if row != 3 or column != 3:
b = gameButton()
b.setFont(QtGui.QFont("Tahoma", 30, QtGui.QFont.Bold))
self.connect(b, QtCore.SIGNAL("clicked()"), b.moving)
b.num = row*4 + column + 1
b.setText(str(b.num))
blist.append(b)
if shuffle:
random.shuffle(blist)
self.buttons = [[None for i in range(4)] for i in range(4)]
for i in range(16):
b = blist[i]
row = i/4
column = i%4
b.po = [row, column]
if b.num==16:
self.freespace = [row, column]
b.hide()
self.grid.addWidget(b, row, column)
self.buttons[row][column] = b
layout = QtGui.QVBoxLayout()
layout.addLayout(self.grid)#mahdavi: grid is a layout and NOT a widget
self.setLayout(layout)
def k(self):
pass
"""##???????????????????
def shuffle_buttons(self):
lst = []
for i in range(4):
for j in range(4):
#if [i, j]==self.freespace:
# lst.append(None)
#else:
lst.append(self.buttons[i][j])
random.shuffle(lst)
for i in range(4):
for j in range(4):
self.buttons[i][j] = lst[i*4+j]
self.buttons[i][j].show()
#item = lst[i*4+j]
#if item==None:
# self.freespace = [i, j]
# self.buttons[i][j] = None
#else:
# self.buttons[i][j] = item
"""
class gameWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.game = gamePade()
layout = QtGui.QVBoxLayout()
layout.addWidget(self.game)
self.setLayout(layout)
def findmoveable(self):
self.moveable = []
temp = placeButton()
row1 = temp.row - 1
row2 = temp.row + 1
column1 = temp.column - 1
column2 = temp.column + 1
if row1 > -1 :
if column1 > -1:
self.moveable.append(self.buttonpanel[row1][column1])
if column2 < 4:
self.moveable.append(self.buttonpanel[row1][column2])
if row2 < 4 :
if column1 > -1:
self.moveable.append(self.buttonpanel[row2][column1])
if column2 < 4:
self.moveable.append(self.buttonpanel[row2][column2])
return self.moveable
app = QtGui.QApplication(sys.argv)
widget = gameWidget()
widget.show()
#w2 = gamePade()
#w2.show()
sys.exit(app.exec_())