用Python,PyQt5制作 谁是卧底

大家好,我是一名自学Python的高一学生,这是我写的第一篇博客,还请各位多多指教。本文中,我们将用Python制作一个谁是卧底的APP。我制作这个APP的初衷是在和小伙伴一起玩谁是卧底的时候,可以省略掉裁判这个角色,让所有人都可以一起来玩,所以发言方法和投票方法还是和卡片的方法一样的。

我们将用到:

  • sys(标准库)
  • random(标准库)
  • time(标准库)
  • PyQt5(第三方库)

目录

  • 制作思路
    • 词组导入
    • 输入玩家数量
    • 输入玩家昵称
    • 设置角色数量
    • 角色和词组的分配
    • 玩家查看词组
    • 淘汰人选以及重新查看词组
    • 游戏判定
      • 猜词界面
    • 结束界面
    • 本局回顾
    • 再来一局
  • 可添加功能
  • 完整代码

制作思路

  1. 导入将要使用的词组文件
  2. 制作 输入玩家数量 的界面
  3. 用得到的玩家数量制作 输入玩家昵称 的界面
  4. 制作 游戏设置 界面
  5. 随机分配角色并随机选择一组词组
  6. 制作 玩家查看词组 界面
  7. 制作 玩家淘汰 界面
  8. 判定游戏是否结束
  9. 结束 界面
  10. 本局回顾 界面
  11. 再来一局 界面

词组导入

使用 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循环列表 的方法可以确保玩家数量在什么数都可以完成界面的制作。

用Python,PyQt5制作 谁是卧底_第1张图片
用Python,PyQt5制作 谁是卧底_第2张图片

    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)中。

用Python,PyQt5制作 谁是卧底_第3张图片

    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

玩家查看词组

此处使用了子窗口,可以确保玩家仅查看自己的词组,而 查看的顺序就是之前打乱的顺序 。主窗口会显示 “请某某某查看他的词组” 并有一个 确认按键 ,按键点击之后,主窗口将隐藏并显示子窗口,子窗口将显示 玩家昵称玩家词组 以及 确认按钮。确认点击后,子窗口会隐藏并显示主窗口请下一位玩家查看。以此类推,直到所有玩家查看结束后,将直接前往 淘汰人选 界面。 (若玩家为白板,子界面将只显示 玩家昵称 和 确认按钮)

用Python,PyQt5制作 谁是卧底_第4张图片
用Python,PyQt5制作 谁是卧底_第5张图片

        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) 后面将显示 被选择的玩家昵称 以再次确认淘汰人选。按下确认按键后, 若界面没有变化代表游戏继续 (此时在的组合框中将不会再有被淘汰的玩家的昵称了)

用Python,PyQt5制作 谁是卧底_第6张图片

查看词组按键 被按下之后,将开启一个查看词组的子界面。界面中,玩家昵称以 按钮的形式 列着排序并有一个确认按钮。有着玩家昵称的按被钮点击后,将在 被点击的按钮旁边显示出这位玩家的词组 。确认按钮点击后,将关闭子窗口。

用Python,PyQt5制作 谁是卧底_第7张图片

    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 = []

游戏判定

只用之前创造的 好人,卧底,白板列表 判定游戏的胜负,被投出去的玩家将被从列表中移除。

  1. 好人 的列表空了,则卧底白板胜利,显示 结束界面再来一局本局回顾
  2. 若场上只剩下三人并任有卧底或白板活着,则卧底白板胜利,显示 结束界面再来一局本局回顾
  3. 卧底白板 的列表都空了,则进入猜词环节
    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 进入验证环节,并判定游戏的输赢,然后显示 判定结果 (结束界面)再来一局本局回顾

用Python,PyQt5制作 谁是卧底_第8张图片

        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)

结束界面

结束界面很简单就一段话 “好人胜利” 或者 “卧底胜利”本局回顾再来一局 会和结束界面一起显示。

用Python,PyQt5制作 谁是卧底_第9张图片
用Python,PyQt5制作 谁是卧底_第10张图片

    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()

本局回顾

通过子界面以及之前保存的列表显示出本局信息。

用Python,PyQt5制作 谁是卧底_第11张图片

    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('谁是卧底')

再来一局

此界面一样是用子窗口显示的,点击 将直接前往 角色和词组分配 ,点击 将关闭此窗口。

用Python,PyQt5制作 谁是卧底_第12张图片

    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

你可能感兴趣的:(python,游戏,pyqt5)