Python 当玩家通过键盘移动时,Pygame敌人随机显示

Python 当玩家通过键盘移动时,Pygame敌人随机显示,python,pygame,sprite,Python,Pygame,Sprite,我正在制作一个足球游戏(美式),其中有一个玩家类通过键盘在一个程序中移动图像: import pygame import os import random black = (0,0,0) white = (255,255,255) red = (255, 0, 0) green = (0, 100, 0) # This class represents the bar at the bottom that the player controls class Player(object):

我正在制作一个足球游戏(美式),其中有一个玩家类通过键盘在一个程序中移动图像:

import pygame
import os
import random

black = (0,0,0)
white = (255,255,255)
red = (255, 0, 0)
green = (0, 100, 0)


# This class represents the bar at the bottom that the player controls
class Player(object):
    def __init__(self):
        self.image = pygame.image.load("player_one.png").convert()
        self.image.set_colorkey(white)
        self.width = 15
        self.height = 15
        self.x = 940
        self.y = 240

    def handle_keys(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_DOWN]:
            if self.y < 470:
                self.y += self.height
        elif key[pygame.K_UP]:
            if self.y > 0:
                self.y -= self.height
        if key[pygame.K_RIGHT]:
            if self.x < 940:
                self.x += self.width
        elif key[pygame.K_LEFT]:
            if self.x > 0:
                self.x -= self.width

    def draw(self, surface):
        surface.blit(self.image, (self.x, self.y))


pygame.init()
screen = pygame.display.set_mode((1000, 500))

player = Player()
clock = pygame.time.Clock()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            running = False

    player.handle_keys()

    screen.fill(green)

    for x in range(60,940,35):
        pygame.draw.line(screen, white, [x, 0], [x, 500], 1)

    player.draw(screen)
    pygame.display.update()

    clock.tick(20)
首先,感谢那些帮助我走到这一步的人。第二个-我需要将Player类合并到第二个程序中。我需要添加碰撞检测,这样,如果玩家进入左端区域,他的分数将增加+7,他将返回起点。此外,如果玩家遇到敌人,他会回到起点。我希望比赛有一个2分钟的计时器,所以目标是在比赛结束前的时间范围内得分

我知道很多人会推荐Sprites,我也希望如此,但请您提供代码/解释。附件是我的照片


我推荐雪碧!我不会把一切都告诉你,因为搞清楚游戏编程有一半的乐趣! 首先,您可以设置pygame组,如 player_list=pygame.sprite.Group() 玩家列表。添加(玩家) 对于玩家和敌人,使用pygame.sprite.spritecollide测试他们之间的碰撞,或者在球场左侧区域使用类似的东西。。 然后,正如furas提到的,只需复制或导入播放器类即可 另外,我建议您为计时器设置pygame.time.get_ticks(),尽管您可以通过其他方式实现。。 剩下的全靠你了!我希望这在某种程度上有所帮助,如果你不明白,可以问任何问题!
我在手机上做过这项工作,所以如果有人想编辑所有代码,那就太好了:)

我有点不明白你在问什么,我希望这能回答你所有的问题:

首先,敌人不会在每次更新时“传送”到随机位置吗?我不确定你想要实现什么,但是如果你在init上随机选择他们的位置(你将他们的x和y设置为0),在更新中你应该创建一些人工智能(比如跟随英雄?)

类敌人():
定义初始化(自我,图像):
self.image=pygame.image.load(image.convert())
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.centerx=random.randint(60220+1)
self.rect.centery=random.randint(0475+1)
#------------
def提取(自身,屏幕):
screen.blit(self.image,self.rect)
#------------
def更新(self、heroX、heroY):
#让敌人跟随英雄(例如)
如果heroX>self.rect.centerx
self.rect.centerx+=10#10是示例值,设置您喜欢的示例值!
否则,如果heroX
只要确保在更新敌人时通过玩家的x和y

关于碰撞,有一个简单的算法是这样的:如果有objectA和objectB,它们只会碰撞如果objectA.right>objectB.left&&objectA.left
if (player.right > enemy.left && player.left < enemy.right && player.bottom > enemy.top && player.top < enemy.bottom)
    player.reset()
    enemy.reset()
if(player.right>敌军.left&&player.left<敌军.right&&player.bottom>敌军.top&&player.top<敌军.bottom)
player.reset()
敌人。重置()
对每个敌人(和英雄,如果有多个)应用此算法一次


关于计时器,您已经有了一个限制帧的计时器,您可以使用它来计算游戏中的秒数并创建限制(使用您的想象力!)

我将代码分为3个文件
Player.py
敌方.py
game.py

