大家好,我是一名自学Python的高一学生,这是我写的第一篇博客,还请各位多多指教。本文中,我们将用Python制作一个谁是卧底的APP。我制作这个APP的初衷是在和小伙伴一起玩谁是卧底的时候,可以省略掉裁判这个角色,让所有人都可以一起来玩,所以发言方法和投票方法还是和卡片的方法一样的。
我们将用到:
使用 open函数 打开储存词组的文件 (此处路径可以使用os库 ,由于本人太懒所有没有用 ),并将词组分离保存进入一个列表以便之后使用。第三行的文件路径,需要修改为保持文件的路径,(若与我的储存方法不同)第七行的词组分离方法也需要修改为分离储存词组的方法。
def CZ(self):
'''词组导入'''
file = open('/Volumes/E/词组.csv','r',encoding='gbk') #打开文件的路径需要修改
#将词组保持进一个列表
self.dycz = []
for line in file: #需要按照文件储存方法修改
self.dycz.append(line.strip('\n').split(','))
file.close()
此界面中只有一个输入行(QLineEdit)和一个确认按钮(QPushButton),确认按钮点击后 或 键盘上的enter/return按下后 将前往 输入玩家昵称 的界面
def startWindow(self):
'''主界面'''
self.SZWJSL = QLineEdit(self) #设置玩家数量
self.SZWJSL.setPlaceholderText('请输入玩家数量')
self.SZWJSL.returnPressed.connect(self.setting)
self.SZWJSL.setGeometry(25,25,350,25)
self.QR = QPushButton('确认',self)
self.QR.move(400,25)
self.QR.clicked.connect(self.setting)
self.setGeometry(50,100,500,75)
self.setWindowTitle('谁是卧底')
self.show()
此处的界面会按照玩家数量而自行改变,玩家数量的不同将直接影响界面的大小以及输入行的数量,用 for循环 和 列表 的方法可以确保玩家数量在什么数都可以完成界面的制作。
def setting(self):
self.SZWJSL.hide()
self.QR.hide()
self.WJNC = [] #玩家昵称QLineEdit
for num in range(0,int(self.SZWJSL.text())):
self.WJNC.append(QLineEdit(self))
self.WJNC[num].setGeometry(25, 25 + 50 * num, 350, 25)
self.WJNC[num].setPlaceholderText('请输入玩家昵称')
self.WJNC[num].show()
self.SZQR = QPushButton('确认', self)
self.SZQR.move(400, 25)
self.SZQR.clicked.connect(self.SZNC)
self.SZQR.show()
self.setGeometry(50, 100, 500, 25 + 50 * int(self.SZWJSL.text()))
self.repaint()
此处为角色数量设置界面,这里有两个输入行一个是 卧底玩家数量 还有一个是 白板玩家数量 ,确认按键点击后将前往角色分配以及词组分配。(此处setPlaceholderText函数中的 推荐角色数量 可加可不加)
同时,这个函数会将 玩家昵称 界面中填写的昵称保存到一个列表(list)中。
def SZNC(self):
self.WJMC = [] #玩家名称
for name in range(0,int(self.SZWJSL.text())):
self.WJMC.append(self.WJNC[name].text())
print(self.WJMC,end='\n\n')
for LE in self.WJNC:
LE.hide()
self.repaint()
self.SZQR.hide()
self.WDsl = QLabel('卧底数量',self)
self.WDsl.move(25,25)
self.WDsl.show()
self.wdsl = QLineEdit(self)
self.wdsl.setPlaceholderText('推荐卧底数量:{}人'.format(int(int(self.SZWJSL.text())/2-1)))
self.wdsl.move(100,25)
self.wdsl.show()
self.BBsl = QLabel('白板数量',self)
self.BBsl.move(25,75)
self.BBsl.show()
self.bbsl = QLineEdit(self)
self.bbsl.setPlaceholderText('推荐白板数量:{}人'.format(int(int(self.SZWJSL.text())/2-2)))
self.bbsl.move(100,75)
self.bbsl.show()
self.szqr = QPushButton('确认',self)
self.szqr.move(150,125)
self.szqr.clicked.connect(self.FPCZ)
self.szqr.show()
self.setGeometry(50,100,250,175)
self.repaint()
首先我们先确认每个角色的数量,并将其保存到一个列表中。并给每个角色一个编号,如:好人为0号,卧底为1号,白板为2号;这里为每个角色编号可以方便确认每个玩家的身份并方便给与词组。
此时用 random库 为每个玩家分配角色,并用 random库 随机选择一对词组,接下来将每个玩家的 玩家昵称 , 玩家身份 , 玩家词组 保持进一个单独的列表,并将这个列表保持进一个统一列表,并将每个玩家的顺序打乱,这样只要自己不说就不会有人知道身份了,但是顺序打乱了之后需要将白板移开第一位 (因为玩家叙述顺序为领词的顺序,将白板移开第一位可以保证白板玩家的公平性) ,此处我同样使用了random库。
同时,额外创造四个列表分别为 好人 ,卧底 , 白板 , 词组 并复制一份以便之后使用
def FPCZ(self):
self.JSSL = [] #角色数量
self.JSSL.append(int(self.SZWJSL.text())-int(self.wdsl.text())-int(self.bbsl.text()))
self.JSSL.append(int(self.wdsl.text()))
self.JSSL.append(int(self.bbsl.text()))
print(self.JSSL,end='\n\n')
self.WJMCcopy = self.WJMC.copy()
self.wj = [] #玩家
self.HaoRen = [] #好人 -- 0
self.WoDi = [] #卧底 -- 1
self.BaiBan = [] #白板 -- 2
role = 0
for num in self.JSSL:
num = int(num)
for JSnum in range(num):
JSrole = []
player = random.choice(self.WJMCcopy)
JSrole.append(player)
JSrole.append(role)
if role == 0:
self.HaoRen.append(player)
if role == 1:
self.WoDi.append(player)
if role == 2:
self.BaiBan.append(player)
self.wj.append(JSrole)
self.WJMCcopy.remove(player)
role += 1
print(self.wj,end='\n\n')
print('好人:{}'.format(','.join(self.HaoRen)))
print('卧底:{}'.format(','.join(self.WoDi)))
print('白板:{}'.format(','.join(self.BaiBan)),end='\n\n')
self.HaoRenCopy = self.HaoRen.copy()
self.WoDiCopy = self.WoDi.copy()
self.BaiBanCopy = self.BaiBan.copy()
self.words = random.choice(self.dycz)
self.dycz.remove(self.words)
# f = open('/Volumes/E/词组.csv', 'w', encoding='gbk')
# for row in self.dycz:
# f.write(','.join(row) + '\n')
# f.close()
print('本次词组:{}'.format(','.join(self.words),end='\n\n'))
#顺序互换
wjWordcopy = []
for num in range(len(self.wj)):
WJword = []
WJword.append(self.wj[num][0])
WJword.append(self.wj[num][1])
if self.wj[num][1] == 0:
WJword.append(self.words[0])
if self.wj[num][1] == 1:
WJword.append(self.words[1])
if self.wj[num][1] == 2:
WJword.append(' ')
wjWordcopy.append(WJword)
wjWordtwo = []
for num in range(len(wjWordcopy)):
hl = random.choice(wjWordcopy)
wjWordtwo.append(hl)
wjWordcopy.remove(hl)
self.wjWord = [] #互换后的信息列表
for num in range(len(wjWordtwo)):
hl = random.choice(wjWordtwo)
self.wjWord.append(hl)
wjWordtwo.remove(hl)
while self.wjWord[0][1] == 2: #判定白板位置并调整
WanJia = self.wjWord[0]
self.wjWord.remove(WanJia)
WeiZhi = random.randint(1,len(self.wjWord))
self.wjWord.insert(WeiZhi,WanJia)
print(self.wjWord, end='\n\n')
self.WDsl.hide()
self.wdsl.hide()
self.BBsl.hide()
self.bbsl.hide()
self.szqr.hide()
# self.XYW = QLabel(self)
# self.XYW.setText('请 ' + self.wjWord[0][0]+' 查看他的词语')
# self.XYW.setGeometry(35,35,190,25)
# self.XYW.show()
# self.XYWbtn = QPushButton('查看',self)
# self.XYWbtn.move(150,75)
# self.XYWbtn.clicked.connect(self.tellPW)
# self.XYWbtn.show()
# self.setGeometry(50,100,260,125)
# self.repaint()
# self.rs = 0
此处使用了子窗口,可以确保玩家仅查看自己的词组,而 查看的顺序就是之前打乱的顺序 。主窗口会显示 “请某某某查看他的词组” 并有一个 确认按键 ,按键点击之后,主窗口将隐藏并显示子窗口,子窗口将显示 玩家昵称 , 玩家词组 以及 确认按钮。确认点击后,子窗口会隐藏并显示主窗口请下一位玩家查看。以此类推,直到所有玩家查看结束后,将直接前往 淘汰人选 界面。 (若玩家为白板,子界面将只显示 玩家昵称 和 确认按钮)
self.XYW = QLabel(self)
self.XYW.setText('请 ' + self.wjWord[0][0]+' 查看他的词语')
self.XYW.setGeometry(35,35,190,25)
self.XYW.show()
self.XYWbtn = QPushButton('查看',self)
self.XYWbtn.move(150,75)
self.XYWbtn.clicked.connect(self.tellPW)
self.XYWbtn.show()
self.setGeometry(50,100,260,125)
self.repaint()
self.rs = 0
def tellPW(self):
self.hide()
self.XSCZ = showCZ()
self.XSCZ.playName.setText(self.wjWord[self.rs][0])
self.XSCZ.playsword.setText(self.wjWord[self.rs][2])
self.XSCZ.nextbtn.clicked.connect(self.CallN)
self.XSCZ.show()
def CallN(self):
self.XSCZ.hide()
self.rs += 1
self.WJMCcopy1 = self.WJMC.copy()
# if self.rs == len(self.wjWord):
# self.XYW.hide()
# self.XYWbtn.hide()
# self.title = QLabel('淘汰选择',self)
# self.title.move(100,25)
# self.SYWAlist = []
# self.SYWA = QComboBox(self)
# self.SYWA.addItem('')
# self.SYWAlist.append('')
# for player in self.WJMCcopy1:
# self.SYWA.addItem(player)
# self.SYWAlist.append(player)
# self.SYWA.move(50,75)
# self.SYWA.activated[str].connect(self.TaoTai)
# self.label = QLabel('淘汰人选:',self)
# self.label.move(50,125)
# self.TTWA = QLabel(self)
# self.TTWA.setGeometry(125,125,125,20)
# self.CKCZ = QPushButton('查看词组',self)
# self.CKCZ.clicked.connect(self.ChaKanCiZu)
# self.CKCZ.move(40,175)
# self.Next = QPushButton('确认',self)
# self.Next.clicked.connect(self.CaiPan)
# self.Next.move(160,175)
# self.setGeometry(100,200,260,225)
# self.show()
else:
self.XYW.setText('请' + self.wjWord[self.rs][0]+'查看他的词语')
self.move(100,200)
self.show()
class showCZ(QWidget):
'''子界面 -- 显示玩家及词组'''
def __init__(self):
super().__init__()
self.playName = QLabel(self)
self.playName.setGeometry(50,35,150,25)
self.playsword = QLabel(self)
self.playsword.setGeometry(50,85,150,25)
self.nextbtn = QPushButton('确定',self)
self.nextbtn.move(150,110)
self.setGeometry(400,225,250,160)
self.setWindowTitle('谁是卧底')
淘汰人选界面 上有一个 组合框(QComboBox) ,一个 查看词组按钮 和 一个 确认按钮 ,组合框中有所有还在场内玩家的昵称。而淘汰方法很简单,就是大家线下投票(不使用程序),确认淘汰的人后,在组合框中找到被淘汰的玩家昵称,然后在界面下方的 “淘汰人选:”(QLabel) 后面将显示 被选择的玩家昵称 以再次确认淘汰人选。按下确认按键后, 若界面没有变化代表游戏继续 (此时在的组合框中将不会再有被淘汰的玩家的昵称了)。
在 查看词组按键 被按下之后,将开启一个查看词组的子界面。界面中,玩家昵称以 按钮的形式 列着排序并有一个确认按钮。有着玩家昵称的按被钮点击后,将在 被点击的按钮旁边显示出这位玩家的词组 。确认按钮点击后,将关闭子窗口。
def CallN(self):
self.XSCZ.hide()
self.rs += 1
self.WJMCcopy1 = self.WJMC.copy()
if self.rs == len(self.wjWord):
self.XYW.hide()
self.XYWbtn.hide()
self.title = QLabel('淘汰选择',self)
self.title.move(100,25)
self.SYWAlist = []
self.SYWA = QComboBox(self)
self.SYWA.addItem('')
self.SYWAlist.append('')
for player in self.WJMCcopy1:
self.SYWA.addItem(player)
self.SYWAlist.append(player)
self.SYWA.move(50,75)
self.SYWA.activated[str].connect(self.TaoTai)
self.label = QLabel('淘汰人选:',self)
self.label.move(50,125)
self.TTWA = QLabel(self)
self.TTWA.setGeometry(125,125,125,20)
self.CKCZ = QPushButton('查看词组',self)
self.CKCZ.clicked.connect(self.ChaKanCiZu)
self.CKCZ.move(40,175)
self.Next = QPushButton('确认',self)
self.Next.clicked.connect(self.CaiPan)
self.Next.move(160,175)
self.setGeometry(100,200,260,225)
self.show()
# else:
# self.XYW.setText('请' + self.wjWord[self.rs][0]+'查看他的词语')
# self.move(100,200)
# self.show()
def TaoTai(self,text):
self.TTWA.setText(text)
def ChaKanCiZu(self):
self.CZJM = CiZhuJieMian()
for num in range(0,len(self.wjWord)):
self.CZJM.PB = QPushButton(self.wjWord[num][0],self.CZJM)
self.CZJM.PB.move(25,25+50*num)
self.CZJM.PB.clicked.connect(lambda:self.XianShi(self.sender().text()))
self.CZJM.PB.show()
for num in range(0,len(self.wjWord)):
self.CZJM.CiZu.append(QLabel(self.CZJM))
self.CZJM.CiZu[num].setGeometry(150,25+50*num,150,25)
self.CZJM.CiZu[num].show()
self.CZJM.show()
self.CZQR = QPushButton('确认',self.CZJM)
self.CZQR.move(225,25 + 50 * len(self.wjWord))
self.CZQR.clicked.connect(self.JMYC)
self.CZQR.show()
self.CZJM.setGeometry(400,175,325,25 + 50 * (len(self.wjWord) + 1))
self.CZJM.show()
def XianShi(self,name):
num = 0
for number in range(0,len(self.wjWord)):
if name == self.wjWord[number][0]:
break
else:
num += 1
self.CZJM.CiZu[num].setText(self.wjWord[num][2])
self.CZJM.repaint()
print(time.ctime())
print('查看:{}'.format(name))
print('结果:{}'.format(self.wjWord[num][2]), end='\n\n')
def JMYC(self):
self.CZJM.hide()
class CiZhuJieMian(QWidget):
def __init__(self):
super().__init__()
self.CiZu = []
只用之前创造的 好人,卧底,白板列表 判定游戏的胜负,被投出去的玩家将被从列表中移除。
def CaiPan(self):
playerOut = self.TTWA.text()
playerlist = []
print('被投出的玩家:',playerOut)
print('好人:',playerOut in self.HaoRenCopy)
print('卧底:',playerOut in self.WoDiCopy)
print('白板:',playerOut in self.BaiBanCopy,end='\n\n')
if (playerOut in self.HaoRenCopy) == True:
self.HaoRenCopy.remove(playerOut)
if (playerOut in self.WoDiCopy) == True:
self.WoDiCopy.remove(playerOut)
if (playerOut in self.BaiBanCopy) == True:
self.BaiBanCopy.remove(playerOut)
if len(self.HaoRenCopy) == 0:
self.WDEG()
self.EG()
elif len(self.WoDiCopy) + len(self.BaiBanCopy) == 0:
self.title.hide()
self.SYWA.hide()
self.label.hide()
self.TTWA.hide()
self.Next.hide()
self.CC = QLineEdit(self)
self.CC.setPlaceholderText('卧底猜词')
self.CC.returnPressed.connect(self.YanZheng)
self.CC.setGeometry(25,25,350,25)
self.CC.show()
self.WoDiNames = QLabel('卧底:{}'.format(','.join(self.WoDi)),self)
self.WoDiNames.move(25,75)
self.WoDiNames.show()
self.BaiBanNames = QLabel('白板:{}'.format(','.join(self.BaiBan)),self)
self.BaiBanNames.move(25,125)
self.BaiBanNames.show()
self.QRbtn = QPushButton('确认', self)
self.QRbtn.move(400, 25)
self.QRbtn.clicked.connect(self.YanZheng)
self.QRbtn.show()
self.setGeometry(50, 100, 500, 175)
elif len(self.HaoRenCopy) + len(self.WoDiCopy) + len(self.BaiBanCopy) == 3:
self.WDEG()
self.EG()
playersnum = 0
for players in self.SYWAlist:
if players != playerOut:
playersnum += 1
else:
self.SYWAlist.remove(playerOut)
break
self.SYWA.removeItem(playersnum)
self.SYWA.setCurrentText('')
self.TTWA.setText('')
self.repaint()
猜词界面有一个输入行,输入完后按 确认 或 键盘上的enter/return 进入验证环节,并判定游戏的输赢,然后显示 判定结果 (结束界面) , 再来一局 和 本局回顾
elif len(self.WoDiCopy) + len(self.BaiBanCopy) == 0:
self.title.hide()
self.SYWA.hide()
self.label.hide()
self.TTWA.hide()
self.Next.hide()
self.CC = QLineEdit(self)
self.CC.setPlaceholderText('卧底猜词')
self.CC.returnPressed.connect(self.YanZheng)
self.CC.setGeometry(25,25,350,25)
self.CC.show()
self.WoDiNames = QLabel('卧底:{}'.format(','.join(self.WoDi)),self)
self.WoDiNames.move(25,75)
self.WoDiNames.show()
self.BaiBanNames = QLabel('白板:{}'.format(','.join(self.BaiBan)),self)
self.BaiBanNames.move(25,125)
self.BaiBanNames.show()
self.QRbtn = QPushButton('确认', self)
self.QRbtn.move(400, 25)
self.QRbtn.clicked.connect(self.YanZheng)
self.QRbtn.show()
self.setGeometry(50, 100, 500, 175)
结束界面很简单就一段话 “好人胜利” 或者 “卧底胜利” 。 本局回顾 和 再来一局 会和结束界面一起显示。
def WDEG(self):
self.title.hide()
self.SYWA.hide()
self.label.hide()
self.TTWA.hide()
self.Next.hide()
self.WDBBSL = QLabel('卧底白板胜利', self)
self.WDBBSL.move(100, 50)
self.WDBBSL.show()
self.code = 1
self.setGeometry(100, 200, 275, 125)
# def EG(self):
# self.EndGame = EndGame()
# self.EndGame.WFG.setText('好人词:{}'.format(self.words[0]))
# self.EndGame.WFB.setText('卧底词:{}'.format(self.words[1]))
# self.EndGame.HaoRen.setText('好人:{}'.format(','.join(self.HaoRen)))
# self.EndGame.WoDi.setText('卧底:{}'.format(','.join(self.WoDi)))
# self.EndGame.BaiBan.setText('白板:{}'.format(','.join(self.BaiBan)))
# self.EndGame.show()
# self.OM = OneMore()
# self.OM.show()
# self.OM.Ybtn.clicked.connect(self.ReStart)
# print('')
def YanZheng(self):
CCCZ = self.CC.text()
if CCCZ == self.words[0]:
self.CC.hide()
self.QRbtn.hide()
self.WoDiNames.hide()
self.BaiBanNames.hide()
self.WDBBSL = QLabel('卧底白板胜利', self)
self.WDBBSL.move(100, 50)
self.WDBBSL.show()
self.code = 1
self.setGeometry(100, 200, 275, 125)
else:
self.CC.hide()
self.QRbtn.hide()
self.WoDiNames.hide()
self.BaiBanNames.hide()
self.HRSL = QLabel('好人胜利', self)
self.HRSL.move(105, 50)
self.HRSL.show()
self.code = 0
self.setGeometry(100, 200, 275, 125)
self.EG()
通过子界面以及之前保存的列表显示出本局信息。
def EG(self):
self.EndGame = EndGame()
self.EndGame.WFG.setText('好人词:{}'.format(self.words[0]))
self.EndGame.WFB.setText('卧底词:{}'.format(self.words[1]))
self.EndGame.HaoRen.setText('好人:{}'.format(','.join(self.HaoRen)))
self.EndGame.WoDi.setText('卧底:{}'.format(','.join(self.WoDi)))
self.EndGame.BaiBan.setText('白板:{}'.format(','.join(self.BaiBan)))
self.EndGame.show()
# self.OM = OneMore()
# self.OM.show()
# self.OM.Ybtn.clicked.connect(self.ReStart)
# print('')
class EndGame(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel('本轮回顾',self)
self.label.move(100,25)
self.WFG = QLabel(self)
self.WFG.setGeometry(25,75,200,25)
self.WFB = QLabel(self)
self.WFB.setGeometry(25,125,200,25)
self.HaoRen = QLabel(self)
self.HaoRen.setGeometry(25,175,200,25)
self.WoDi = QLabel(self)
self.WoDi.setGeometry(25, 225,200,25)
self.BaiBan = QLabel(self)
self.BaiBan.setGeometry(25,275,200,25)
self.setGeometry(400,225,250,325)
self.setWindowTitle('谁是卧底')
此界面一样是用子窗口显示的,点击 是 将直接前往 角色和词组分配 ,点击 否 将关闭此窗口。
def EG(self):
# self.EndGame = EndGame()
# self.EndGame.WFG.setText('好人词:{}'.format(self.words[0]))
# self.EndGame.WFB.setText('卧底词:{}'.format(self.words[1]))
# self.EndGame.HaoRen.setText('好人:{}'.format(','.join(self.HaoRen)))
# self.EndGame.WoDi.setText('卧底:{}'.format(','.join(self.WoDi)))
# self.EndGame.BaiBan.setText('白板:{}'.format(','.join(self.BaiBan)))
# self.EndGame.show()
self.OM = OneMore()
self.OM.show()
self.OM.Ybtn.clicked.connect(self.ReStart)
print('')
class OneMore(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel('是否再来一轮',self)
self.label.move(100,25)
self.Ybtn = QPushButton('是',self)
self.Ybtn.move(75,75)
self.Nbtn = QPushButton('否',self)
self.Nbtn.clicked.connect(self.No)
self.Nbtn.move(150,75)
self.setGeometry(100,400,275,125)
def No(self):
self.hide()
PS:我才不会告诉你这些功能只是我懒得加呢
from PyQt5.QtWidgets import QWidget,QComboBox,QPushButton,QLabel,QApplication,QLineEdit
import sys, random, time
class SSWD(QWidget):
def __init__(self):
super().__init__()
self.CZ()
self.startWindow()
def CZ(self):
'''词组导入'''
file = open('/Volumes/E/词组.csv','r',encoding='gbk')
self.dycz = []
for line in file:
self.dycz.append(line.strip('\n').split(','))
file.close()
# print(self.dycz,end='\n\n')
def startWindow(self):
'''主界面'''
self.SZWJSL = QLineEdit(self) #设置玩家数量
self.SZWJSL.setPlaceholderText('请输入玩家数量')
self.SZWJSL.returnPressed.connect(self.setting)
self.SZWJSL.setGeometry(25,25,350,25)
self.QR = QPushButton('确认',self)
self.QR.move(400,25)
self.QR.clicked.connect(self.setting)
self.setGeometry(50,100,500,75)
self.setWindowTitle('谁是卧底')
self.show()
def setting(self):
self.SZWJSL.hide()
self.QR.hide()
self.WJNC = [] #玩家昵称QLineEdit
for num in range(0,int(self.SZWJSL.text())):
self.WJNC.append(QLineEdit(self))
self.WJNC[num].setGeometry(25, 25 + 50 * num, 350, 25)
self.WJNC[num].setPlaceholderText('请输入玩家昵称')
self.WJNC[num].show()
self.SZQR = QPushButton('确认', self)
self.SZQR.move(400, 25)
self.SZQR.clicked.connect(self.SZNC)
self.SZQR.show()
self.setGeometry(50, 100, 500, 25 + 50 * int(self.SZWJSL.text()))
self.repaint()
def SZNC(self):
self.WJMC = [] #玩家名称
for name in range(0,int(self.SZWJSL.text())):
self.WJMC.append(self.WJNC[name].text())
print(self.WJMC,end='\n\n')
for LE in self.WJNC:
LE.hide()
self.repaint()
self.SZQR.hide()
self.WDsl = QLabel('卧底数量',self)
self.WDsl.move(25,25)
self.WDsl.show()
self.wdsl = QLineEdit(self)
self.wdsl.setPlaceholderText('推荐卧底数量:{}人'.format(int(int(self.SZWJSL.text())/2-1)))
self.wdsl.move(100,25)
self.wdsl.show()
self.BBsl = QLabel('白板数量',self)
self.BBsl.move(25,75)
self.BBsl.show()
self.bbsl = QLineEdit(self)
self.bbsl.setPlaceholderText('推荐白板数量:{}人'.format(int(int(self.SZWJSL.text())/2-2)))
self.bbsl.move(100,75)
self.bbsl.show()
self.szqr = QPushButton('确认',self)
self.szqr.move(150,125)
self.szqr.clicked.connect(self.FPCZ)
self.szqr.show()
self.setGeometry(50,100,250,175)
self.repaint()
def FPCZ(self):
self.JSSL = [] #角色数量
self.JSSL.append(int(self.SZWJSL.text())-int(self.wdsl.text())-int(self.bbsl.text()))
self.JSSL.append(int(self.wdsl.text()))
self.JSSL.append(int(self.bbsl.text()))
print(self.JSSL,end='\n\n')
self.WJMCcopy = self.WJMC.copy()
self.wj = [] #玩家
self.HaoRen = [] #好人 -- 0
self.WoDi = [] #卧底 -- 1
self.BaiBan = [] #白板 -- 2
role = 0
for num in self.JSSL:
num = int(num)
for JSnum in range(num):
JSrole = []
player = random.choice(self.WJMCcopy)
JSrole.append(player)
JSrole.append(role)
if role == 0:
self.HaoRen.append(player)
if role == 1:
self.WoDi.append(player)
if role == 2:
self.BaiBan.append(player)
self.wj.append(JSrole)
self.WJMCcopy.remove(player)
role += 1
print(self.wj,end='\n\n')
print('好人:{}'.format(','.join(self.HaoRen)))
print('卧底:{}'.format(','.join(self.WoDi)))
print('白板:{}'.format(','.join(self.BaiBan)),end='\n\n')
self.HaoRenCopy = self.HaoRen.copy()
self.WoDiCopy = self.WoDi.copy()
self.BaiBanCopy = self.BaiBan.copy()
self.words = random.choice(self.dycz)
self.dycz.remove(self.words)
# f = open('/Volumes/E/词组.csv', 'w', encoding='gbk')
# for row in self.dycz:
# f.write(','.join(row) + '\n')
# f.close()
print('本次词组:{}'.format(','.join(self.words),end='\n\n'))
#顺序互换
wjWordcopy = []
for num in range(len(self.wj)):
WJword = []
WJword.append(self.wj[num][0])
WJword.append(self.wj[num][1])
if self.wj[num][1] == 0:
WJword.append(self.words[0])
if self.wj[num][1] == 1:
WJword.append(self.words[1])
if self.wj[num][1] == 2:
WJword.append(' ')
wjWordcopy.append(WJword)
wjWordtwo = []
for num in range(len(wjWordcopy)):
hl = random.choice(wjWordcopy)
wjWordtwo.append(hl)
wjWordcopy.remove(hl)
self.wjWord = [] #互换后的信息列表
for num in range(len(wjWordtwo)):
hl = random.choice(wjWordtwo)
self.wjWord.append(hl)
wjWordtwo.remove(hl)
while self.wjWord[0][1] == 2: #判定白板位置并调整
WanJia = self.wjWord[0]
self.wjWord.remove(WanJia)
WeiZhi = random.randint(1,len(self.wjWord))
self.wjWord.insert(WeiZhi,WanJia)
print(self.wjWord, end='\n\n')
self.WDsl.hide()
self.wdsl.hide()
self.BBsl.hide()
self.bbsl.hide()
self.szqr.hide()
self.XYW = QLabel(self)
self.XYW.setText('请 ' + self.wjWord[0][0]+' 查看他的词语')
self.XYW.setGeometry(35,35,190,25)
self.XYW.show()
self.XYWbtn = QPushButton('查看',self)
self.XYWbtn.move(150,75)
self.XYWbtn.clicked.connect(self.tellPW)
self.XYWbtn.show()
self.setGeometry(50,100,260,125)
self.repaint()
self.rs = 0
def tellPW(self):
self.hide()
self.XSCZ = showCZ()
self.XSCZ.playName.setText(self.wjWord[self.rs][0])
self.XSCZ.playsword.setText(self.wjWord[self.rs][2])
self.XSCZ.nextbtn.clicked.connect(self.CallN)
self.XSCZ.show()
def CallN(self):
self.XSCZ.hide()
self.rs += 1
self.WJMCcopy1 = self.WJMC.copy()
if self.rs == len(self.wjWord):
self.XYW.hide()
self.XYWbtn.hide()
self.title = QLabel('淘汰选择',self)
self.title.move(100,25)
self.SYWAlist = []
self.SYWA = QComboBox(self)
self.SYWA.addItem('')
self.SYWAlist.append('')
for player in self.WJMCcopy1:
self.SYWA.addItem(player)
self.SYWAlist.append(player)
self.SYWA.move(50,75)
self.SYWA.activated[str].connect(self.TaoTai)
self.label = QLabel('淘汰人选:',self)
self.label.move(50,125)
self.TTWA = QLabel(self)
self.TTWA.setGeometry(125,125,125,20)
self.CKCZ = QPushButton('查看词组',self)
self.CKCZ.clicked.connect(self.ChaKanCiZu)
self.CKCZ.move(40,175)
self.Next = QPushButton('确认',self)
self.Next.clicked.connect(self.CaiPan)
self.Next.move(160,175)
self.setGeometry(100,200,260,225)
self.show()
else:
self.XYW.setText('请' + self.wjWord[self.rs][0]+'查看他的词语')
self.move(100,200)
self.show()
def TaoTai(self,text):
self.TTWA.setText(text)
def ChaKanCiZu(self):
self.CZJM = CiZhuJieMian()
for num in range(0,len(self.wjWord)):
self.CZJM.PB = QPushButton(self.wjWord[num][0],self.CZJM)
self.CZJM.PB.move(25,25+50*num)
self.CZJM.PB.clicked.connect(lambda:self.XianShi(self.sender().text()))
self.CZJM.PB.show()
for num in range(0,len(self.wjWord)):
self.CZJM.CiZu.append(QLabel(self.CZJM))
self.CZJM.CiZu[num].setGeometry(150,25+50*num,150,25)
self.CZJM.CiZu[num].show()
self.CZJM.show()
self.CZQR = QPushButton('确认',self.CZJM)
self.CZQR.move(225,25 + 50 * len(self.wjWord))
self.CZQR.clicked.connect(self.JMYC)
self.CZQR.show()
self.CZJM.setGeometry(400,175,325,25 + 50 * (len(self.wjWord) + 1))
self.CZJM.show()
def XianShi(self,name):
num = 0
for number in range(0,len(self.wjWord)):
if name == self.wjWord[number][0]:
break
else:
num += 1
self.CZJM.CiZu[num].setText(self.wjWord[num][2])
self.CZJM.repaint()
print(time.ctime())
print('查看:{}'.format(name))
print('结果:{}'.format(self.wjWord[num][2]), end='\n\n')
def JMYC(self):
self.CZJM.hide()
def CaiPan(self):
playerOut = self.TTWA.text()
playerlist = []
print('被投出的玩家:',playerOut)
print('好人:',playerOut in self.HaoRenCopy)
print('卧底:',playerOut in self.WoDiCopy)
print('白板:',playerOut in self.BaiBanCopy,end='\n\n')
if (playerOut in self.HaoRenCopy) == True:
self.HaoRenCopy.remove(playerOut)
if (playerOut in self.WoDiCopy) == True:
self.WoDiCopy.remove(playerOut)
if (playerOut in self.BaiBanCopy) == True:
self.BaiBanCopy.remove(playerOut)
if len(self.HaoRenCopy) == 0:
self.WDEG()
self.EG()
elif len(self.WoDiCopy) + len(self.BaiBanCopy) == 0:
self.title.hide()
self.SYWA.hide()
self.label.hide()
self.TTWA.hide()
self.Next.hide()
self.CC = QLineEdit(self)
self.CC.setPlaceholderText('卧底猜词')
self.CC.returnPressed.connect(self.YanZheng)
self.CC.setGeometry(25,25,350,25)
self.CC.show()
self.WoDiNames = QLabel('卧底:{}'.format(','.join(self.WoDi)),self)
self.WoDiNames.move(25,75)
self.WoDiNames.show()
self.BaiBanNames = QLabel('白板:{}'.format(','.join(self.BaiBan)),self)
self.BaiBanNames.move(25,125)
self.BaiBanNames.show()
self.QRbtn = QPushButton('确认', self)
self.QRbtn.move(400, 25)
self.QRbtn.clicked.connect(self.YanZheng)
self.QRbtn.show()
self.setGeometry(50, 100, 500, 175)
elif len(self.HaoRenCopy) + len(self.WoDiCopy) + len(self.BaiBanCopy) == 3:
self.WDEG()
self.EG()
playersnum = 0
for players in self.SYWAlist:
if players != playerOut:
playersnum += 1
else:
self.SYWAlist.remove(playerOut)
break
self.SYWA.removeItem(playersnum)
self.SYWA.setCurrentText('')
self.TTWA.setText('')
self.repaint()
def WDEG(self):
self.title.hide()
self.SYWA.hide()
self.label.hide()
self.TTWA.hide()
self.Next.hide()
self.WDBBSL = QLabel('卧底白板胜利', self)
self.WDBBSL.move(100, 50)
self.WDBBSL.show()
self.code = 1
self.setGeometry(100, 200, 275, 125)
def EG(self):
self.EndGame = EndGame()
self.EndGame.WFG.setText('好人词:{}'.format(self.words[0]))
self.EndGame.WFB.setText('卧底词:{}'.format(self.words[1]))
self.EndGame.HaoRen.setText('好人:{}'.format(','.join(self.HaoRen)))
self.EndGame.WoDi.setText('卧底:{}'.format(','.join(self.WoDi)))
self.EndGame.BaiBan.setText('白板:{}'.format(','.join(self.BaiBan)))
self.EndGame.show()
self.OM = OneMore()
self.OM.show()
self.OM.Ybtn.clicked.connect(self.ReStart)
print('')
def YanZheng(self):
CCCZ = self.CC.text()
if CCCZ == self.words[0]:
self.CC.hide()
self.QRbtn.hide()
self.WoDiNames.hide()
self.BaiBanNames.hide()
self.WDBBSL = QLabel('卧底白板胜利', self)
self.WDBBSL.move(100, 50)
self.WDBBSL.show()
self.code = 1
self.setGeometry(100, 200, 275, 125)
else:
self.CC.hide()
self.QRbtn.hide()
self.WoDiNames.hide()
self.BaiBanNames.hide()
self.HRSL = QLabel('好人胜利', self)
self.HRSL.move(105, 50)
self.HRSL.show()
self.code = 0
self.setGeometry(100, 200, 275, 125)
self.EG()
def ReStart(self):
self.EndGame.hide()
self.OM.hide()
if self.code == 0:
self.HRSL.hide()
if self.code == 1:
self.WDBBSL.hide()
self.FPCZ()
class showCZ(QWidget):
'''子界面 -- 显示玩家及词组'''
def __init__(self):
super().__init__()
self.playName = QLabel(self)
self.playName.setGeometry(50,35,150,25)
self.playsword = QLabel(self)
self.playsword.setGeometry(50,85,150,25)
self.nextbtn = QPushButton('确定',self)
self.nextbtn.move(150,110)
self.setGeometry(400,225,250,160)
self.setWindowTitle('谁是卧底')
class EndGame(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel('本轮回顾',self)
self.label.move(100,25)
self.WFG = QLabel(self)
self.WFG.setGeometry(25,75,200,25)
self.WFB = QLabel(self)
self.WFB.setGeometry(25,125,200,25)
self.HaoRen = QLabel(self)
self.HaoRen.setGeometry(25,175,200,25)
self.WoDi = QLabel(self)
self.WoDi.setGeometry(25, 225,200,25)
self.BaiBan = QLabel(self)
self.BaiBan.setGeometry(25,275,200,25)
self.setGeometry(400,225,250,325)
self.setWindowTitle('谁是卧底')
class OneMore(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel('是否再来一轮',self)
self.label.move(100,25)
self.Ybtn = QPushButton('是',self)
self.Ybtn.move(75,75)
self.Nbtn = QPushButton('否',self)
self.Nbtn.clicked.connect(self.No)
self.Nbtn.move(150,75)
self.setGeometry(100,400,275,125)
def No(self):
self.hide()
class CiZhuJieMian(QWidget):
def __init__(self):
super().__init__()
self.CiZu = []
if __name__ == '__main__':
app = QApplication(sys.argv)
game = SSWD()
sys.exit(app.exec_())
谢谢各位,也欢迎各位为我提更多建议和可以改善的地方。累死我了QAQ