python:使用面向对象,编写一个一对一的回合制游戏

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组织在一起,形成对象。Python是一种支持面向对象编程的高级编程语言。
在Python中,面向对象编程的核心概念是类(class)和对象(object)。类是一个抽象的概念,它定义了一类对象的属性和行为。对象是类的实例,它具有类定义的属性和行为。

面向对象编程的主要特点包括封装、继承和多态:
封装(Encapsulation):封装是将数据和操作数据的方法封装在一起,形成一个类。类通过提供公共接口来隐藏内部实现细节,使得对象的使用者只需要关注对象的行为而不需要了解其内部实现。
继承(Inheritance):继承是一种机制,允许一个类继承另一个类的属性和方法。通过继承,子类可以重用父类的代码,并可以在不修改父类的情况下扩展或修改其行为。
多态(Polymorphism):多态是指同一个方法可以在不同的对象上产生不同的行为。通过多态,可以编写通用的代码,使得代码可以处理不同类型的对象,而不需要针对每种类型编写特定的代码。
在Python中,定义一个类使用关键字class,类中的属性和方法通过成员访问运算符.来访问。创建一个对象使用类名后跟一对括号,类似于函数调用。

下面我们完成一个回合制对战游戏:

import random

输入需要的模块

class Role():
    blood = 100
    mana_pool = 100
    defence = 0

    def __init__(self, name):
        self.name = name
        print(f"角色{self.name}创建成功")

    def attack(self, name):
        if self.blood > 0:
            i = random.randint(10, 30)
            if self.defence >= i:
                self.defence -= i
            else:
                name.blood = name.blood - (i - self.defence)
                print(f"{self.name}受到{i}点伤害,当前剩余血量:{name.blood}")
                if name.blood <= 0:
                    print(f"{self.name} died.game over!please create new roles")
        else:
            print("玩家已阵亡,请重新开始游戏")

    def updefence(self):
        if self.blood > 0 and self.mana_pool >= 10:
            i = random.randint(10, 20)
            self.mana_pool -= 10
            self.defence += i
            print(f"{self.name}增加防御{i}点,当前防御为:{self.defence}")
        elif self.mana_pool < 10:
            print("蓝量不足")

    def unique_skill(self, name):
        # 无视防御
        if self.blood > 0 and self.mana_pool >= 40:
            self.mana_pool -= 40
            i = random.randint(30, 60)
            name.blood -= i
            print(f"{self.name}受到大招伤害{i}点,当前剩余血量:{name.blood}")
            if name.blood <= 0:
                print(f"{self.name} died.game over!please create new roles")
        elif self.mana_pool < 40:
            print("蓝量不足,无法使用")
        elif self.blood < 0:
            print("玩家已阵亡,请重新开始游戏")

上述代码定义了一个名为Role的类,表示游戏中的角色。该类具有以下属性和方法:
属性:
blood:角色的血量,默认为100。
mana_pool:角色的法力值,默认为100。
defence:角色的防御值,默认为0。
name:角色的名称。
方法:
init(self, name):类的构造函数,用于初始化角色对象。接受一个参数name,表示角色的名称。在构造函数中,会打印出角色创建成功的消息。
attack(self, name):角色的攻击方法,接受一个参数name,表示被攻击的角色对象。该方法会生成一个随机数作为攻击伤害,并根据被攻击角色的防御值计算实际伤害。如果被攻击角色的血量小于等于0,则打印出角色死亡的消息。
updefence(self):角色增加防御值的方法。如果角色的血量大于0且法力值大于等于10,则生成一个随机数作为增加的防御值,并扣除相应的法力值。
unique_skill(self, name):角色的特殊技能方法。如果角色的血量大于0且法力值大于等于40,则生成一个随机数作为特殊技能的伤害,并扣除相应的法力值。该技能会无视被攻击角色的防御值。如果被攻击角色的血量小于等于0,则打印出角色死亡的消息。
这个类可以用于创建游戏中的角色对象,并进行攻击、增加防御值和使用特殊技能等操作。在每个方法中都有一些条件判断,以确保角色的状态满足使用条件。

