python登陆系统及小游戏互动

想法:先做一个登陆界面,输入账号密码进行登陆,可注册新账号,登陆后进入到互动界面,互动包括猜拳、猜数字、词语接龙。

(自己一步步写写改改的,代码可能有啰嗦的地方和一些未知小问题,暂时未发现大毛病)

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('请先选择游戏')

三、成果展示

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值