#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
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):
self.row = int()
self.column = int()
self.buttons = []
self.grid = QtGui.QGridLayout()
num = 1
QtGui.QWidget.__init__(self, parent)
for row in range(4):
self.buttons.append([])
for column in range(4):
# if row != 3 or column != 3:
self.buttons[row].append(gameButton())
self.buttons[row][column].setFont(QtGui.QFont("Tahoma", 30, QtGui.QFont.Bold))
self.buttons[row][column].po = [row, column]
self.grid.addWidget(self.buttons[row][column], row, column)
self.buttons[row][column].setText(num.__str__())
num = num + 1
self.connect(self.buttons[row][column], QtCore.SIGNAL("clicked()"), self.buttons[row][column].moving)
self.buttons[3][3].hide()
self.freespace = [3, 3]
layout = QtGui.QVBoxLayout()
layout.addLayout(self.grid)#mahdavi: grid is a layout and NOT a widget
self.setLayout(layout)
def k(self):
pass
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_())
جالبه. :) برای شروع خوبه.قبول دارم بی نظمه و حتی به خاطر همین بی نظمیش دوباره نوشتمش ولی نتونستم کلاس ها رو جوری تنظیم کنم که منظم تر بشه
من که Qt بلد نیستم. ولی indent هات یه خورده نامنظم بود. ;D یعنی بعضیجاها 4 تا فاصله هست بعضی جاها یه دونه!
چنین بازی ای تو لینوکس ندیده بودم. خیلی باحاله. من خیلی خوشم اومد. ولی اگه روش کار کنید خیلی خوب میشه. خوبیش اینه که با Keyboard هم میشه بازی کرد.یه بازی توی کی دی ای دیدم که اینطوری بود البته فقط به صورت ویدگت روی دسکتاپ قرار می گرفت با اینکه خیلی شیک تر از این بود
ولی وقتی باز میکنیم کاری کنید که به صورت Random باشه. یا تو منو یه گزینه Add کنید که هر بار Randomize کنه.
من Support اش میکنم :)
#!/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_())
من رندمش رو نوشتم. به تابع سازنده کلاس 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_())
ما هم جوگیر شدیم یه نسخه از همینو با gtk و c++ نوشتیم.اتفاقا خیلی هم خوبه :) 70 درصد پروژه های اپن سورس بخاطر رقیب پیشرفت کردن ;)
فقط نمیدونم چرا اینقدر زیاد شد!
و البته انگار خیلی قاطی پاتی!
من اینا رو اضافه کردم
قابلیت اجرا به صورت قاطی
کلید newgame داره که دوباره به هم میریزه
اگر بازی را تمام کردید می فهمه
قابلیت تغیر تعداد دکمه ها(فقط باید برنامه رو دوباره make کنید.)
اقای مهدوی هنوز هیچی نشده یه نسخه رقیب وارد بازار شد! ;D
دانلود (http://aliva13.heliohost.org/files/gtknumgame2.tar.gz)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
import random
#from PyKDE4 import kdeui,kdecore
class gameButton(QtGui.QPushButton):
def __init__(self, parent=None):
QtGui.QPushButton.__init__(self, parent)
self.po = []
def findmove(self):
self.moveable = []
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 < widget.r :
self.moveable.append([row2, widget.game.freespace[1]])
if column2 < widget.c :
self.moveable.append([widget.game.freespace[0], column2])
def moving(self):
self.findmove()
if self.po in 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()
def setMyFocus(self):
pass # in this function I set focus on buttons around this button by pressing arow keys
class gamePade(QtGui.QWidget):
def __init__(self, userRow, userColumn, parent=None):
# self.userRow = userRow
# self.userColumn = userColumn
self.row = int()
self.column = int()
self.buttons = []
self.grid = QtGui.QGridLayout()
num = 1
QtGui.QWidget.__init__(self, parent)
for row in range(userRow):
self.buttons.append([])
for column in range(userColumn):
# if row != 3 or column != 3:
self.buttons[row].append(gameButton())
self.buttons[row][column].setFont(QtGui.QFont("Tahoma", 30, QtGui.QFont.Bold))
self.buttons[row][column].po = [row, column]
self.grid.addWidget(self.buttons[row][column], row, column)
self.buttons[row][column].setText(num.__str__())
num = num + 1
self.connect(self.buttons[row][column], QtCore.SIGNAL("clicked()"), self.buttons[row][column].moving)
# self.event(widget.keyPressEvent(),self.buttons[row][column].setMyFocus())
self.buttons[userRow-1][userColumn-1].hide()
self.freespace = [userRow-1, userColumn-1]
def dist(self):
# print widget.r, widget.c
for row in range(widget.r):
for column in range(widget.c):
# print row , column
self.buttons[widget.r - row - 1][widget.c - column - 1].hide()
del self.buttons[widget.r - row - 1][widget.c - column - 1]
del self.buttons[widget.r - row - 1]
# layout = QtGui.QVBoxLayout()
# layout.addLayout(self.grid) #mahdavi: grid is a layout and NOT a widget
# self.setLayout(self.grid)
class gameWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.rowNumber = QtGui.QSpinBox()
self.columnNumber = QtGui.QSpinBox()
startspacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
startButton = QtGui.QPushButton("NEW GAME!")
startButton.connect(startButton, QtCore.SIGNAL("clicked()"),self.newGame)
rowLabel = QtGui.QLabel("row:")
columnLabel = QtGui.QLabel("column:")
self.rowNumber.setValue(4)
self.rowNumber.setMinimum(3)
self.rowNumber.setMaximum(10)
self.columnNumber.setValue(4)
self.columnNumber.setMinimum(3)
self.columnNumber.setMaximum(10)
startLayout = QtGui.QHBoxLayout()
startLayout.addWidget(rowLabel)
startLayout.addWidget(self.rowNumber)
startLayout.addWidget(columnLabel)
startLayout.addWidget(self.columnNumber)
startLayout.addItem(startspacer)
startLayout.addWidget(startButton)
self.r = self.rowNumber.value()
self.c = self.columnNumber.value()
self.game = gamePade(self.r,self.c)
self.mylayout = QtGui.QVBoxLayout()
self.mylayout.addLayout(startLayout)
self.mylayout.addLayout(self.game.grid)
self.setLayout(self.mylayout)
def newGame(self):
self.mylayout.removeItem(self.game.grid)
self.game.dist()
del self.game
self.r = self.rowNumber.value()
self.c = self.columnNumber.value()
self.game = gamePade(self.r, self.c)
self.mylayout.addLayout(self.game.grid)
self.sizePolicy()
app = QtGui.QApplication(sys.argv)
widget = gameWidget()
widget.show()
sys.exit(app.exec_())
حالا فقط باید ببینم این بر زدن و رندم کردن چطوری بوده بذارمش داخل این جدیده !!about.h:4:21: error: gtk/gtk.h: No such file or directory
بسته پیشنیازی لازم داره؟
و اینک نسخه 0.3 بازی منتشر شد! ;)نه انگار رقیب جدی اومده تو کار باید آستینا رو بالا بزنم ;)
قابلیتهای جدید:
قابلیت اجرا به صورت fullscreen یا کوچک(قابل تغییر حین بازی)
قابلیت تغییر تعداد خانهها از ۴ تا ۶۴-پازل فقط به صورت مربعی اجرا میشود-
برای افزودن این آخری مجبور شدم کل کدو از اول بنویسم
مشکلی که داره اینه که برای تغییر سایز پنجره اصلی رو نابود میکنه و دوباره می سازه
که انگار کل برنامه restart شده
دانلود (http://www.mediafire.com/download.php?jmykuj4mygk)
سلام دوستان
سید حمید مهدوی عزیز برنامت قشتنگه ولی یه مشکل داره! اونم اینکه این همه زحمت میکشیم تا جفت و جورش کنیم آخر سر نه تبریکی نه congratulationi هیچی به آدم نمیگه! :)
aliva جان برنامه شما چه جوری اجرا میشه؟
وقتی سورسش رو هم کامپایل میکنم این خطا میاد (البته همه خطاها نیست اگه لازمه تا همه اونا رو بنویسم):کد: [انتخاب]about.h:4:21: error: gtk/gtk.h: No such file or directory
بسته پیشنیازی لازم داره؟
سلام دوستانبه نظر میرسد شما لایبرریهای مورد نیاز را ندارید داخل ترمینال بزنید
سید حمید مهدوی عزیز برنامت قشتنگه ولی یه مشکل داره! اونم اینکه این همه زحمت میکشیم تا جفت و جورش کنیم آخر سر نه تبریکی نه congratulationi هیچی به آدم نمیگه! :)
aliva جان برنامه شما چه جوری اجرا میشه؟
وقتی سورسش رو هم کامپایل میکنم این خطا میاد (البته همه خطاها نیست اگه لازمه تا همه اونا رو بنویسم):کد: [انتخاب]about.h:4:21: error: gtk/gtk.h: No such file or directory
بسته پیشنیازی لازم داره؟
نه انگار رقیب جدی اومده تو کار باید آستینا رو بالا بزنم ;)تازه هنوز نسخه STABLE رو ریلیز نکردم بفهمین دنیا دست کیه! ;)