class Room():
    roommax = 2
    current_players = 0
    def __init__(self, roomname, roomnum, player1, player2):

        self.room_name = roomname
        self.room_num = roomnum
        self.player1 = player1
        self.player2 = player2
        print(f"当前房间为{self.room_name}{self.room_num}")
        print(f"房间成员:{self.player1},{self.player2}")

        if self.player1 and self.player2:

            flag = input("游戏已就绪,输入1开始游戏,输入其它任意键退出房间:")
            if flag == '1':
                print("游戏开始")
                self.start()
            else:
                print("已退出房间")

        else:
            print("角色数量不足,无法开始游戏")

    def start(self):

        role1 = Role(self.player1)
        role2 = Role(self.player2)

        menu_data = """
            1.攻击
            2.提高防御
            3.发动大招
            """
        while True:
            print(menu_data)
            whose_round = random.randint(1, 2)
            print("掷筛中...")
            if whose_round == 1:
                choice = input("角色1回合,输入角色1的技能序号:")
                if choice == "1":
                    role1.attack(role2)
                    if role2.blood <= 0:
                        break
                elif choice == "2":
                    role1.updefence()
                elif choice == "3":
                    role1.unique_skill(role2)
                    if role2.blood <= 0:
                        break
            else:
                choice = input("角色2回合,输入角色2的技能序号:")
                if choice == "1":
                    role2.attack(role1)
                    if role1.blood <= 0:
                        break
                elif choice == "2":
                    role2.updefence()
                elif choice == "3":
                    role2.unique_skill(role1)
                    if role1.blood <= 0:
                        break

以上代码定义了一个名为Room的类,表示游戏中的房间。该类具有以下属性和方法:
属性:
roommax:房间最大容纳人数,默认为2。
current_players:当前房间中的玩家数量,默认为0。
room_name:房间名称。
room_num:房间编号。
player1:房间中的玩家1。
player2:房间中的玩家2。
方法:
init(self, roomname, roomnum, player1, player2):类的构造函数,用于初始化房间对象。接受四个参数:roomname表示房间名称,roomnum表示房间编号,player1表示玩家1,player2表示玩家2。在构造函数中,会打印出房间创建成功的消息,并显示房间成员。如果房间中有两个玩家,则询问是否开始游戏,如果输入1则开始游戏,否则退出房间。
start(self):开始游戏的方法。在该方法中,创建了两个角色对象role1和role2,分别对应玩家1和玩家2。然后进入一个循环,显示游戏菜单供玩家选择技能。通过随机数确定当前回合是哪个角色的回合,然后根据玩家的选择调用相应的角色方法。如果某个角色的血量小于等于0,则游戏结束。
这个类可以用于创建游戏中的房间对象,并进行游戏的初始化和进行游戏回合的操作。在构造函数中,会检查房间中是否有足够的玩家数量来开始游戏。在游戏开始后,会根据随机数确定回合顺序,并根据玩家的选择调用相应的角色方法进行游戏操作。

class Game():
    def start(self):
        menu_data = """
        1.创建角色
        2.创建房间    
        """

        player1 = None
        player2 = None

        while True:
            print(menu_data)
            choice = input("请输入你的操作:")

            if choice == "1":
                n = 1

                while n < 3:
                    print("提示:你需要创建两名角色才能开始游戏!")
                    name = input("请输入角色名称:")

                    if n == 1:
                        player1 = name
                        Role(player1)
                        n += 1
                        print(f"当前角色数量为{n - 1}")
                    else:
                        player2 = name
                        Role(player2)
                        n += 1
                        print(f"当前角色数量为{n - 1}")


            elif choice == "2":
                if player2 and player1:
                    roomname = input("请输入需要创建的房间名称:")
                    roomnum = input("请输入需要创建的房间号")
                    room1 = Room(roomname, roomnum, player1, player2)
                else:
                    print("角色不足无法创建房间")
            else:
                print("错误输入!请重新输入:")

以上代码是一个简单的游戏类,包含了创建角色和创建房间的功能。
Game 类是游戏的主类,其中的 start 方法是游戏的入口函数。
menu_data 是一个包含菜单选项的字符串,用于在控制台显示菜单。
player1 和 player2 是两个角色的变量,初始值为 None。
while True 循环用于持续显示菜单,直到用户选择退出游戏。
用户输入选择后,通过 input 函数获取用户的选择。
如果选择是 “1”,则进入创建角色的逻辑。
n 是一个计数器,用于记录已创建的角色数量。
在一个 while 循环中,用户需要输入两个角色的名称。
如果 n 等于 1,将第一个角色的名称赋值给 player1,并创建一个 Role 对象。
如果 n 大于 1,将第二个角色的名称赋值给 player2,并创建一个 Role 对象。
每次成功创建一个角色后,n 的值增加 1,并显示当前已创建的角色数量。
如果选择是 “2”,则进入创建房间的逻辑。
首先检查 player1 和 player2 是否都存在,如果存在则继续,否则提示角色不足无法创建房间。
用户需要输入房间名称和房间号。
创建一个 Room 对象,并传入房间名称、房间号、以及 player1 和 player2 的名称。
如果选择既不是 “1” 也不是 “2”,则显示错误提示信息。

