想法:先做一个登陆界面,输入账号密码进行登陆,可注册新账号,登陆后进入到互动界面,互动包括猜拳、猜数字、词语接龙。
(自己一步步写写改改的,代码可能有啰嗦的地方和一些未知小问题,暂时未发现大毛病)
import PySimpleGUI as Sg
import random
Sg.theme('LightBlue2') # 选择界面主题
user_dict = {'1': '1', '2': '2'} # 存放账号密码
一、界面设计
1.登陆界面:
layout1 = [
[Sg.Text(font=10)],
[Sg.Text('账号:', font=30), Sg.InputText(font=30, key='user', size=20)],
[Sg.Text('密码:', font=30), Sg.InputText(font=30, key='pwd', size=20, password_char='*')],
[Sg.Text(' ', font=10)],
[Sg.Button('登陆', font=10), Sg.Button('清空', font=10), Sg.Button('注册', font=10)],
]
window1 = Sg.Window('登陆界面', layout1, font='微软雅黑')
2.注册界面:
layout2 = [
[Sg.Text()],
[Sg.Text(' 新账号:', font=30), Sg.InputText(font=30, size=20, key='new-user')],
[Sg.Text(' 密码:', font=30), Sg.InputText(font=30, size=20, key='new-pwd', password_char='*')],
[Sg.Text('再次确认:', font=30), Sg.InputText(font=30, size=20, key='double-check', password_char='*')],
[Sg.Text(' ', font=10, key='r')],
[Sg.Button('确认注册', font=15)]
]
window2 = Sg.Window('注册界面', layout2, font=('微软雅黑', 20))
window2_active = False
3.互动界面:
layout3 = [
[Sg.Text(font=1)],
[Sg.Text(font=1), Sg.Multiline(size=(30, 15), font=10, reroute_cprint=True, disabled=True)],
[Sg.Text(font=1), Sg.InputText(font=1, size=30, key='user-input'), Sg.Button('发送', font=10, size=5)],
[Sg.Button('猜拳', font=15, size=10), Sg.Button('猜数字', font=15, size=10),
Sg.Button('词语接龙', font=15, size=10)],
[Sg.Text(font=1)],
]
window3 = Sg.Window('互动界面', layout3, font=('微软雅黑', 20))
window3_active = False
4.界面一览:
二、功能实现
1.登陆界面
点击“登陆”时:账号没填或密码没填………………相应弹窗提示
账号不存在…………………………弹窗提示“账号未注册”
账号存在但密码错误………………弹窗提示“账号或密码错误”
输入的账号和密码相匹配…………直接打开互动界面
if event == '登陆':
u = values['user'] # 获取输入的账号密码
p = values['pwd']
if u == '' or p == '': # 没填完账号密码
Sg.popup('请输入账号和密码')
elif u not in user_dict: # 判断账号不存在
Sg.popup('账号未注册')
elif p != user_dict[u]: # 有账号但密码错误
Sg.popup('账号或密码错误')
else:
window3_active = True # 账号密码匹配,打开互动界面
window1.close()
点击“清空”时:清空已输入的账号和密码
if event == '清空': # 清空所输入的账号和密码
window1['user'].update('')
window1['pwd'].update('')
点击“注册”时:打开注册界面
if event == '注册':
window2_active = True # 打开注册界面
2.注册界面
点击“确认注册”时:新账号已存在……………………弹窗提示“该账号已注册”
两次输入的密码不同……………清空内容并弹窗提示“密码错误,请重新确认”
新账号成功注册…………………把账号密码记入字典,弹窗提示,关闭界面
while True:
event, values = window2.read()
if event is None: # 关闭注册界面
break
if event == '确认注册':
nu = values['new-user'] # 获取输入的账号密码
np = values['new-pwd']
dc = values['double-check']
if nu in user_dict:
Sg.popup('该账号已注册')
elif np != dc: # 密码与重新输入的不同
window2['new-pwd'].update('') # 清空内容重输
window2['double-check'].update('')
window2['r'].update('密码错误,请重新确认')
else:
user_dict[nu] = np # 密码确认后,将新的账号和密码记入用户字典
Sg.popup('注册成功')
window2.close()
continue
3.互动界面
放在循环外的
order = '' # 互动指令(猜拳、猜数字、词语接龙)
num = random.randint(1, 100) # 猜数字随机生成1-100整数
w2 = '' # 词语接龙中电脑的上一轮回答
点击“猜拳”、“猜数字”或“词语接龙”后,指令对应
if event == '猜拳':
Sg.cprint('正在猜拳,请输入石头、剪刀或布………………………………………')
order = '猜拳'
if event == '猜数字':
Sg.cprint('请猜1-100的整数')
Sg.cprint('………………………………………')
order = '猜数字'
if event == '词语接龙':
Sg.cprint('开始词语接龙,请输入词语')
Sg.cprint('………………………………………')
w2 = ''
order = '词语接龙'
点击“发送”时,获取输入的内容并清空输入框,再根据当前指令进入对应循环
if event == '发送': # 点击发送时
u_i = values['user-input'] # 获取输入
Sg.cprint('我:', u_i)
window3['user-input'].update('') # 清空输入
猜拳:输入不正确………………提示“请输入石头、剪刀或布”
输入正确…………………随机给出回复,判断输赢和平局
if order == '猜拳':
choice = ('石头', '剪刀', '布')
if u_i not in choice: # 输入的不是石头剪刀布
Sg.cprint('小Q:请输入石头、剪刀或布')
else:
c_a = random.choice(choice) # 随机给出
Sg.cprint('小Q:', c_a)
if u_i == '石头' and c_a == '剪刀' or u_i == '剪刀' and c_a == '布' or u_i == '布' and c_a == '石头':
Sg.cprint('…………………………你赢了!')
elif u_i == c_a:
Sg.cprint('…………………………平局了!')
else:
Sg.cprint('…………………………你输了!')
猜数字:循环外已经生成第一轮的随机整数
输入不正确………………提示“请输入1-100的整数”
猜大了、猜小了…………相应提示
猜对了……………………相应提示,并生成下一轮的随机数
elif order == '猜数字':
if u_i.isdigit(): # 输入的是数字
num1 = int(u_i) # 换成整数
if 1 <= num1 <= 100:
if num1 == num:
Sg.cprint('…………………猜对了,下一轮')
num = random.randint(1, 100) # 生成下一轮的随机数
elif num1 > num:
Sg.cprint('……………………………猜大了')
else:
Sg.cprint('……………………………猜小了')
else: # 输入的不是数字
Sg.cprint('小Q:请输入1-100的整数')
词语接龙:循环外存储上一轮的回复(判断为输或赢后把值清除)
用于存储词语的文本文件(里面的字用“,”隔开)
输入不正确……………………………………提示“请输入词语”
输入的首字不等于上一轮尾字………………判断为输
文件内没找到符合的词语……………………判断为赢
elif order == '词语接龙':
w0 = u_i[0] # 输入的首字
if u_i.isdigit() or len(u_i) < 2: # 输入的不是词语
Sg.cprint('小Q:请输入词语')
elif w2 != '' and w0 != w2[-1]:
Sg.cprint('……………………输啦,下一轮')
w2 = '' # 清空进行下一轮
else:
w1 = u_i[-1] # 输入的尾字
word_option = [] # 词语备选列表
with open("词语接龙.txt", "r", encoding="utf8") as f:
ws = f.read().split(",")
for word in ws: # 符合的词语记录到列表中
if word[0] == w1: # 首字与输入的尾字相同
word_option.append(word) # 加入列表
if not word_option: # 可选词语为空
Sg.cprint('……………………你赢啦,再来')
w2 = '' # 清空进行下一轮
else:
w2 = random.choice(word_option) # 随机回复符合的词语
Sg.cprint('………………………小Q:', w2)
else:
Sg.cprint('请先选择游戏')