黄金点数 (二)

Week 9-10

项目进展

目前已经实现了黄金点游戏的基本功能,GUI用户界面也开发完成,但目前软件仅仅为本地客户端,接下来将进行GUI界面的优化,并实现C/S的运行模式。

代码分析

导入库

程序用python语言实现,用wxpython进行GUI设计

import wx
import math
from main import *

首先,创建一个wx.Frame对象。 wx.Frame 是重要的容器widget。 wx.Frame类是其他widget的父类。 它本身没有父类。 为层次结构中的顶级widget。 创建wx.Frame小部件之后,必须调用Show()方法才能在屏幕上实际显示。

class MyFrame(wx.Frame):

应用程序初始化

	def __init__(self):
        super().__init__(parent=None, title='黄金点数游戏',size = (450,300))
        #### 游戏数据
        self.player_num = 0
        self.golen_score = 0
        self.player_score = []
        self.player_input = []
        self.tmpId = 1
        self.maxId = -1
        self.minId = -1
        #### 组件
        panel = wx.Panel(self)
        self.txt = TransparentStaticText(panel,-1,label = 'hello world',pos=(10,10))
        self.txt.Hide()
        # self.txt1 = wx.StaticText(panel, -1, label='hello world', pos=(10, 10))
        self.strt_btn = wx.Button(panel, label='开始游戏', pos=(200, 125))
        self.ctnu_btn = wx.Button(panel,label = '继续游戏',pos = (30,220))
        self.show_btn = wx.Button(panel,label = '显示分数',pos = (180,220))
        self.exit_btn = wx.Button(panel,label = '结束游戏',pos = (320,220))
        self.ctnu_btn.Hide()
        self.show_btn.Hide()
        self.exit_btn.Hide()

        self.player_numText = wx.StaticText(panel,-1,label='请输入玩家人数',pos=(10,70),size=(-1,-1))
        self.player_numTxcl = wx.TextCtrl(panel,-1,value='',pos=(120,70),size = (100,20))
        self.pncm_btn = wx.Button(panel,label = '确定',pos = (240,70),size=(60,20))
        self.player_numText.Hide()
        self.player_numTxcl.Hide()
        self.pncm_btn.Hide()

        self.inputNotice = "请玩家'"+str(self.tmpId)+"'输入"
        self.inputText = wx.StaticText(panel,-1,label=self.inputNotice,pos=(10,70),size=(-1,-1))
        self.inputTxcl = wx.TextCtrl(panel,-1,value='',pos=(120,70),size = (100,20))
        self.input_btn =  wx.Button(panel,label = '确定',pos = (240,70),size=(60,20))
        self.inputText.Hide()
        self.input_btn.Hide()
        self.inputTxcl.Hide()

        self.batchString = "这局游戏的黄金点数是'"+str(self.golen_score)+"'\n最近的玩家是'"+str(self.minId)+"'\n最远的玩家是'"+str(self.maxId)+"'"
        self.batchText = wx.StaticText(panel,-1,label='',pos=(10,70),size=(-1,-1))
        self.batchText.Hide()

        self.player_scoreString = ""
        self.scoreText = wx.StaticText(panel,-1,label='',pos=(10,70),size=(-1,-1))
        self.scoreText.Hide()
        #### 绑定事件
        self.strt_btn.Bind(wx.EVT_BUTTON,self.onClickStrtButton)
        self.exit_btn.Bind(wx.EVT_BUTTON,self.onClickExitButton)
        self.player_numTxcl.Bind(wx.EVT_TEXT,self.getInputPlayerNum)
        self.pncm_btn.Bind(wx.EVT_BUTTON,self.onClickpncmButton)
        self.input_btn.Bind(wx.EVT_BUTTON,self.onClickInputButton)
        self.ctnu_btn.Bind(wx.EVT_BUTTON,self.onClickCtnuButton)
        self.show_btn.Bind(wx.EVT_BUTTON,self.onClickShowButton)
        self.Show()

“开始游戏”按钮被点击的事件处理函数

	def onClickStrtButton(self,event):
        self.strt_btn.Hide()
        self.ctnu_btn.Show()
        self.show_btn.Show()
        self.exit_btn.Show()
        self.player_numText.Show()
        self.player_numTxcl.Show()
        self.pncm_btn.Show()
        # print("hello world")

“继续游戏”按钮被点击的事件处理函数

    def onClickCtnuButton(self,event):
        self.minId = self.maxId = -1
        self.player_input = []
        self.tmpId = 1
        self.inputTxcl.SetValue('')
        self.inputNotice = "请玩家'" + str(self.tmpId) + "'输入"
        self.inputText.SetLabel(self.inputNotice)
        self.inputText.Show()
        self.input_btn.Show()
        self.inputTxcl.Show()
        self.batchText.Hide()
        self.scoreText.Hide()

“显示结果”

    def onClickShowButton(self,event):
        self.batchText.Hide()
        for i,score in enumerate(self.player_score):
            self.player_scoreString += "玩家'"+str(i+1)+"'的分数是'"+str(score)+"'\n"
        self.scoreText.SetLabel(self.player_scoreString)
        self.scoreText.Show()
        self.player_scoreString = ""

“退出游戏”

    def onClickExitButton(self,event):
        print('exit')
        self.Destroy()

输入参与游戏的总人数

    def getInputPlayerNum(self,event):
        self.player_num = int(self.player_numTxcl.GetValue())
        # print(self.player_num)
        pass

点击“确定”按钮,读取当前玩家输入

    def onClickpncmButton(self,event):
        self.player_numText.Hide()
        self.player_numTxcl.Hide()
        self.pncm_btn.Hide()
        for i in range(self.player_num):
            self.player_score.append(100)
        self.inputText.Show()
        self.input_btn.Show()
        self.inputTxcl.Show()

读取玩家输入,若全部完成则显示游戏结果

    def onClickInputButton(self,event):
        self.player_input.append(int(self.inputTxcl.GetValue()))
        print(self.player_input)
        self.tmpId += 1

        if (self.tmpId > self.player_num): #输入完了
            self.golen_score = sum(self.player_input)/self.player_num*0.618
            disList = [math.fabs(x-self.golen_score) for x in self.player_input]
            mx = -1.0
            mn = 110.0
            for i,x in enumerate(disList):
                if x>mx:
                    self.maxId = i
                    mx = x
                if x<mn:
                    self.minId = i
                    mn = x
            self.player_score[self.minId] += self.player_num
            self.player_score[self.maxId] -= 2
            print(self.golen_score)
            print(self.player_score)
            self.inputTxcl.Hide()
            self.inputText.Hide()
            self.input_btn.Hide()
            self.batchString = "这局游戏的黄金点数是'" + str(self.golen_score) + "'\n最近的玩家是'" + str(
                self.minId+1) + "'\n最远的玩家是'" + str(self.maxId+1) + "'"
            self.batchText.SetLabel(self.batchString)
            self.batchText.Show()
            return
        self.inputTxcl.SetValue('')
        self.inputNotice = "请玩家'" + str(self.tmpId) + "'输入"
        self.inputText.SetLabel(self.inputNotice)

若为直接调用,则运行程序

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.MainLoop()

参考文档

wxPython tutorial http://zetcode.com/wxpython/

posted @ 2020-11-02 17:12  YUiiii  阅读(42)  评论(0)    收藏  举报