game = Game()
game.start()

最后,创建一个 Game 对象,调用了 start 方法来开始游戏。通过调用 game.start() 方法,游戏将一直运行,直到用户选择退出游戏。

以下是代码运行结果:
python:使用面向对象,编写一个一对一的回合制游戏_第1张图片
python:使用面向对象,编写一个一对一的回合制游戏_第2张图片
python:使用面向对象,编写一个一对一的回合制游戏_第3张图片
附上完整代码:

import random


class Role():
    blood = 100
    mana_pool = 100
    defence = 0

    def __init__(self, name):
        self.name = name
        print(f"角色{self.name}创建成功")

    def attack(self, name):
        if self.blood > 0:
            i = random.randint(10, 30)
            if self.defence >= i:
                self.defence -= i
            else:
                name.blood = name.blood - (i - self.defence)
                print(f"{self.name}受到{i}点伤害,当前剩余血量:{name.blood}")
                if name.blood <= 0:
                    print(f"{self.name} died.game over!please create new roles")
        else:
            print("玩家已阵亡,请重新开始游戏")

    def updefence(self):
        if self.blood > 0 and self.mana_pool >= 10:
            i = random.randint(10, 20)
            self.mana_pool -= 10
            self.defence += i
            print(f"{self.name}增加防御{i}点,当前防御为:{self.defence}")
        elif self.mana_pool < 10:
            print("蓝量不足")

    def unique_skill(self, name):
        # 无视防御
        if self.blood > 0 and self.mana_pool >= 40:
            self.mana_pool -= 40
            i = random.randint(30, 60)
            name.blood -= i
            print(f"{self.name}受到大招伤害{i}点,当前剩余血量:{name.blood}")
            if name.blood <= 0:
                print(f"{self.name} died.game over!please create new roles")
        elif self.mana_pool < 40:
            print("蓝量不足,无法使用")
        elif self.blood < 0:
            print("玩家已阵亡,请重新开始游戏")


class Room():
    roommax = 2
    current_players = 0
    def __init__(self, roomname, roomnum, player1, player2):

        self.room_name = roomname
        self.room_num = roomnum
        self.player1 = player1
        self.player2 = player2
        print(f"当前房间为{self.room_name}{self.room_num}")
        print(f"房间成员:{self.player1},{self.player2}")

        if self.player1 and self.player2:

            flag = input("游戏已就绪,输入1开始游戏,输入其它任意键退出房间:")
            if flag == '1':
                print("游戏开始")
                self.start()
            else:
                print("已退出房间")

        else:
            print("角色数量不足,无法开始游戏")

    def start(self):

        role1 = Role(self.player1)
        role2 = Role(self.player2)

        menu_data = """
            1.攻击
            2.提高防御
            3.发动大招
            """
        while True:
            print(menu_data)
            whose_round = random.randint(1, 2)
            print("掷筛中...")
            if whose_round == 1:
                choice = input("角色1回合,输入角色1的技能序号:")
                if choice == "1":
                    role1.attack(role2)
                    if role2.blood <= 0:
                        break
                elif choice == "2":
                    role1.updefence()
                elif choice == "3":
                    role1.unique_skill(role2)
                    if role2.blood <= 0:
                        break
            else:
                choice = input("角色2回合,输入角色2的技能序号:")
                if choice == "1":
                    role2.attack(role1)
                    if role1.blood <= 0:
                        break
                elif choice == "2":
                    role2.updefence()
                elif choice == "3":
                    role2.unique_skill(role1)
                    if role1.blood <= 0:
                        break


class Game():
    def start(self):
        menu_data = """
        1.创建角色
        2.创建房间    
        """

        player1 = None
        player2 = None

        while True:
            print(menu_data)
            choice = input("请输入你的操作:")

            if choice == "1":
                n = 1

                while n < 3:
                    print("提示:你需要创建两名角色才能开始游戏!")
                    name = input("请输入角色名称:")

                    if n == 1:
                        player1 = name
                        Role(player1)
                        n += 1
                        print(f"当前角色数量为{n - 1}")
                    else:
                        player2 = name
                        Role(player2)
                        n += 1
                        print(f"当前角色数量为{n - 1}")


            elif choice == "2":
                if player2 and player1:
                    roomname = input("请输入需要创建的房间名称:")
                    roomnum = input("请输入需要创建的房间号")
                    room1 = Room(roomname, roomnum, player1, player2)
                else:
                    print("角色不足无法创建房间")
            else:
                print("错误输入!请重新输入:")


game = Game()
game.start()

你可能感兴趣的:(python,游戏,开发语言,pycharm)