目录
实验一西游游戏-对象
1,选择角色后,角色不能改
2,选择角色后,角色可以改
实验二猜拳游戏-对象
实验一西游游戏-对象
老师给的题目材料:
第一步:系统登录
失败时允许重复输入三次!
第二步:系统登录成功后,展示西游记的游戏菜单
欢迎进入西游记游戏
1. 选择角色(1.唐僧,2.孙悟空,3.猪八戒,4.沙和尚)
2. 角色属性查询(1.唐僧,2.孙悟空,3.猪八戒,4.沙和尚)
3. 游戏帮助
4. 退出游戏
请选择游戏菜单:
第三步:在西游记的游戏菜单页面,选择查询英雄属性,并输出相应的属性值
角色名称 攻击力 防御力 装备 生命值
唐僧 100 600 裟锦襕袈裟,九环锡杖 500
孙悟空 800 300 如意金箍棒 900
猪八戒 500 400 九齿钉耙 600
沙和尚 300 500 降妖宝杖 500
需求分析】
1.为每个角色加上经验值信息,所有角色的初始经验值为0。
2.使用变量存储每个角色的信息。
3.通过变量输出角色列表的信息,使用变量格式化输出。
【实现思路】
声明变量
为变量赋值
使用变量
需求分析】
装备有攻击力和防御力
角色的总攻击力 = 自身的攻击力+所有装备的攻击力,
角色的总防御力 = 自身的防御力+所有装备的防御力
比较2个角色总攻击力和总防御力的大小,输出比较结果。
【实现思路】
使用算术运算符计算角色的总攻击力和总防御力。
使用比较运算符比较角色的总攻击力和防御力。
不同的人有不同的实现思路和实现效果(界面),所以这篇文章中的代码仅供参考,如有不足,请指出,谢谢。下面两个代码的不同之处就在选择角色之后,角色是否能够修改。
1,选择角色后,角色不能改
效果:
代码:
# -*- encoding: utf-8 -*-
class Ts: # 唐僧
initial_experience=0 # 初始经验0
def __init__(self): # 构造方法
pass
name="唐僧"
attack = 100
defense = 600
str_zb1 = "裟锦襕袈裟"
str_zb2 = "九环锡杖"
life = 500
class Swk: #孙悟空
initial_experience=0 # 初始经验
def __init__(self):
pass
name="孙悟空"
attack = 100
defense = 600
str_zb1 = "如意金箍棒"
life = 500
class Zbj: #猪八戒
initial_experience=0 # 初始经验
def __init__(self):
pass
name="猪八戒"
attack = 500
defense = 400
str_zb1 = "九齿钉耙"
life = 600
class Shs: #沙和尚
initial_experience=0 # 初始经验
name="沙和尚"
def __init__(self):
pass
attack = 300
defense = 500
str_zb1 = "降妖宝杖"
life = 500
def printMC(OB): # 打印角色名称的方法
print(f"当前选中角色:{OB.name}")
def printSX(ob): # 打印属性的方法
print(f"{ob.name}" + " " * 5 +
f"{ob.attack}" + " " * 5 +
f"{ob.defense}" + " " * 4 +
f"{ob.str_zb1}" + " " * 10 +
f"{ob.life}" + " " * 4+
f"{ob.initial_experience}")
def printSXsult1(ob1,ob2,str):
if(str=="attack"):
str2="总的攻击力"
else:
str2="总的防御力"
print(f"{ob1.name}比{ob2.name}的{str2}大")
if(ob1==ob2):
print(f"两个角色的{str2}相同")
def judgeAtackDefence(OB,ds,str): # str用于决定该方法是进行攻击力判断还是防御力判断
if (OB.name == ts.name): # 唐僧有两套装备
ob_total = getattr(OB,str)+ 100 * 2
ds_total = getattr(ds,str) + 100
if(ob_total>ds_total):
printSXsult1(OB,ds,str)
elif(ob_total<ds_total):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
elif (ds.name == ts.name):
ob_total = getattr(OB,str) + 100
ds_total = getattr(ds,str) + 100 * 2
if(ob_total>ds_total):
printSXsult1(OB,ds,str)
elif(ob_total<ds_total):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
else: # 双方均只有一个装备,就肉搏,纯靠自身攻击力力或防御力
if (getattr(OB,str) > getattr(ds,str)):
printSXsult1(OB,ds,str)
elif (getattr(OB,str) < getattr(ds,str)):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
if __name__ == '__main__':
ts=Ts # 唐僧对象
swk=Swk #孙悟空对象
zbj=Zbj #猪八戒对象
shs=Shs #沙和尚对象
num_login = 3 # 输错之后还剩下的输入次数
str_login = "" # 存放登录成功的提示
user = "admin"
passwd = 123
for i in range(1, num_login + 1):
try: #捕获用户输入的异常
username = input("please the enter user:") # 输入用户名
password = int(input("please the enter passwd:")) # 输入密码
except Exception as ex:
print("输入异常")
else:
if username == user and password == passwd:
print("login successfull")
str_login += "login successfull"
break # 如果输入成功后直接跳出for循环
else:
print("login failed")
str_login += "login failed"
if (num_login - i > 0):
print("您还有%d次机会,请重新输入" % (num_login - i))
else: # 机会用完之后给出提示
print("抱歉,您的机会已用完")
if (str_login == "login successfull"):
print("欢迎进入西游记游戏\n"
f"1.选择角色(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name})\n"
f"2.角色属性查询(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name})\n"
"3.游戏帮助\n"
"4.退出游戏\n"
"5.属性比较【注意;用户需要先创建选中角色才能够进行属性比较】")
str_js_title = "角色名称"+" "*3+"攻击力"+" "*3+"防御力"+" "*3+"装备"+" "*14+"生命值"+" "*3+"经验值" # 属性抬头
OB = None # 空对象,
ar_jsmc=[f"{ts.name}",f"{swk.name}",f"{zbj.name}",f"{shs.name}"] # 后期用于角色之间攻击力,防御力的比较
while(1): # 死循环
try: # 捕获用户输入的异常
num_choose_1 = int(input("选择游戏菜单:"))
except Exception as ex:
print("输入异常:输入非数字")
else:
if (num_choose_1 == 1): #选角,一旦选中就不可更改
if(OB is None): #实现选中角色后不可再被赋值给OB
try: # 捕获用户输入的异常
num1_choose_2 = int(input(f"选择角色(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name}):"))
except Exception as ex:
print("输入异常:输入非数字")
else:
if (num1_choose_2 == 1):
OB=ts # 将用户选中的角色对象赋值给OB常量对象
printMC(OB)
elif (num1_choose_2 == 2):
OB=swk
printMC(OB)
elif (num1_choose_2 == 3):
OB=zbj
printMC(OB)
elif (num1_choose_2 == 4):
OB= shs
printMC(OB)
else:
print("该数字无对应角色,请输入1-4之间的数字")
continue # 继续下一个死循环
else:
print(f"已选中角色:{OB.name}")
continue # 继续下一个死循环
elif (num_choose_1 == 2): # 属性
num2_choose_2 = int(input(f"角色属性查询(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name}):"))
print(str_js_title) # 角色属性抬头
if (num2_choose_2 == 1): # 打印唐僧属性
print(f"{ts.name}"+" "*6+f"{ts.attack}"+" "*6+f"{ts.defense}"+" "*3+f"{ts.str_zb1},{ts.str_zb2}"+" "*3+f"{ts.life}"+" "*6+f"{ts.initial_experience}")
elif (num2_choose_2 == 2):
ob=Swk
printSX(ob)
elif (num2_choose_2 == 3):
ob=Zbj
printSX(ob)
elif (num2_choose_2 == 4):
ob=Shs
printSX(ob)
elif (num_choose_1 == 3): # 帮助
print(("装备有攻击力和防御力\n" \
"角色的总攻击力 = 自身的攻击力+所有装备的攻击力\n" \
"角色的总防御力 = 自身的防御力+所有装备的防御力"))
elif (num_choose_1 == 4):
print(("退出游戏"))
break # 结束死循环
elif(num_choose_1==5 ): #用户已选角色
if(OB!=None):
print("用户须知:输入大于3的数字,将自动结束属性比较")
while(1): # 进行多次属性比较
ar_jsmc=[mc for mc in ar_jsmc if mc !=OB.name] # 列表推导式,将用户选中的角色剔除掉
# 默认多一个装备多100攻击力,100防御力
try: # 捕获用户输入的异常
js_bj=int(input(f"选择与当前所选角色进行比较的角色(默认多一个装备多100攻击力,100防御力)\n(1.{ar_jsmc[0]},2.{ar_jsmc[1]},3.{ar_jsmc[2]}):"))
except Exception as ex:
print("输入异常:输入非数字")
else:
try: # 捕获异常
if(js_bj>3):
print("结束属性比较")
break #跳出死循环
str_mc= ar_jsmc[js_bj - 1] # 用户选中要比较的对手ds角色
except Exception as e:
pass # 异常不打印
else:
if(str_mc==ts.name):
ds=ts
elif(str_mc==swk.name):
ds=swk
elif(str_mc==zbj.name):
ds=zbj
elif(str_mc==shs.name):
ds=shs
# 总攻击力比较
judgeAtackDefence(OB,ds,"attack")
# 总防御力比较
judgeAtackDefence(OB,ds,"defense")
else:
print("请先选择角色")
else:
print("请输入1-5的数字")
continue # 继续下一个死循环
2,选择角色后,角色可以改
角色可以更改的代码大部分和不可更改时的代码是一模一样的,几个不同点:
- 不用在第一个的while(1)外面声明一个空的对象OB;
- 在进行多次属性比较时,存放角色名称的列表需要写入第二个死循环while(1)里面,保证不管进行多少次属性比较,列表都包含所有角色的名称
效果如下图:
代码如下:
# -*- encoding: utf-8 -*-
class Ts: # 唐僧
initial_experience=0 # 初始经验0
def __init__(self): # 构造方法
pass
name="唐僧"
attack = 100
defense = 600
str_zb1 = "裟锦襕袈裟"
str_zb2 = "九环锡杖"
life = 500
class Swk: #孙悟空
initial_experience=0 # 初始经验
def __init__(self):
pass
name="孙悟空"
attack = 100
defense = 600
str_zb1 = "如意金箍棒"
life = 500
class Zbj: #猪八戒
initial_experience=0 # 初始经验
def __init__(self):
pass
name="猪八戒"
attack = 500
defense = 400
str_zb1 = "九齿钉耙"
life = 600
class Shs: #沙和尚
initial_experience=0 # 初始经验
name="沙和尚"
def __init__(self):
pass
attack = 300
defense = 500
str_zb1 = "降妖宝杖"
life = 500
def printMC(OB): # 打印角色名称的方法
print(f"当前选中角色:{OB.name}")
def printSX(ob): # 打印属性的方法
print(f"{ob.name}" + " " * 5 +
f"{ob.attack}" + " " * 5 +
f"{ob.defense}" + " " * 4 +
f"{ob.str_zb1}" + " " * 10 +
f"{ob.life}" + " " * 4+
f"{ob.initial_experience}")
def printSXsult1(ob1,ob2,str):
if(str=="attack"):
str2="总的攻击力"
else:
str2="总的防御力"
print(f"{ob1.name}比{ob2.name}的{str2}大")
if(ob1==ob2):
print(f"两个角色的{str2}相同")
def judgeAtackDefence(OB,ds,str): # str用于决定该方法是进行攻击力判断还是防御力判断
if (OB.name == ts.name): # 唐僧有两套装备
ob_total = getattr(OB,str)+ 100 * 2
ds_total = getattr(ds,str) + 100
if(ob_total>ds_total):
printSXsult1(OB,ds,str)
elif(ob_total<ds_total):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
elif (ds.name == ts.name):
ob_total = getattr(OB,str) + 100
ds_total = getattr(ds,str) + 100 * 2
if(ob_total>ds_total):
printSXsult1(OB,ds,str)
elif(ob_total<ds_total):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
else: # 双方均只有一个装备,就肉搏,纯靠自身攻击力力或防御力
if (getattr(OB,str) > getattr(ds,str)):
printSXsult1(OB,ds,str)
elif (getattr(OB,str) < getattr(ds,str)):
printSXsult1(ds,OB,str)
else:
printSXsult1(OB,OB,str)
if __name__ == '__main__':
ts=Ts # 唐僧对象
swk=Swk #孙悟空对象
zbj=Zbj #猪八戒对象
shs=Shs #沙和尚对象
num_login = 3 # 输错之后还剩下的输入次数
str_login = "" # 存放登录成功的提示
user = "admin"
passwd = 123
for i in range(1, num_login + 1):
try: #捕获用户输入的异常
username = input("please the enter user:") # 输入用户名
password = int(input("please the enter passwd:")) # 输入密码
except Exception as ex:
print("输入异常")
else:
if username == user and password == passwd:
print("login successfull")
str_login += "login successfull"
break # 如果输入成功后直接跳出for循环
else:
print("login failed")
str_login += "login failed"
if (num_login - i > 0):
print("您还有%d次机会,请重新输入" % (num_login - i))
else: # 机会用完之后给出提示
print("抱歉,您的机会已用完")
str_login="login successfull"
if (str_login == "login successfull"):
print("欢迎进入西游记游戏\n"
f"1.选择角色(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name})\n"
f"2.角色属性查询(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name})\n"
"3.游戏帮助\n"
"4.退出游戏\n"
"5.属性比较【注意;用户需要先创建选中角色才能够进行属性比较】")
str_js_title = "角色名称"+" "*3+"攻击力"+" "*3+"防御力"+" "*3+"装备"+" "*14+"生命值"+" "*3+"经验值" # 属性抬头
while(1): # 死循环
try: # 捕获用户输入的异常
num_choose_1 = int(input("选择游戏菜单:"))
except Exception as ex:
print("输入异常:输入非数字")
else:
if (num_choose_1 == 1):
try: # 捕获用户输入的异常
num1_choose_2 = int(input(f"选择角色(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name}):"))
except Exception as ex:
print("输入异常:输入非数字")
else:
if (num1_choose_2 == 1):
OB = ts # 将用户选中的角色对象赋值给OB常量对象
printMC(OB)
elif (num1_choose_2 == 2):
OB = swk
printMC(OB)
elif (num1_choose_2 == 3):
OB = zbj
printMC(OB)
elif (num1_choose_2 == 4):
OB = shs
printMC(OB)
else:
print("该数字无对应角色,请输入1-4之间的数字")
continue # 继续下一个死循环
elif (num_choose_1 == 2): # 属性
num2_choose_2 = int(input(f"角色属性查询(1.{ts.name},2.{swk.name},3.{zbj.name},4.{shs.name}):"))
print(str_js_title) # 角色属性抬头
if (num2_choose_2 == 1): # 打印唐僧属性
print(f"{ts.name}" + " " * 6 + f"{ts.attack}" + " " * 6 + f"{ts.defense}" + " " * 3 + f"{ts.str_zb1},{ts.str_zb2}" + " " * 3 + f"{ts.life}" + " " * 6 + f"{ts.initial_experience}")
elif (num2_choose_2 == 2):
ob = Swk
printSX(ob)
elif (num2_choose_2 == 3):
ob = Zbj
printSX(ob)
elif (num2_choose_2 == 4):
ob = Shs
printSX(ob)
elif (num_choose_1 == 3): # 帮助
print(("装备有攻击力和防御力\n"
"角色的总攻击力 = 自身的攻击力+所有装备的攻击力\n"
"角色的总防御力 = 自身的防御力+所有装备的防御力"))
elif (num_choose_1 == 4):
print(("退出游戏"))
break # 结束死循环
elif (num_choose_1 == 5): # 用户已选角色
print("用户须知:输入大于3的数字,将自动结束属性比较")
while (1): # 进行多次属性比较
ar_jsmc = [f"{ts.name}", f"{swk.name}", f"{zbj.name}", f"{shs.name}"]
ar_jsmc = [mc for mc in ar_jsmc if mc != OB.name] # 列表推导式,将用户选中的角色剔除掉
# 默认多一个装备多100攻击力,100防御力
try:
js_bj = int(input(f"选择与当前所选角色进行比较的角色(默认多一个装备多100攻击力,100防御力)\n(1.{ar_jsmc[0]},2.{ar_jsmc[1]},3.{ar_jsmc[2]}):"))
except Exception as ex:
print("输入异常:输入非数字")
else:
if (js_bj > 3):
print("结束属性比较")
break # 跳出死循环
str_mc = ar_jsmc[js_bj - 1] # 用户选中要比较的对手ds角色
if (str_mc == ts.name):
ds = ts
elif (str_mc == swk.name):
ds = swk
elif (str_mc == zbj.name):
ds = zbj
elif (str_mc == shs.name):
ds = shs
# 总攻击力比较
judgeAtackDefence(OB, ds, "attack")
# 总防御力比较
judgeAtackDefence(OB, ds, "defense")
else:
print("请输入1-5的数字")
continue # 继续下一个死循环
实验二猜拳游戏-对象
游戏过程如下:
(1)选取对战角色。
进入游戏后,选择对手,对手是由计算机虚构出的对象。
(2)猜拳。
开始对战,用户出拳,对手出拳,用户与对手进行比较,提示胜负信息。
(3)记录分数。
每局猜拳结束,获胜方加1分(平局双方均不加分),游戏结束时,显示对战次数及对战最终结果。
(4)记录分数。
每次猜拳结束,将双方的出拳情况保存到.csv文件。
类:
1,用户类:名字,积分,出拳
2,计算机类:名字,积分,出拳
3,游戏类:甲方用户,乙方用户,对战次数 | 初始化 开始游戏 判断猜拳结果 计算对战结果
效果如下:
代码如下:
# -*- encoding: utf-8 -*-
"""游戏过程如下:
(1)选取对战角色。
进入游戏后,选择对手,对手是由计算机虚构出的对象。
(2)猜拳。
开始对战,用户出拳,对手出拳,用户与对手进行比较,提示胜负信息。
(3)记录分数。
每局猜拳结束,获胜方加1分(平局双方均不加分),游戏结束时,显示对战次数及对战最终结果。
(4)记录分数。
每次猜拳结束,将双方的出拳情况保存到.csv文件。
类:
1,用户类:名字,积分,出拳
2,计算机类:名字,积分,出拳
3,游戏类:甲方用户,乙方用户,对战次数 | 初始化 开始游戏 判断猜拳结果 计算对战结果
"""
import random
import csv
class Player: # 用户类
jifen = 0 # 积分为0
def __init__(self, name):
self.name = name # 用户自己输入的名字
def chuQuan(self):
return int(input("用户出拳:"))
class Computer: # 计算机类
jifen=0 #积分为0
def __init__(self,name):
self.name=name # 计算机的名字
def chuQuan(self):
ar_computer = [0, 2, 5] # 计算机会出的数字
rd_computer = random.randint(0, 2) # 选中计算机出的数字
return ar_computer[rd_computer]
# print("对手出拳:%d"%(ar_computer[rd_computer]))
class Game: #游戏类
num_play = 0 # 对战次数
def __init__(self):
pass
def startPlay(num_play,player,computer): #开始游戏
headers = ['局数', '用户出拳情况', '对手出拳情况', "胜负信息"]
with open('双方出拳情况.csv', 'a+', encoding='utf8', newline='') as f:
# 生成的csv文件在py文件同一个目录
writer = csv.writer(f)
writer.writerow(headers)
while (1):
string="" # 存放每次对战信息
print("第%d局"%num_play)
try:
player_c=player.chuQuan() #用户出拳
except Exception as ex:
print("用户输入异常,请输入纯数字", ex)
else:
computer_c=computer.chuQuan() #对手出拳
print("对手出拳:%d"%computer_c)
if player_c == 0 or player_c == 2 or player_c == 5:
if (player_c == 0 and computer_c == 5):
print("对手胜利")
string += "对手胜利"
computer.jifen += 1 # 对手加一个积分
elif (player_c == 5 and computer_c == 0):
print("用户胜利")
string += "用户胜利"
player.jifen+= 1 # 用户加一个积分
elif (player_c < computer_c):
print("用户胜利")
string += "用户胜利"
player.jifen+= 1 # 用户加一个积分
elif (player_c > computer_c):
print("对手胜利")
string += "对手胜利"
computer.jifen += 1 # 对手加一个积分
else:
print("平局")
string += "平局"
rows = (num_play, player_c, computer_c, string)
num_play+= 1
with open('双方出拳情况.csv', 'a+', encoding='utf8', newline='') as f:
writer = csv.writer(f)
writer.writerow(rows)
else:
print("退出游戏")
print("对战次数:%d" % (int(num_play) - 1))
if (player.jifen > computer.jifen):
print("对战最终结果:用户胜利")
elif (player.jifen < computer.jifen):
print("对战最终结果:对手胜利")
else:
print("对战最终结果:平局")
break # 跳出死循环
if __name__ == '__main__': # 主函数
print((10 * "+") + "欢迎进入游戏" + (10 * "+")
+ "\n用户需知:\n"
"1,对手为计算机(即此游戏为单机游戏)\n"
"2,数字0表示石头,数字2表示剪刀,数字5表示布\n"
"3,关于如何退出游戏:输入除0,2,5之外的其他数字即可退出游戏")
player=Player("用户")
computer=Computer("对手")
game=Game
game.startPlay(1,player,computer)
如果文章不够详细,依旧有问题的,请评论区回复或者是私信我。