猜数字小游戏——左右互搏术

猜数字_Shoot_and_Catch_03.1.1

main.py

import random, sys, time
from con1 import *
from npc import *
from stall import *
from game import *
from settlement import *

game  = Game()

while game.stall.victory and game.stall.crowd[0].over:    
    game.update()
    time.sleep(SLEEPTIME)#
    a = Settlement(game)
    time.sleep(SLEEPTIME)#
    print(f"\n------结束运行------\n")
    if play_again():
        print("为您呈现!\n\n")
        game  = Game()
    else:
        print("期待您下次降临")
        
exit()

game.py

import random, time
from con1 import *
from game import *
from npc import *
from stall import *

class Game():
    def __init__(self):
        self.stall = Stall(2)
        print("------摊位加载完成!------\n")

    def update(self):
        if self.stall.crowd[0].over:
            time.sleep(SLEEPTIME)
            self.inputt()
        while self.stall.victory and self.stall.crowd[0].over:
            self.stall.update()
            #print("------游戏结束啦------")

    def inputt(self):
        print(f"请悄悄告诉摊主{self.stall.crowd[0].name}一个{min(RANGE)}~{max(RANGE)}之间的整数")
        while True:
            try:
                number = int(input())#random.randint(1,9)
                if number in RANGE:
                    self.stall.crowd[0].remember(number)# 摊主行为
                    time.sleep(SLEEPTIME)
                    print(f"{self.stall.crowd[1].name}努力侧耳倾听,但是什么也没听到")
                    return number
                else:
                    print(f"请重新告诉{self.stall.crowd[0].name}一个{min(RANGE)}~{max(RANGE)}之间的整数")
            except ValueError:
                print("你看看你输入了个什么(请重新输入)!")

stall.py

游戏机制。

之所以叫做“摊位”的原因是,“小镇”的“造物主”患有一定程度的中二病,在写这段代码时刚好发作了。

“水果摊”:猜数字游戏的游戏机制。

其它摊位暂未创造。

import random, time
from con1 import *
from npc import *

class Stall:# 摊位
    def __init__(self, se):
        self.stallname = "水果摊"
        self.seat = se # 座位
        self.crowd = [] # 人群列表
        self.victory = True # 结束开关
        self.counter = 0 # 计次器
        self.vendor = self.generate_vendor(0) # 摊主
        self.crowd.append(self.vendor) # 追加摊主到人群列表
        self.vendorname = self.vendor.name # 摊主名
        for i in range(1, self.seat):
            player = self.generate_player(self.vendorname, i)
            self.crowd.append(player)
    
    def update(self):
        print("\n------游戏开始!------")
        self.crowd[0].he = f"{self.crowd[1].name}"
        self.crowd[1].listt = RANGE
        mm = 0
        while self.crowd[0].over and self.victory:
            time.sleep(SLEEPTIME)
            self.counter += 1# 计次器递加
            print(f"\n------{self.crowd[1].name}的第{self.counter}次尝试------")
            nn = self.crowd[1].guess(mm)# 玩家行为
            mm = self.crowd[0].compare(nn)# 摊主行为
            self.close()# 城管行为

    def generate_vendor(self, idx):# 生成摊主NPC
        npcname = random.randint(0, NPCName.MAX - 1)
        npctype = NPCType.VENDOR
        vendor = NPC(npcname, npctype, idx)
        print(f"摊主{vendor.name}开启了{self.stallname}")
        return vendor
    
    def close(self):# 打烊检测
        if self.crowd[0].over and self.counter >= DIFFICULTY:
            self.victory = False# 关闭摊位
            return print(f"------啊喔,{self.stallname}打烊了------")
        elif self.crowd[0].over:
            return print("------继续吧------")
        else:
            return print("------嗷耶------")

    def getover(self):
        return self.crowd[0].over
    
    def generate_player(self, vendorname, idx):# 生成玩家NPC
        npcname = random.randint(0, NPCName.MAX - 1)
        i = 0
        while NPCNAME[npcname] == vendorname:
            i += 1
            npcname = random.randint(0, NPCName.MAX - 1)
        npctype = NPCType.PLAYER
        player = NPC(npcname, npctype, idx)
        print(f"游客{player.name}来到{self.stallname}光顾了")
        return player

npc.py

NPC类。“摊主”和“游客”这两种类型的NPC皆诞生自同一个构造函数,每个NPC都拥有全部的NPC方法,但是只根据自己的身份属性“选择性表达”符合自己身份的函数。

import random
from con1 import *

