猫史档案馆


【Python作品分享】开战吧!阿短【作品秀】

用户:DianfenghhDianfenghh查看:0 回复:0 评论:0 创建时间:2021-02-12T19:27:24


【作品展示】

center_image

 

【作品介绍】

上下左右键控制,按a功击

 

【作品源代码】

import pygame,time
from pygame.locals import *
from random import randint
import random
from threading import *
from math import *
# 创建窗口,定义标题
screen = pygame.display.set_mode((1280, 720))
pygame.display.set_caption("开战吧~阿短")
TIMER = pygame.USEREVENT+1
pygame.time.set_timer(TIMER,10)
PicOfStand = pygame.image.load("Stand.png")#玩家站立状态
Win =pygame.transform.scale( pygame.image.load("Win.png"), (1280, 720))
PicOfMove = []#玩家行走状态
Map = pygame.transform.scale(pygame.image.load("city.jpg"), (1280, 720))
#Map = pygame.transform.scale(pygame.image.load("Map.png"), (1280, 720))
go = pygame.transform.scale(pygame.image.load("gameover.jpg"), (1280, 720))

for i in range(5) :
        temp = pygame.image.load("Move"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfMove.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfAttackOne = []
for i in range(6):
        temp = pygame.image.load("AttackOne"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfAttackOne.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfAttackTwo = []
for i in range(5):
        temp = pygame.image.load("AttackTwo"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfAttackTwo.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfAttackTh = []
for i in range(5):
        temp = pygame.image.load("AttackTh"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfAttackTh.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfAttackFour = []
for i in range(9):
        temp = pygame.image.load("AttackFour"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfAttackFour.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfAttack = []
PicOfAttack.append(PicOfAttackOne)
PicOfAttack.append(PicOfAttackTwo)
PicOfAttack.append(PicOfAttackTh)
PicOfAttack.append(PicOfAttackFour)
#按键状态
LeftPress = False
RightPress = False
UpPress = False
DownPress = False
AttackList = [] #使用list模拟Queue,表示4种普通攻击的顺序顺序,先进先出
AttackNumber = 0
POP = False
#人物状态
MOVE = 0
STAND = 1
ATTACK = 2
FALL = 3
LEFT = 0
RIGHT = 1
#任务状态类(血量)
def SetToFalse(List):
        for i in range(len(List)):
                List[i] = False
class People(object):
    def __init__(self,HP,MP,status,p,q,h):
        self.Hp = HP
        self.Mp = MP
        self.Status = status
        self.x = p
        self.y = q
        self.Head = h
    def lostBlood(self,number):
        self.Hp -= number
class peopleOfPlayer(People):
        def __init__(self,HP,MP,status,p,q,h):
                People.__init__(self,HP,MP,status,p,q,h)
                self.AttackJudge = []
                for i in range(10):
                        self.AttackJudge.append(False)


#精灵
class PlayerSprite(pygame.sprite.Sprite):
    global player
    def __init__(self,status,position,head):
        pygame.sprite.Sprite.__init__(self)
        self.Status = status
        self.Head = head
        self.MoveTemp = 0
        self.MoveClock = 0
        self.AttackTemp = 0
        self.AttackClock = 0
        self.Pop = False
        if self.Status == STAND and self.Head == RIGHT:
            t1,t2 = PicOfStand.get_size()
            self.image = pygame.transform.scale(PicOfStand,(t1*2,t2*2))
        elif self.Status == STAND and self.Head == LEFT:
            t1,t2 = PicOfStand.get_size()
            self.image = pygame.transform.flip(pygame.transform.scale(PicOfStand,(t1*2,t2*2)), True, False)
        self.rect = self.image.get_rect()
        self.rect.topleft = position
    def update(self,status,position,head,peopleOfPlayer):
        self.Status = status
        self.Head = head
        if self.Status == STAND and self.Head == RIGHT:
            t1,t2 = PicOfStand.get_size()
            self.image = pygame.transform.scale(PicOfStand,(t1*2,t2*2))
        elif self.Status == STAND and self.Head == LEFT:
            t1,t2 = PicOfStand.get_size()
            self.image = pygame.transform.flip(pygame.transform.scale(PicOfStand,(t1*2,t2*2)), True, False)
        elif self.Status == MOVE and self.Head == RIGHT:
            #t1,t2 = PicOfMove[self.MoveTemp].get_size()
            self.image = PicOfMove[self.MoveTemp]
        elif self.Status == MOVE and self.Head == LEFT:
            self.image = pygame.transform.flip(PicOfMove[self.MoveTemp],True,False)
        if self.Status == ATTACK:
                if self.Head == RIGHT:
                        self.image = PicOfAttack[AttackList[0]][self.AttackTemp]
                        self.rect = self.image.get_rect()
                        if AttackList[0] == 0:
                                a,b = position
                                self.rect.topleft = (a-80,b+30)
                        elif AttackList[0] == 1:
                                a,b=position
                                self.rect.topleft = (a-10,b+20)
                        elif AttackList[0] == 2:
                                a,b=position
                                self.rect.topleft = (a-10,b-150)
                        elif AttackList[0] == 3:
                                a,b=position
                                self.rect.topleft = (a-40,b-150)
                else :
                        self.image = pygame.transform.flip(PicOfAttack[AttackList[0]][self.AttackTemp],True,False)
                        self.rect = self.image.get_rect()
                        if AttackList[0] == 0:
                                a,b = position
                                self.rect.topleft = (a,b+30)
                        elif AttackList[0] == 1:
                                a,b=position
                                self.rect.topleft = (a-40,b+20)
                        elif AttackList[0] == 2:
                                a,b=position
                                self.rect.topleft = (a+10,b-150)
                        elif AttackList[0] == 3:
                                a,b=position
                                self.rect.topleft = (a-80,b-150)
        else :
               self.rect = self.image.get_rect()
               self.rect.topleft = position
        player.rect = self.rect#新增rect用来判定攻击范围
    def timetick(self):
        if self.Pop:
                self.Pop = False
        #每过一个时间周期,各种状态的动画效果
        if self.Status == MOVE:
            self.MoveClock += 1
            #print(self.MoceClock)
            if self.MoveClock >= 13:
                self.MoveClock = 0
                self.MoveTemp +=1
                if self.MoveTemp >=5:
                    self.MoveTemp =0
        elif self.Status == ATTACK:
                #print(self.AttackClock+self.AttackTemp)
                self.AttackClock+=1
                if self.AttackClock >=7:
                        self.AttackClock = 0
                        self.AttackTemp +=1
                        if AttackList[0] == 0  :
                                a=6
                        elif AttackList[0] == 1 or AttackList[0] == 2:
                                a=5
                        else:
                                a=9
                        if self.AttackTemp >=a:
                                        self.AttackTemp =0
                                        AttackList.pop(0)
                                        
                                        self.Pop = True
                                        if not len(AttackList):
                                                if LeftPress or RightPress or UpPress or DownPress:
                                                        player.Status = MOVE
                                                        if LeftPress:
                                                                player.Head = LEFT
                                                        if RightPress:
                                                                player.Head = RIGHT
                                                
                                                else :
                                                        player.Status = STAND
                                                self.AttackTemp = 0
                                                self.AttackClock = 0
#---------以下代码单独存发,这里只是测试------------
PicOfE1Move=[]
PicOfEMove = []
PicOfE1Fall=[]
PicOfE1Attack=[]
for i in range(8) :
        temp = pygame.image.load("EMove0-"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfE1Move.append(pygame.transform.scale(temp , (t1*2, t2*2)))
for i in range(12) :
        temp = pygame.image.load("EFall0-"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfE1Fall.append(pygame.transform.scale(temp , (t1*2, t2*2)))
for i in range(6) :
        temp = pygame.image.load("EAttack0-"+str(i)+".png")
        t1,t2 = temp.get_size()
        PicOfE1Attack.append(pygame.transform.scale(temp , (t1*2, t2*2)))
PicOfEStand0 = pygame.image.load("EStand0.png")#玩家站立状态
PicOfEHitten0 =pygame.transform.scale( pygame.image.load("EHitten0.png"), (pygame.image.load("EHitten0.png").get_size()[0]*2, pygame.image.load("EHitten0.png").get_size()[1]*2))
AttackMax = False
class EnemyOne(People):
        global AttackMax
        global player
        global playerSprite
        def __init__(self,HP,MP,status,p,q,h):
                People.__init__(self,HP,MP,status,p,q,h)
                if self.x!=player.x:
                        self.a = atan(abs(player.y-self.y)/abs(player.x-self.x))
                else :
                        self.a = 0
                self.SpeedX = abs (0.8*cos(self.a))
                self.SpeedY = abs (0.8*sin(self.a))
                self.MoveTemp = 0
                self.MoveClock = 0
                self.AttackTemp = 0
                self.AttackClock = 0
                self.FallTemp = 0
                self.FallClock = 0
                self.Hitten = 0
                self.HittenJudge = [False,False,False,False]
                if self.Head == RIGHT :
                        t1,t2 = PicOfStand.get_size()
                        self.image = pygame.transform.scale(PicOfEStand0,(floor(t1*2),floor(t2*2)))
                else :
                        t1,t2 = PicOfStand.get_size()
                        self.image = pygame.transform.flip(pygame.transform.scale(PicOfEStand0,(floor(t1*2),floor(t2*2))), True, False)
                self.rect = self.image.get_rect()
                self.rect.topleft = (self.x,self.y)
        def update(self):
                if self.x!=player.x:
                        self.a = atan(abs(player.y-self.y)/abs(player.x-self.x))
                else :
                        self.a = 0
                self.SpeedX = abs (0.8*cos(self.a))
                self.SpeedY = abs (0.8*sin(self.a))
                if self.Status == STAND and self.Head == RIGHT and not self.Hitten:
                    t1,t2 = PicOfEStand0.get_size()
                    self.image = pygame.transform.scale(PicOfEStand0,(floor(t1*2),t2*2))
                    if player.x <= self.x:
                            if not randint(0,100):
                                    self.Head = LEFT
                    else:
                            self.Status = MOVE
                elif self.Status == STAND and self.Head == LEFT and not self.Hitten:
                    t1,t2 = PicOfEStand0.get_size()
                    self.image = pygame.transform.flip(pygame.transform.scale(PicOfEStand0,(t1*2,t2*2)), True, False)
                    if player.x >= self.x:
                            if not randint(0,100):
                                    self.Head = RIGHT
                    else:
                            self.Status = MOVE
                elif self.Status == MOVE and self.Head == RIGHT and not self.Hitten:
            #t1,t2 = PicOfMove[self.MoveTemp].get_size()
                    self.image = PicOfE1Move[self.MoveTemp]
                    self.x +=self.SpeedX
                    if self.y > player.y:
                            self.y -= self.SpeedY
                    else :
                            self.y +=self.SpeedY
                    if self.x > player.x:
                            self.Head = LEFT
                elif self.Status == MOVE and self.Head == LEFT and not self.Hitten:
                    self.image = pygame.transform.flip(PicOfE1Move[self.MoveTemp],True,False)
                    self.x -= self.SpeedX
                    if self.y > player.y:
                            self.y -= self.SpeedY
                    else :
                            self.y +=self.SpeedY
                    if self.x < player.x:
                            self.Head = RIGHT
                if self.Hitten and self.Status !=FALL:
                        if self.Head == RIGHT:
                                self.image=PicOfEHitten0
                        else :
                                self.image = pygame.transform.flip(PicOfEHitten0,True,False)
                if len(AttackList):
                        if self.Hitten and AttackList[0] == 3 and player.Head != self.Head and self.AttackTemp<3:
                                self.Status = FALL
                        
                if self.Status == FALL:
                        #print(self.FallTemp)
                        if self.Head == RIGHT:
                                self.image = PicOfE1Fall[self.FallTemp]
                                if self.FallTemp <=6:
                                        self.x -= 3
                                        #self.y += randint(-2,2)
                        else :
                                self.image = pygame.transform.flip(PicOfE1Fall[self.FallTemp],True,False)
                                if self.FallTemp <= 6:
                                        self.x +=3
                        if self.FallTemp == 11:
                                self.Status = MOVE
                                self.FallTemp =0
                if player.Status == ATTACK and self.rect.colliderect(player.rect) and len(AttackList)and self.HittenJudge[AttackList[0]] !=True and player.Head != self.Head and  not AttackMax:
                        SetToFalse(self.HittenJudge)
                        self.HittenJudge[AttackList[0]] =True
                        self.Hitten =1
                        if self.Status != FALL:
                                self.lostBlood((AttackList[0]+1)*(AttackList[0]+1))
                        if player.x >= self.x:
                                self.Head = RIGHT
                        else:
                                self.Head = LEFT
                if player.Status != ATTACK or not self.rect.colliderect(player.rect) :
                        self.Hitten = 0
                if self.rect.colliderect(player.rect) and self.Status == MOVE:
                        self.Status = ATTACK
                if self.Status == ATTACK and self.Hitten == 0:
                        if self.Head == LEFT:
                                self.image = pygame.transform.flip(PicOfE1Attack[self.AttackTemp],True,False)
                        else:
                                self.image = PicOfE1Attack[self.AttackTemp]
                if player.Status !=ATTACK and True in self.HittenJudge:
                        SetToFalse(self.HittenJudge)
                self.rect = self.image.get_rect()
                self.rect.topleft = (self.x,self.y)
                if self.FallTemp >= 3:
                        self.rect.topleft = (self.x,self.y+120)
                if self.Hitten and self.Status!=FALL :
                        if self.Hitten>4 and self.Hitten <8:
                                if self.Head == LEFT:
                                        self.rect.topleft = (self.x+10,self.y-10)
                                else :
                                        self.rect.topleft = (self.x-10,self.y-10)
                        elif self.Hitten>=8 and self.Hitten <12:
                                if self.Head == LEFT:
                                        self.rect.topleft = (self.x+20,self.y-20)
                                else :
                                        self.rect.topleft = (self.x-20,self.y-20)
                        elif self.Hitten>=12 and self.Hitten <16:
                                if self.Head == LEFT:
                                        self.rect.topleft = (self.x+10,self.y-10)
                                else :
                                        self.rect.topleft = (self.x-10,self.y-10)
                        
        def timetick(self):
        #每过一个时间周期,各种状态的动画效果
                if self.Status == MOVE:
                    self.MoveClock += 1
            #print(self.MoceClock)
                    if self.MoveClock >= 13:
                        self.MoveClock = 0
                        self.MoveTemp +=1
                        if self.MoveTemp >=8:
                            self.MoveTemp =0
                if self.Hitten :
                        self.Hitten +=1
                        #print(self.Hitten)
                        if playerSprite.Pop:
                                #print(self.Hitten)
                                self.Hitten = 0
                                playerSprite.Pop = False
                if self.Status == FALL :
                        self.FallClock +=1
                        if self.FallClock >=18:
                                self.FallClock = 0
                                self.FallTemp +=1
                                if self.FallTemp >= 12:
                                        self.FallTemp = 0
                if self.Status == ATTACK:
                        self.AttackClock+=1
                        if self.AttackClock >= 15:
                                self.AttackClock = 0
                                self.AttackTemp += 1
                                if self.AttackTemp >= 6:
                                        self.AttackTemp = 0
                                        self.Status = MOVE
                           
def UPDATE(DATA):
        global player
        for i in range(len(DATA)):
                DATA[i].update()
        
        a = 0
        for i in range(len(DATA)):
                if DATA[i].Hitten != 0 :
                        a +=1
                        if a>4 :
                             DATA[i].Hitten = 0
                             DATA[i].Status = MOVE
        L = []
        for i in range(len(DATA)):      
                        if DATA[i].Hp <=0:
                                L.append(i)
        for i in range (len(L)):
           if len(L):
                DATA.pop(L[i])
                player.AttackJudge.pop(i)
        for i in range (len(DATA)):
                if DATA[i].Status == ATTACK:
                        if(DATA[i].rect.colliderect(player.rect)) and DATA[i].AttackTemp >=3 and not player.AttackJudge[i]:
                                player.lostBlood(10)
                                player.AttackJudge[i] = True
                else:
                        player.AttackJudge[i] = False
                #if DATA[i].AttackTemp ==5 :
                        #player.AttackJudge[i] = False
                        
def TIMETICK(DATA):
        for i in range(len(DATA)):
                DATA[i].timetick()
def BLIT(DATA):
        global screen
        for i in range(len(DATA)):
                screen.blit(DATA[i].image,DATA[i].rect)

#----------------------------------------------------------
                                        
pygame.init()
player = peopleOfPlayer(500,100,STAND,400,300,RIGHT)
playerSprite = PlayerSprite(player.Status,(player.x,player.y),player.Head)
#ttt = EnemyOne(100,100,STAND,800,100,RIGHT)
Enemy=[]
for i in range(10):
        Enemy.append(EnemyOne(100,100,STAND,randint(0,1300),randint(200,800),randint(0,1)))
screen = pygame.display.set_mode((1280,720),0,32)
screen.fi喵))
background = Map.convert()
win = Win.convert()
Go = go.convert()
while True:
     for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT :
                LeftPress = True
                #RightPress = False
                if player.Head !=LEFT:
                    playerSprite.MoveClock = 0
                    playerSprite.MoveTemp = 0
                if player.Status != ATTACK:
                        player.Status = MOVE
                        player.Head = LEFT
            if event.key == K_RIGHT:
                RightPress = True
                #LeftPress = False
                if player.Head != RIGHT:
                    playerSprite.MoveClock = 0
                    playerSprite.MoveTemp = 0
                if player.Status != ATTACK:
                        player.Status = MOVE
                        player.Head = RIGHT
            if event.key ==K_UP:
                UpPress = True
                #LeftPress = False
                if player.Status != MOVE:
                    playerSprite.MoveClock = 0
                    playerSprite.MoveTemp = 0
                player.Status = MOVE
            if event.key ==K_DOWN:
                DownPress = True
                #LeftPress = False
                if player.Status != MOVE:
                    playerSprite.MoveClock = 0
                    playerSprite.MoveTemp = 0
                player.Status = MOVE
            if event.key == K_a:
                    if len(AttackList) <=3 :
                            if len(AttackList) == 0:
                                    AttackNumber = 0
                                    AttackList.append(AttackNumber)
                            else:
                                    AttackNumber +=1
                                    if AttackNumber <4 and 3 not in AttackList:
                                            AttackList.append(AttackNumber)
                                    else:
                                            AttackNumber = 0
                    
        if event.type == KEYUP:
            playerSprite.MoveClock = 0
            playerSprite.MoveTemp = 0
            if event.key == K_LEFT:
                LeftPress = False
                if RightPress == True:
                    player.Head = RIGHT
                elif UpPress or DownPress:
                    player.Status = MOVE
                else:
                    player.Status = STAND
                    player.Head = LEFT
            if event.key == K_RIGHT:
                RightPress = False
                if LeftPress == True:
                    player.Head = LEFT
                elif UpPress or DownPress:
                    player.Status = MOVE
                else:
                    player.x +=100
                    player.Status = STAND
                    player.Head = RIGHT
            if event.key == K_UP:
                UpPress = False
                if RightPress or LeftPress or DownPress:
                    player.Status = MOVE
                else:
                    player.Status = STAND
            if event.key == K_DOWN:
                DownPress = False
                if RightPress or LeftPress or UpPress:
                    player.Status = MOVE
                else:
                    player.Status = STAND
        if event.type == TIMER:
            #screen.fi喵))
            if not len(Enemy) and player.Hp >0:
                while True:
                        screen.blit(win,(0,0)) 
                        for event in pygame.event.get():
                                if event.type == QUIT:
                                    pygame.quit()
                        pygame.display.update()
            if player.Hp <=0 :
                while True:
                        screen.blit(Go,(0,0))
                        pygame.display.update()
                        for event in pygame.event.get():
                                if event.type == QUIT:
                                    pygame.quit()
                        
            screen.blit(background,(0,0)) 
            if LeftPress and player.Status ==MOVE and player.Head == LEFT:
                player.x -= 3
                if player.x<0:
                    player.x=0
            elif RightPress and player.Status==MOVE and player.Head == RIGHT:
                player.x += 3
                if player.x>1280-250:
                    player.x=1280-250
            if UpPress and player.Status==MOVE:
                player.y-=3
                if player.y < 200:
                    player.y = 200
            if DownPress and player.Status==MOVE:
                player.y += 3
                if player.y > 720-120:
                    player.y = 720-120
            #print(player.x)
            if  len(AttackList):
                    player.Status = ATTACK
                    #print("dx")

            
            playerSprite.update(player.Status,(player.x,player.y),player.Head,player)
            #print(playerSprite.MoveClock)
            UPDATE(Enemy)
            playerSprite.timetick()
            TIMETICK(Enemy)
         
        BLIT(Enemy)
        screen.blit(playerSprite.image,playerSprite.rect)
        tempRect = Rect((30,30),(1280-60,30))
        pygame.draw.rect(screen,(255,255,255),tempRect,1)
        if player.Hp >=0:
                tempRect2 = Rect((31,31),((player.Hp/500)*1280-62,28))
                pygame.draw.rect(screen,(220,20,60),tempRect2,0)
        
     pygame.display.update()
     

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页