软件工程课程设计_第九周
小组成员
姓名 | 学号 |
---|---|
罗正 | 2018141461092 |
张伯威 | 2018141461065 |
黄金点游戏UI界面
设计要求
- N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
- 采用单机方式实现,提供简单UI界面
- 十个人进行十轮,每轮过后将没跟的分数打印出来
开发环境
使用Python语言及其自带UI库开发
设计思路
- 使用Python自带的tkinter UI库
- Label组件获取用户输入的数字
- Entry组件打印信息
- Button获取用户动作
代码展示
import tkinter as tk
class goldpoint:
def __init__(self):
#分数列表
self.pointList = []
self.players = 10
for i in range(self.players):
self.pointList.append(0)
# 写入十个人输入的数据,计算黄金点
def wrtitenum(self,times,numberList:list)->list:
if times < 10:
average = 0
closestNumber = 0
fartherNumber = 0
closestSub = 100
fartherSub = 0
for i in range(len(numberList)):
average = average + float(numberList[i])
average = average / 10 * 0.618
for i in range(len(numberList)):
playerSub = abs(float(numberList[i]) - average)
if i == 0:
closestSub = fartherSub = playerSub
closestNumber = fartherNumber = 0
else:
if playerSub < closestSub:
closestNumber = i
if playerSub > fartherSub:
fartherNumber = i
print("Win:", closestNumber, "Lose:", fartherNumber)
self.pointList[closestNumber] = self.pointList[closestNumber] + 10
self.pointList[fartherNumber] = self.pointList[fartherNumber] - 2
return [average,closestNumber,fartherNumber]
# 获得目前分数列表
def getscore(self):
return self.pointList
class myGUI:
def __init__(self):
# 窗口
self.windows=tk.Tk()
self.windows.title('黄金点游戏')
self.framelist=[]
self.labellist=[]
self.entrylist=[]
self.numlist=[1]*10
self.pointlist=[]
self.gp=goldpoint()
self.times=0
self.showlablevalue=[]
self.showlable = []
self.windows.geometry('600x480')
for i in range(10):
self.pointlist.append(0)
for i in range(10):
self.framelist.append(tk.Frame(self.windows))
self.labellist.append(tk.Label(self.framelist[i],text='请第'+str(i)+'个人输入'))
self.entrylist.append(tk.Entry(self.framelist[i], show='*',width=10))
self.showlablevalue.append(tk.StringVar())
self.showlable.append(tk.Label(self.framelist[i], textvariable=self.showlablevalue[i]))
self.labellist[i].pack(side='left')
self.entrylist[i].pack(side='left')
self.showlable[i].pack(side='right')
self.framelist[i].pack()
self.calFrame=tk.Frame(self.windows)
self.calbt=tk.Button(self.calFrame,text='计算',command=self.cal)
self.calbt.pack()
self.calFrame.pack()
self.bottomFrame=tk.Frame(self.windows)
self.resultvalue=tk.StringVar()
self.resultlabe=tk.Label(self.bottomFrame,textvariable=self.resultvalue)
self.resultlabe.pack()
self.bottomFrame.pack()
# 当计算按钮被点击后触发的函数,计算黄金点以及每个人的分数
def cal(self):
for i in range(10):
self.numlist[i]=float(self.entrylist[i].get())
if self.times<10:
result=self.gp.wrtitenum(self.times,self.numlist)
self.resultvalue.set('goldpoint: '+str(result[0])+' Win: '+str(result[1])+' Lose: '+str(result[2]))
self.pointlist=self.gp.getscore()
for i in range(3):
print(result[i])
for i in range(10):
self.entrylist[i].delete(0,"end")
self.showlablevalue[i].set('第' + str(i) + '个人的分数是:' + str(self.pointlist[i]))
print(self.pointlist[i])
self.times+=1
print("times=",self.times)
#超过十次之后,可以再添加一些重新开始之类的选项,目前还没想好,后续可以再补充
else:
print('times>10')
def gamerun(self):
self.windows.mainloop()
test=myGUI()
test.gamerun()
效果展示
- 第一次输入:
- 计算一次之后:
有待改进
- UI 界面比较简陋,不够精美
- 当用户输入10次之后,没有设置如重新开始等选项