class NPC:
    def __init__(self, name, identity, idx):
        self.name = NPCNAME[name]
        self.number = None
        self.identity = identity# 身份
        self.idx = idx
        self.he = "你"
        self.over = True
        self.listt = RANGE
        self.listtt = RANGE
        self.listx = []
        self.prompt = 0
            
    def remember(self, num):# 0摊主行为
        self.number = num
        print(f"一个天外之音传入了{self.name}耳中\n{self.name}记住了一个数字:{self.number}")
    
    def compare(self, bb):# 0摊主行为
        if self.number == bb:
            print(f"{self.name}:{self.he}猜对啦!恭喜你!")
            self.over = False
        elif self.number > bb and self.number - bb > PROMPT_THRESHOLD:
            print(f"{self.name}:{self.he}猜的数字太小啦。")
            self.prompt = 1
        elif self.number > bb and self.number - bb <= PROMPT_THRESHOLD:
            print(f"{self.name}:{self.he}猜的数字有一点点小哦。")
            self.prompt = 2
        elif self.number < bb and bb - self.number > PROMPT_THRESHOLD:
            print(f"{self.name}:{self.he}猜的数字太大啦。")
            self.prompt = 3
        elif self.number < bb and bb - self.number <= PROMPT_THRESHOLD:
            print(f"{self.name}:{self.he}猜的数字有一点点大哦。")
            self.prompt = 4
        return self.prompt
        
    def guess(self, mm):# 1玩家行为
        self.reasoning(mm)
        self.listt = self.listtt
        self.number = random.choice(self.listt)#int(input())
        print(f"{self.name}:是数字 {self.number} 吗")
        return self.number
    
    def reasoning(self,mm):# 1玩家行为
        if mm == 1:
            self.listx = (list(range(self.number + PROMPT_THRESHOLD + 1, max(RANGE) + 1)))
            self.listtt = [i for i in self.listx if i in self.listt]
            print(f"{self.name}在心里把范围缩小为{self.listtt}")
        elif mm == 2:
            self.listx = (list(range(self.number + 1, max(RANGE) + 1)))
            self.listtt = [i for i in self.listx if i in self.listt]
            print(f"{self.name}在心里把范围缩小为{self.listtt}")
        elif mm == 3:
            self.listx = (list(range(min(RANGE), self.number - PROMPT_THRESHOLD)))
            self.listtt = [i for i in self.listx if i in self.listt]
            print(f"{self.name}在心里把范围缩小为{self.listtt}")
        elif mm == 4:
            self.listx = (list(range(min(RANGE), self.number)))
            self.listtt = [i for i in self.listx if i in self.listt]
            print(f"{self.name}在心里把范围缩小为{self.listtt}")
        

settlement.py

结算机制。

“正常通过”:摊位关闭之前猜对,游戏胜利;

“欧皇”:一次就猜对,触发“欧皇彩蛋”,游戏胜利;

“打烊”:摊位关闭之前没有猜对,游戏失败;

“压线通过”:摊位关闭时刚好猜对,游戏胜利。

import random, sys
from con1 import *
from npc import *
from stall import *
from game import *
from easteregg import *

class Settlement():
    def __init__(self, nn):
        self.nn = nn
        self.cou = self.nn.stall.counter
        self.pla = self.nn.stall.crowd[0].he
        self.v = self.nn.stall.victory
        if self.v and self.cou == 1:
            print(f"\n游戏结束!{self.pla}只用了{self.cou}次就猜对啦\n欧欧欧欧欧皇!!!!")
            Easter()
        elif self.v and self.cou < DIFFICULTY:
            print(f"\n游戏结束!{self.pla}只用了{self.cou}次就猜对啦\n恭喜!")
        elif self.v and self.cou == DIFFICULTY:
            print(f"\n游戏结束!{self.pla}一共猜了{self.cou}次\n好险好险,压线通过了~\n天选栀子^-^")
        elif not self.v:
            print(f"\n游戏结束!{self.pla}一共猜了{self.cou}次都没有猜对\n非酋...")

def play_again():
    while True:
        user_input = input("你想要再次观看舞台剧吗? (yes,y,是 / no,n,否):\n")
        if user_input.lower() in ["y", "yes", "是", "对"]:
            print("来咯!\n")
            return True
        elif user_input.lower() in ["n", "no", "否", "不"]:
            print("慢走!\n")
            return False
        else:
            print("请输入: y, yes, 是, 对\n或输入: n, no, 否, 不\n")

def exit():
    print("(剧场已落幕)\n(按下任意字母键立即退出)")
    ex = 0
    while ex <= 30:
        if input().isalpha():
            break
        else:
            print("(剧场已落幕)\n(按下任意字母键立即退出)")
        ex += 1

con1.py

常量

import random
class NPCType:    
    PLAYER = 1
    VENDOR = 0

class NPCName:
    QQ = 0
    WW = 1
    EE = 2
    RR = 3
    TT = 4
    YY = 5
    UU = 6
    MAX = 7
    
NameOrder = list(range(0, 7))

NPCNAME = {
    NPCName.QQ : "白塘",
    NPCName.WW : "啸软",
    NPCName.EE : "啸福吱",
    NPCName.RR : "囝北",
    NPCName.TT : "祈白",
    NPCName.YY : "笙蜂",
    NPCName.UU : "锌钛",
    NPCName.MAX: "--"
}

RANGE = list(range(0, 1000))

SLEEPTIME = 0.5
PROMPT_THRESHOLD = int((max(RANGE) - min(RANGE)) * 0.26 + 1.3)# 提示阈值
DIFFICULTY = int(len(RANGE) * 0.2 + 2.3)# 难度
#print(f"{min(RANGE)} {max(RANGE)} {PROMPT_THRESHOLD} {DIFFICULTY}")

EASTER = {0 : "\n欧皇一出,谁与争锋,简直就是人生赢家!",
1 : "\n欧皇的运气真是让人羡慕嫉妒恨啊!",
2 : "\n欧皇的幸运值爆表,简直是行走的幸运星!",
3 : "\n欧皇的人生真是无法用语言来形容了,只能默默献上膝盖!",
4 : "\n欧皇的运气真是让人感叹,难道这是天选之人吗!",
5 : "\n欧皇就像是一个永不停歇的幸运机器,让人无法企及!",
6 : "\n面对欧皇的幸运,我只能说声佩服,真的是太厉害了!",
7 : "\n欧皇的运气就像开了挂一样,让人望尘莫及!",
8 : "\n欧皇的幸运值爆表,简直是幸运的化身!",
9 : "\n欧皇的运气真是让人又爱又恨啊,让人羡慕不已!"}

easteregg.py

彩蛋的函数

import time
from con1 import *

class Easter():
    def __init__(self):
        self.i = 0
        while self.i <= 9:
            print(EASTER[self.i])
            self.i += 1
            time.sleep(0.3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值