【Python学习笔记】猜颜色小游戏

前言


最近馋世界游戏大全51,心血来潮用Python写了个猜颜色,顺便扩展了难度(颜色数和可重复性)

一、算法原理


1. 生成器部分

利用ramdom库生成随机数列,并且用字典计数来保证最大重复值

2. 检测器部分

检测包括"全部正确"和"部分正确",全部正确即位置,字符内容均相同,部分正确可以通过字典计数,生成颜色字典输入颜色字典同一颜色的最小值之和为重合颜色数,再减去全部正确数即为部分正确数

二、代码


代码如下(复制直接玩 美滋滋):

import random
n = 6
t = 1
number = 0
gamestr = ''
guessstr = ''
break_flag = False
color = ['红','橙','黄','绿','青','蓝','紫']
color3 = ['红','橙','黄','绿','青','蓝','紫']
colordict = {'红':0,'橙':0,'黄':0,'绿':0,'青':0,'蓝':0,'紫':0}

def Getnumber():
    global number
    number = int(input('猜谜个数:'))
    while number < 0:
        print('你输入数非正整数,闹呢?请重新输入!')
        number = int(input('猜谜个数:'))
    return(number)

def repeatability(number):
    repeatability = int(input('最多重复个数:'))
    while (repeatability < 0)or(repeatability > number):
        print('不合规范')
        repeatability = int(input('最多重复个数:'))

def Generate():
    global n
    global colordict
    b = random.randint(0,n)
    genout = color[b]
    colordict[color[b]]+=1
    if colordict[color[b]] == repeatability:
        color.pop(b)
        n -= 1
    return genout

def ALLTRUECALI(guessstr,number):
    ATC=0
    for i in range(0,number):
        if gamestr[i] == guessstr[i]:
            ATC += 1
    return ATC

def HALFTRUECALI(guessstr,number,ATC):
    HTC=0
    color2 = ['红', '橙', '黄', '绿', '青', '蓝', '紫']
    guess_dict={'红':0,'橙':0,'黄':0,'绿':0,'青':0,'蓝':0,'紫':0}
    for i in range(0,number):
        guess_dict[guessstr[i]] += 1
    for i in range(0,7):
        c = min(guess_dict[color2[i]],colordict[color2[i]])
        HTC += c
    HTC -= ATC
    return HTC

def fault_calibrate(guessstr,ATC,HTC):
    print('本次猜测,%d个全对,%d个半对'%(ATC,HTC))

def Errordetector(guessstr):
    global break_flag
    break_flag = False
    if len(guessstr)!=len(gamestr):
        break_flag = True
        print('字符错误,请重新输入')

    else:
        for i in range(0,number):
            count = 0
            for j in range(0,7):
                if guessstr[i] == color3[j]:
                    count += 1
            if count != 1:
                print('您输入的颜色不在范围内,请重新输入')
                break_flag = True
                break
    return(break_flag)
    
def main():
    number = Getnumber()
    repeatability(number)
    global gamestr
    for i in range(0,number):
        gamestr += Generate()

    first = True
    guessstr = ""
    t = 0

    while (guessstr != gamestr)or(first == True):
        guessstr = input('请输入你的猜测:')

        first = False
        break_flag = Errordetector(guessstr)
        if break_flag:
            continue
        t += 1
        ATC = ALLTRUECALI(guessstr, number)
        HTC = HALFTRUECALI(guessstr, number, ATC)
        fault_calibrate(guessstr, ATC, HTC)

    print('恭喜您,共耗费%d次机会猜测成功!'%(t))

if __name__=='__main__':
    main()

过程BUG汇总笔记


  1. 变量名太乱了,导致最早调用错误
  2. 函数体内想要改变全局变量需要声明global
  3. random.randint()函数的取值是闭区间,与range()左闭右开不同

总结


初学Python,至少能玩!但是函数用的满僵的,写的也不好看,望大佬斧正 :3

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值