Player.py

  • 我添加了
    restart()
    以在新游戏和游戏重新启动时设置开始位置
  • handle\u event
    中,我使用event(检查键),以便在必要时可以检查鼠标事件和其他事件-它更通用
  • handle_事件
    return
    True/False
    是否移动了玩家

Game.py

最好的部分:)尝试找出代码中发生了什么;)

  • 碰撞检测-它可以被使用,等等
  • 为玩家和敌人得分
  • 计时
  • 游戏结束-
    退格
    游戏结束后重新开始游戏

随机导入
导入pygame
从玩家导入*
从敌人进口*
白色=(255255)
黑色=(0,0,0)
红色=(255,0,0)
#----------------------------------------------------------------------
类游戏():
定义初始化(自):
pygame.init()
self.screen=pygame.display.set_模式((1400500))
self.background=pygame.image.load(“GameField1.png”).convert()
self.feeds=[]
#self.players=[]
self.player=player(self.screen.get_rect())
#创建3个敌人0…2
对于范围(3)中的i:
敌人=敌人(“敌人”+str(i)+.png”)
敌人。更新()#开始时设置随机位置
self.敌人.append(敌人)
self.font=pygame.font.SysFont(“,32”)
self.gameover_text=self.font.render(“游戏结束”,-1,红色)
self.gameover_rect=self.gameover_text.get_rect(center=self.screen.get_rect().center)
self.restart()
#------------
def重启(自我):
self.player_分数=0
self.u得分=0
#self.play_time=2*60#2分钟*60秒
self.play_time=30#30秒用于快速测试
self.change_time=pygame.time.get_ticks()+1000#1s
self.player.restart()
#------------
def更新时间(自我):
打印“(调试):时间:”,self.change\u time,pygame.time.get\u ticks()
如果pygame.time.get_ticks()>=self.change_time:
自我改变时间+=1000秒
self.play_time-=1
返回self.play\u time复制播放
class Enemy():

def __init__(self, image):

    self.image = pygame.image.load(image).convert()
    self.image.set_colorkey(WHITE)
    self.rect = self.image.get_rect()

    self.rect.centerx = random.randint(60,220+1)
    self.rect.centery = random.randint( 0, 475+1)

#------------

def draw(self, screen):
    screen.blit(self.image, self.rect)

#------------

def update(self, heroX, heroY):
    #Make enemies follow hero (for example)
    if heroX > self.rect.centerx
        self.rect.centerx += 10; #10 is example value, set the one you like!
    else if heroX < self.rect.centerx
        self.rect.centerx -= 10;

    #Do the same for y

#------------

def reset(self): #This is called when hero scores, or enemies touch hero (and you want to reset hero to starting point and enemies)
    self.rect.centerx = random.randint(60,220+1)
    self.rect.centery = random.randint( 0, 475+1)
if (player.right > enemy.left && player.left < enemy.right && player.bottom > enemy.top && player.top < enemy.bottom)
    player.reset()
    enemy.reset()
import pygame

#----------------------------------------------------------------------

class Player(object):

    def __init__(self, surface_rect):

        self.surface_rect = surface_rect

        self.image = pygame.image.load("player_one.png").convert()
        self.image.set_colorkey( (255,255,255) )

        self.rect = self.image.get_rect() # you get image width, height

        self.move_x = 15
        self.move_y = 15

        self.restart()

    #------------

    def restart(self):

        self.rect.x = 940
        self.rect.y = 240

    #------------

    def handle_events(self, event):
        player_moves = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_DOWN:
                if self.rect.bottom < self.surface_rect.bottom: #470
                    self.rect.y += self.move_y
                    player_moves = True

            elif event.key == pygame.K_UP:
                if self.rect.top > self.surface_rect.top:
                    self.rect.y -= self.move_y
                    player_moves = True

            elif event.key == pygame.K_RIGHT:
                if self.rect.right < self.surface_rect.right:
                    self.rect.x += self.move_x
                    player_moves = True

            elif event.key == pygame.K_LEFT:
                if self.rect.left > self.surface_rect.left:
                    self.rect.x -= self.move_x
                    player_moves = True

            print "(debug): player: x, y:", self.rect.x, self.rect.y

        return player_moves
    #------------

    def draw(self, surface):
        surface.blit(self.image, self.rect)

#----------------------------------------------------------------------
import pygame
import random

#----------------------------------------------------------------------

class Enemy():

    def __init__(self, image, x=0, y=0):

        self.image = pygame.image.load(image).convert()
        self.image.set_colorkey( (255,255,255) )

        self.rect = self.image.get_rect()

        self.rect.centerx = x
        self.rect.centery = y

    #------------

    def draw(self, screen):
        screen.blit(self.image, self.rect)

    #------------

    def update(self):
        # here change randomly positon
        self.rect.topleft = random.randint(60, 220+1), random.randint(0, 475+1)

