用Python和PyQt山寨的小游戏,有些有关问题解决不了

用Python和PyQt山寨的小游戏,有些问题解决不了

战斗结束的时候“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次?