python实现回合制对战游戏-面向对象编程

什么是面向对象编程:

 Object Oriented Programming,简称OOP,面向对象编程就是以类的方式组织代码,以对象的形式封装数据

# 面向过程的编程:着重于做什么
# 面向对象的编程,着重于谁去做
# • 类(Class): 用来描述具有相同的属性和方法(能做的事)的对象的集合。
# • 它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
# 属性:对象描述信息--表现形式为变量
# 方法:对象的行为---表现形式为函数
# 实例化:创建一个类的实例,类的具体对象

  • 定义类以及类的方法和属性

# 定义需要的类:对战的角色,对战的房间 
# 类的属性和方法:也就是它们的信息和行为
class Role():
    def __init__(self,name,sex,blood=100,body_armor=None):
        self.name = name
        self.sex = sex
        self.blood = blood
        self.body_armor = body_armor
        self.room = None
    def attack(self,other):
        if self.room == other.room:	# 注:同一房间
            if self != other:		# 注:不同的人
                if self.blood > 0 and other.blood > 0:
                    reduce_blood = 5 if other.body_armor else 10
				# 注:body_armor为假 返回10(没有设置防弹衣)
                    other.blood -= reduce_blood
                    print(f"{self.name}攻击{other.name} {reduce_blood}点血量\t{self.name}当前血量:{self.blood}\t{other.name}当前血量:{other.blood}")
                else:
                    print("其中一方已死亡,不能攻击")
                    exit()
            else:
                print("你不能攻击自己")
        else:
            print("攻击对象,不在同一个房间")
class Room():
    def __init__(self,name):
        self.member = []
        self.name = name
    def join(self,role):
        if role.room == None:
	# 注:在角色的类里定义的属性room
            if len(self.member) < 2:
                self.member.append(role)
		# 注:member房间的属性,房间只能加2个人 所以<2
                role.room = self.name
		# 注:达到条件,定义角色加入到 某个房间
            else:
                print("此房间已满")
        else:
            print("此角色已经加入房间了")
 
role_dict = {}  # 存放初始化实例	# 注:存放名字和对象的关系
room_dict = {}  # 存放初始化实例
  • 定义好类以及实例化对象后,主程序流程控制如下

while True:
    print("请选择:1.创建角色\t2.创建房间\t3.加入房间\t4.开始战斗\t5.退出")
    enter_number = input("请输入你的选择\t")
    if enter_number.isdigit():
        enter_number = int(enter_number)
        if 1 <= enter_number <=5:
            if enter_number == 1:
                name, sex = input("请输入角色的姓名与性别,空格隔开\n").split()
		#注:split()是为了 分割 将字符 赋给2个变量
                role_dict[name] = Role(name, sex)
                def_blood = input("输入自定义血量\n")
                if def_blood.isdigit():
                    role_dict[name].blood = int(def_blood)
                    print(f"自定义成功,用户{name}当前血量{role_dict[name].blood}")
                else:
                    print(f"自定义失败,用户{name}当前血量{role_dict[name].blood}")
                wear_body_armor = input("输入y装备防弹衣\n")
                if wear_body_armor == "y":
                    role_dict[name].body_armor = 1
            elif enter_number == 2:
                name = input("请输入房间的名字\n")
                room_dict[name] = Room(name)
		# 注:创建好的对象(实例化对象) 保存在字典里
            elif enter_number == 3:
                print(f"当前角色有{role_dict.keys()},当前房间有{room_dict.keys()}")
                role_name, room_name = input("请输入要加入的角色和房间名,空格隔开\n").split()
		# 注:这里可以做1个判断 (考虑到各种情况),角色要一个一个进房间
                room_dict[room_name].join(role_dict[role_name])
                continue
		# 注:从字典 取出房间对象,调用房间对象的join()方法
            elif enter_number == 4:
                print(f"当前房间有{room_dict.keys()}")
                room_name = input("请输入房间的名字\n")	# 注:选择房间
                if len(room_dict[room_name].member) == 2:
		# 注:len()==2 这是保证房间里有2个人  才能对打
                    while True:
                        room_dict[room_name].member[0].attack(room_dict[room_name].member[1])
                        room_dict[room_name].member[1].attack(room_dict[room_name].member[0])
			# 注:通过字典获取房间实例对象,member是房间的属性
			# 注:为什么房间实例能获取到创建角色类的对象?因为选项3 是角色类属性 加入 房间member属性,保证了这一步能调用成功实例化对象
                else:
                    print(f"房间{room_name}人数不足2人,对战失败!")
                    continue
            elif enter_number == 5:
                print("退出对战")
                break
        else:
            print("输入错误,请输入1-5选择操作!")
    else:
        print("输入错误,请输入1-5选择操作!")
  • 代码效果展示如图

python实现回合制对战游戏-面向对象编程_第1张图片

 

你可能感兴趣的:(python,游戏,python)