Python多人小游戏 Fay·D·Flourite

python小游戏

最近用python写了个多人游玩的小游戏…算是完成了以前的一个愿望吧。也在这儿记录一下。

源码太多了就不放这儿了,找个时间传github上去。

放两个比较关键的类吧,

class character(object):
    def __init__(self,name,intelligence,health,lucky,magic,attack,speed):
        self.name= name
        self.intelligence = intelligence
        self.health = health
        self.lucky = lucky
        self.magic = magic
        self.attack = attack
        self.speed = speed
        self.room_num = None
        self.battle_type = None
        self.socket = None

    #造成伤害
    def health_lose(self,damage):
        self.health -= int(damage)
        #print(damage)
        if int(damage) == 0:
            return '对方完全不吃该技能的伤害的样子!'
        if 0 < int(damage) and int(damage) <= 5:
            return '收效甚微,对方或许很擅长该技能..?'
        if 5 < int(damage) and int(damage) <= 15:
            return '该攻击似乎给对方产生了不错的效果!'
        if 15 < int(damage) :
            return '对方受了重伤!该攻击非常有效!'

        

#定义战斗模块
    def battle_magic(self,player_obj):

        p1=int(self.magic)
        p2=int(player_obj.magic)
        if p1 >= p2 :
            damage_range=int(p1-p2)
            damage=random.randrange(1,damage_range,1)

            #判定幸运是否触发
            if random.random() > (self.intelligence * 0.01):
                damage = damage * 2
            back=player_obj.health_lose(damage)
            print(back)

            #判定对方点数增长以及智力加成
            learning = random.randrange(1,int(damage_range/2),1)
            learning = learning + (player_obj.intelligence * 0.01 * learning)
            player_obj.magic += learning

        else:
            p1 < p2
            damage=0
            back=self.health_lose(damage)
            print(back)            

    
    def battle_attack(self,player_obj):

        p1=int(self.attack)
        p2=int(player_obj.attack)
        if p1 >= p2 :
            damage_range=int(p1-p2)
            damage=random.randrange(1,damage_range,1)

            if random.random() > (self.intelligence * 0.01):
                damage = damage * 2
            back=player_obj.health_lose(damage)
            print(back)

            learning = random.randrange(1,int(damage_range/2),1)
            learning = learning + (player_obj.intelligence * 0.01 * learning)
            player_obj.magic += learning
        else:
            p1 < p2
            damage=0
            back=self.health_lose(damage)
            print(back)


    def battle_speed(self,player_obj):

        p1=int(self.speed)
        p2=int(player_obj.speed)
        if p1 >= p2 :
            damage_range=int(p1-p2)
            damage=random.randrange(1,damage_range,1)

            if random.random() > (self.intelligence * 0.01):
                damage = damage * 2
            back=player_obj.health_lose(damage)
            print(back)

            learning = random.randrange(1,int(damage_range/2),1)
            learning = learning + (player_obj.intelligence * 0.01 * learning)
            player_obj.magic += learning
        else:
            p1 < p2
            damage=0
            back=self.health_lose(damage)
            print(back)



class room(object):

    max_num = 2

    def __init__(self,room_id):
        self.room_id = room_id
        self.room_users = {}

#加入房间
    def join(self, user_obj):
        self.room_users[user_obj.name] = user_obj
        print(self.room_users)
        user_obj.room_num = self.room_id

        if len(self.room_users) == 1:
            return "正在等待玩家加入"

        # 当玩家数达到房间上限时,自动启动游戏开始的方法
        if len(self.room_users) == room.max_num:
            return "房间已满!Game start!"


        #-----------------------
#            self.game_start()
        #-----------------------



        # 设置满员后,禁止再有玩家加入
        # 在room_users字典中删除,使得长度为2,可调用游戏开始Game_start的方法
        elif len(self.room_users) == room.max_num + 1:
            
            self.room_users.pop(user_obj.name)
            return "房间已满!禁止加入"
#                                           服务端发送人物数据并询问攻击方式
#双方玩家选择攻击方式发送到服务端              服务端根据双方速度选择优先攻击方
#(时间限制暂未实装)
#                                       服务端将战斗结果发送到双方客户端
#双方客户端接收结果


#只执行一回合攻击,等待输入完成了再调用该函数进行下一回合,直到游戏结束。
    def game_start(self):
    
        user1 = list(self.room_users.values())[0]
        user2 = list(self.room_users.values())[1]
#        client.send('游戏开始!').encode('utf-8')

        #根据速度选择先攻方
        if user1.speed > user2.speed:
            if user1.health > 0 and user2.health > 0:
#               client.send('选择你的攻击方式!(选择代号即可)\n1.[-咒 术-]  基于您的魔法点数\n2.[-肉 搏-]  基于您的攻击点数\n3.[-速 攻-]  基于您的敏捷点数\n'+'-'*50+'*'*50).encode('utf-8')
#               battle_type=client.recv(1024).decode('utf-8')
                if user1.battle_type == 1:
                    user1.battle_magic(user2)
                if user1.battle_type == 2:
                    user1.battle_attack(user2)
                if user1.battle_type == 3:
                    user1.battle_speed(user2)
                if user1.health > 0 and user2.health > 0:
                    if user2.battle_type == 1:
                        user2.battle_magic(user1)
                    if user2.battle_type == 2:
                        user2.battle_attack(user1)
                    if user2.battle_type == 3:
                        user2.battle_speed(user1)

                if user1.health <= 0:
                    return('游戏结束,'+user2.name+'获胜')
                if user2.health <= 0:
                    return('游戏结束,'+user1.name+'获胜')
        

        if user1.speed < user2.speed:
            if user1.health > 0 and user2.health > 0:
                if user2.battle_type == 1:
                    user2.battle_magic(user1)
                if user2.battle_type == 2:
                    user2.battle_attack(user1)
                if user2.battle_type == 3:
                    user2.battle_speed(user1)
                if user1.health > 0 and user2.health > 0:
                    if user1.battle_type == 1:
                        user1.battle_magic(user2)
                    if user1.battle_type == 2:
                        user1.battle_attack(user2)
                    if user1.battle_type == 3:
                        user1.battle_speed(user2)

                if user1.health <= 0:
                    return('游戏结束,'+user2.name+'获胜')
                if user2.health <= 0:
                    return('游戏结束,'+user1.name+'获胜')

游戏规则大概就是两个玩家输入各自的数据,然后选择一项技能和对面对刚,服务端会根据两方点数差异在差异范围内随机一个数作为伤害之类的,不同的数据也有不同的作用(譬如速度和先攻顺序有关),且受攻击方会得到该点数的增长(要不然两边从头到尾一个技能打到底了)

这两个类大概定义了游戏的内容

第一个类是角色数据和游戏的战斗呀,生命值减少之类的,第二个是游戏的房间,以此来完成两个玩家之间的配对以及战斗。

其余的大概就是客户端和服务端之间的交互了。我是拿之前聊天室的模子改的(其实差别挺大- -基本上是重新写了一遍),主线程接收用户的连接,放入分线程内录入玩家传入的数据并加入房间,再分一个线程管房间的启动,当房间人数达到上限便开启游戏。(不写不知道,加交互其实挺麻烦的来着有一说一。)

不太美观- -,而且这玩意bug巨多。改好估计太费时间了所以就此打住啦。反正能用了,也就算是完成了自己的心愿了。

该回去做题了(害

P.S.(game_start被我改掉了…现在战斗函数没放到room类里了,直接放到负责room满员后运行的线程里去了)