用Python和PyQt山寨的小游戏,有些有关问题解决不了
用Python和PyQt山寨的小游戏,有些问题解决不了
战斗结束的时候“XXX被打败了"经常会重复说两次……而且不知道怎么让血条从左往右减少……
------解决思路----------------------
另外, 和你的问题无关, 但是:
1. 代码有很多重复的部分, 应该合并, 精简.
2. 有关游戏逻辑的代码(攻击点数, HP改变等)应该放到cha类中, 而不是混杂在UI代码中.
------解决思路----------------------
为什么不用pydev调试下呢
看看是哪些函数触发了调用2次?
战斗结束的时候“XXX被打败了"经常会重复说两次……而且不知道怎么让血条从左往右减少……
#Python 3.4.2 and PyQt4
import sys, time, random, threading
from multiprocessing import Queue
from PyQt4 import QtGui, QtCore
from ui_npk import Ui_MainWindow
class NamePK(QtGui.QMainWindow, QtGui.QWidget):
def __init__(self, parent = None):
super(NamePK, self).__init__(parent)
self.pl_signal = QtCore.pyqtSignal(str)
self.dr_signal = QtCore.pyqtSignal(str)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.pl_q = Queue()
self.dr_q = Queue()
self.connect(self.ui.startbt, QtCore.SIGNAL('clicked()'), self.startbtl)
self.connect(self, QtCore.SIGNAL('pr_pl'), self.pl_output)
self.connect(self, QtCore.SIGNAL('pr_dr'), self.dr_output)
def pl_output(self):
self.pl_q.put(self.o)
self.ui.textEdit.append(self.pl_q.get(True))
def dr_output(self):
self.dr_q.put(self.o)
self.ui.textEdit.append(self.dr_q.get(True))
def lableview(self):
self.ui.pl_na.setText(self.player)
self.ui.la_plpw.setText(str(self.pl.pw))
self.ui.la_plmij.setText(str(self.pl.mij))
self.ui.dr_na.setText(self.diren_1)
self.ui.la_drpw.setText(str(self.dr.pw))
self.ui.la_drmij.setText(str(self.dr.mij))
self.ui.la_plhp.setText(str(self.pl.hp))
self.ui.la_drhp.setText(str(self.dr.hp))
def startbtl(self):
self.player = self.ui.pl_input.text()
try:
if not len(self.player) < 1:
self.ui.startbt.setEnabled(False)
self.ui.textEdit.setText('')
self.ui.bld_pl.resize(160, 5)
self.ui.bld_dr.resize(160, 5)
self.pl = cha(self.player)
self.plhp = self.pl.hp
diren = ['张三疯', '白眉大侠', '灭绝师太', '阿童木', '金刚狼', '王大爷', '郭老师', '葫芦娃', '小龙女']
self.diren_1 = random.choice(diren)
self.dr = cha(self.diren_1)
self.drhp = self.dr.hp
time.sleep(1)
self.o = str('你的对手是'+self.diren_1)
self.emit(QtCore.SIGNAL('pr_dr'))
t1 = threading.Thread(target=self.lableview)
t1.start()
t2 = threading.Thread(target=self.attack)
t2.start()
else:
raise ValueError
except(ValueError):
self.ui.textEdit.append('大侠,没有名字怎么PK……')
def attack(self):
atk = skill()
while self.pl.hp > 0 or self.dr.hp > 0:
cdd = 100 - self.dr.mij
cdp = 100 - self.pl.mij
while cdd >= 0 or cdp >= 0:
cdd = cdd - 5
cdp = cdp - 5
#对手的攻击CD判定
if cdd <= 0:
time.sleep(1.5)
#随机出招
pd = random.randint(0,9)
if pd <= 4:
self.pl.hp = self.pl.hp - self.dr.pw * atk.ptgjwl
self.o = str(atk.saypt.format(self.dr.name, self.pl.name, round(self.dr.pw * atk.ptgjwl)))
elif pd ==5:
self.pl.hp = self.pl.hp - self.dr.pw * atk.qkyzwl
self.o = str(atk.sayqk.format(self.dr.name, self.pl.name, round(self.dr.pw * atk.qkyzwl)))
elif pd >= 8:
self.pl.hp = self.pl.hp - int(self.dr.pw * atk.yaowl)
self.o = str(atk.sayya.format(self.dr.name, self.pl.name, round(self.dr.pw * atk.yaowl)))
else:
self.o = str(atk.saysh.format(self.dr.name, self.pl.name))
self.emit(QtCore.SIGNAL('pr_pl'))
self.ui.la_plhp.setText(str(self.pl.hp))
self.ui.bld_pl.resize(160 * self.pl.hp / self.plhp, 5)
#玩家存活判定
if self.pl.hp <= 0:
self.o = str((self.pl.name+'被打败了!'))
self.emit(QtCore.SIGNAL('pr_pl'))
self.ui.startbt.setEnabled(True)
return
else:
pass
if cdp <= 0:
time.sleep(1.5)
#随机出招
pd = random.randint(0,9)
if pd <= 4:
self.dr.hp =self.dr.hp - self.pl.pw * atk.ptgjwl
self.o = str((atk.saypt.format(self.pl.name, self.dr.name, round(self.pl.pw * atk.ptgjwl, 1))))
elif pd ==5:
self.dr.hp = self.dr.hp - self.pl.pw * atk.qkyzwl
self.o = str((atk.sayqk.format(self.pl.name, self.dr.name, round(self.pl.pw * atk.qkyzwl, 1))))
elif pd >= 8:
self.dr.hp = self.dr.hp - self.pl.pw * atk.yaowl
self.o = str((atk.sayya.format(self.pl.name, self.dr.name, round(self.pl.pw * atk.yaowl, 1))))
else:
self.o = str((atk.saysh.format(self.pl.name, self.dr.name)))
self.emit(QtCore.SIGNAL('pr_dr'))
self.ui.la_drhp.setText(str(self.dr.hp))
self.ui.bld_dr.resize(160 * self.dr.hp / self.drhp, 5)
#对手存活判定
if self.dr.hp <= 0:
self.o = str((self.dr.name+'被打败了!'))
self.emit(QtCore.SIGNAL('pr_dr'))
self.ui.startbt.setEnabled(True)
return
else:
pass
class cha:
def __init__(self, name):
if len(name) == 1:
#self.ui.startbt.setEnabled(False)
p = name
num = ord(p)
num = str(num)
self.name = name
self.pw = abs(int(ord(num[0])) + random.randint(-5, 10))
self.mij = abs(int(ord(num[1])) + random.randint(-5, 10))
self.hp = abs(int((self.pw + self.mij) * (1 + random.randint(-99, 99)/100)) + random.randint(30, 50))
elif len(name) > 1:
#self.ui.startbt.setEnabled(False)
p = name
num1 = ord(p[0]) #力量用系数
num2 = ord(p[1]) #敏捷用系数
num3 = abs(num1 - num2) #血量用系数
self.name = name #名称
self.pw = abs(random.randint(-5, 10) + int(100 * num1 * 1e-5)) #力量
self.hp = abs(random.randint(30, 240) + int(num3 * 1e-3)) #血量
self.mij = abs(random.randint(-5, 30) + int(10 * num2 * 1e-4)) #敏捷
else:
raise ValueError
class skill:
def __init__(self):
self.qkyzwl = 2 #“乾坤一掷”威力系数
self.ptgjwl = 1 #普通攻击
self.yaowl = 0.3 #"咬"
#招式喊话
self.sayqk = '{0} 对 {1} 使用“乾坤一掷”,造成了{2}点伤害\n'
self.sayya = '{0} 气疯了,咬了 {1} 一口,造成了{2}点伤害\n'
self.saypt = '{0} 向 {1} 发动攻击,造成{2}点伤害\n'
self.saysh = '{0} 向 {1} 发动攻击,但是被躲开了……\n'
app = QtGui.QApplication(sys.argv)
main = NamePK()
main.show()
sys.exit(app.exec_())
------解决思路----------------------
另外, 和你的问题无关, 但是:
1. 代码有很多重复的部分, 应该合并, 精简.
2. 有关游戏逻辑的代码(攻击点数, HP改变等)应该放到cha类中, 而不是混杂在UI代码中.
------解决思路----------------------
为什么不用pydev调试下呢
看看是哪些函数触发了调用2次?