猜数字_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)