#----------------------------------------------------------------------
import random
import pygame

from Player import *
from Enemy import *

WHITE = (255,255,255)
BLACK = (0  ,0  ,0  )
RED   = (255,0  ,0  )

#----------------------------------------------------------------------

class Game():

    def __init__(self):

        pygame.init()

        self.screen = pygame.display.set_mode((1400,500))

        self.background = pygame.image.load("GameField1.png").convert()

        self.enemies = []
        #self.players = []
        self.player = Player(self.screen.get_rect())

        # create 3 enemies 0...2

        for i in range(3):
            enemy = Enemy("enemy_"+str(i)+".png")
            enemy.update() # set random position on start
            self.enemies.append(enemy)

        self.font = pygame.font.SysFont("", 32)

        self.gameover_text = self.font.render("GAME OVER", -1, RED)
        self.gameover_rect = self.gameover_text.get_rect(center=self.screen.get_rect().center)

        self.restart()

    #------------

    def restart(self):

        self.player_score = 0
        self.enemies_score = 0

        #self.play_time = 2*60 # 2minutes * 60 seconds
        self.play_time = 30 # 30 seconds for fast test
        self.change_time = pygame.time.get_ticks() + 1000 # 1s

        self.player.restart()

    #------------

    def update_time(self):
        print "(debug): time:", self.change_time, pygame.time.get_ticks()

        if pygame.time.get_ticks() >= self.change_time:
            self.change_time += 1000 # 1s
            self.play_time -= 1

        return self.play_time <= 0 # GAME OVER ?

    #------------

    def draw_score(self, surface):
        surface_rect = surface.get_rect()

        self.player_score_text = self.font.render(str(self.player_score) + " :Player", -1, WHITE)
        self.player_score_rect = self.player_score_text.get_rect(right=surface_rect.right-10, top=10)

        surface.blit(self.player_score_text, self.player_score_rect)

        self.enemies_score_text = self.font.render("Enemy: " + str(self.enemies_score), -1, WHITE)
        self.enemies_score_rect = self.enemies_score_text.get_rect(left=surface_rect.left+10, top=10)

        surface.blit(self.enemies_score_text, self.enemies_score_rect)

        print "(debug): render scores:", self.player_score, self.player_score_rect, self.enemies_score, self.enemies_score_rect

    #------------

    def draw_time(self, surface):
        surface_rect = surface.get_rect()

        time_str = "%02d:%02d" % (self.play_time/60, self.play_time%60)

        self.time_text = self.font.render(time_str, -1, RED )
        self.time_rect = self.time_text.get_rect(centerx=surface_rect.centerx, top=10)

        surface.blit(self.time_text, self.time_rect)

        print "(debug): render time:", self.play_time, self.time_rect, (self.play_time/60, self.play_time%60), time_str 

    #------------

    def run(self):

        clock = pygame.time.Clock()

        RUNNING = True
        GAME_OVER = False

        while RUNNING:

            # --- events ---

            PLAYER_MOVES = False

            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    RUNNING = False

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        RUNNING = False

                    if event.key == pygame.K_BACKSPACE:
                        if GAME_OVER:
                            GAME_OVER = False
                            self.restart()

                # player moves

                if not GAME_OVER:
                    PLAYER_MOVES = self.player.handle_events(event)

            # --- updates ---- 

            if PLAYER_MOVES and not GAME_OVER:

                # changes position when key is pressed

                for enemy in self.enemies:
                    enemy.update()

                # check collisions

                collision = False
                for enemy in self.enemies:
                    if pygame.sprite.collide_rect(self.player, enemy):
                        collision = True
                        break # first collision and I don't check rest enemies

                if collision:
                    self.enemies_score += 7
                    print "(debug): game: collision:", self.player_score, self.enemies_score
                    self.player.restart()

                # check touchdown

                if self.player.rect.left <= 100:
                    self.player_score += 7
                    print "(debug): game: touchdown:", self.player_score, self.enemies_score
                    self.player.restart()

            if not GAME_OVER:
                GAME_OVER = self.update_time()

            # --- draws ---

            self.screen.fill(BLACK)

            self.screen.blit(self.background, self.background.get_rect())

            self.player.draw(self.screen)

            for enemy in self.enemies:
                enemy.draw(self.screen)

            self.draw_time(self.screen)
            self.draw_score(self.screen)

            if GAME_OVER:
                self.screen.blit(self.gameover_text, self.gameover_rect)

            pygame.display.update()

            # --- FPS ---

            clock.tick(20) 

#----------------------------------------------------------------------

Game().run()