Python游戏开发2—生死追逐


一、初始版本

import sys,pygame

# 常数
size = width,height=800,600      # 窗体大小
init_speed = 1                   # 初始速度
speed = [init_speed,init_speed]  # 实际速度(横坐标速度和纵坐标速度) 
black = 0,0,0
white = 255,255,255                          
fps = 200

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
 
# 对象创建
image = pygame.image.load("thief.jpg")        #图片对象
imageRect = image.get_rect()                  #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

while True:
    for event in pygame.event.get(): #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:  #键盘操作,←↓→↑改变方向
            if event.key==pygame.K_LEFT:
                speed[0] = -init_speed
            if event.key==pygame.K_RIGHT:
                speed[0] = init_speed
            if event.key==pygame.K_DOWN:
                speed[1] = init_speed
            if event.key==pygame.K_UP:
                speed[1] = -init_speed

    imageRect=imageRect.move(speed[0],speed[1])      #正切矩形对象运动
 
    # 碰壁反弹
    if imageRect.left < 0 or imageRect.right > width:    
        speed[0] =- speed[0]
    if imageRect.top < 0 or imageRect.bottom > height:
        speed[1] =- speed[1]
 
    screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
    screen.blit(image,imageRect)         #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动
    fclock.tick(fps)                     #设置fps
    pygame.display.update()              #刷新屏幕

二、函数封装

import sys,pygame
 
# 常数
size = width,height=800,600      # 窗体大小
init_speed = 1                   # 初始速度
speed = [init_speed,init_speed]  # 实际速度(横坐标速度和纵坐标速度) 
black = 0,0,0
white = 255,255,255                          
fps = 200

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
 
# 对象创建
image = pygame.image.load("thief.jpg")        #图片对象
imageRect = image.get_rect()                  #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

# 移动控制,←↓→↑改变方向
def moveControl():
    if event.key==pygame.K_LEFT:
        speed[0] = -init_speed
    if event.key==pygame.K_RIGHT:
        speed[0] = init_speed
    if event.key==pygame.K_DOWN:
        speed[1] = init_speed
    if event.key==pygame.K_UP:
        speed[1] = -init_speed

# 碰壁反弹
def crashWall():
    if imageRect.left < 0 or imageRect.right > width:    
        speed[0] =- speed[0]
    if imageRect.top < 0 or imageRect.bottom > height:
        speed[1] =- speed[1]

# 移动
def move():
    global imageRect  #在函数内部可以访问全局变量的值,但不可修改,如要修改需先声明
    imageRect = imageRect.move(speed[0],speed[1])      #正切矩形对象运动
    screen.blit(image,imageRect)          #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动

while True:
    for event in pygame.event.get():     #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN: #键盘事件
            moveControl()

    screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
    crashWall()
    move()
    fclock.tick(fps)                     #设置fps
    pygame.display.update()              #刷新屏幕

三、类的创建

import sys,pygame
 
# 常数
size = width,height=800,600      # 窗体大小
black = 0,0,0
white = 255,255,255                          
fps = 200

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

# 人类、属性是移动速度,方法是会移动,并且还会撞墙
class man():
    # 初始属性
    def __init__(self):
        self.init_speed = 1                   # 初始速度
        self.speed = [self.init_speed,self.init_speed]  # 实际速度(横坐标速度和纵坐标速度)
        # 人类实际上是从图片类进化而来
        self.image = pygame.image.load("thief.jpg")        #图片对象
        self.imageRect = self.image.get_rect()                  #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法 

    # 移动控制,←↓→↑改变方向
    def moveControl(self):
        if event.key==pygame.K_LEFT:
            self.speed[0] = -self.init_speed
        if event.key==pygame.K_RIGHT:
            self.speed[0] = self.init_speed
        if event.key==pygame.K_DOWN:
            self.speed[1] = self.init_speed
        if event.key==pygame.K_UP:
            self.speed[1] = -self.init_speed

    # 碰壁反弹
    def crashWall(self):
        if  self.imageRect.left < 0 or  self.imageRect.right > width:    
            self.speed[0] =- self.speed[0]
        if  self.imageRect.top < 0 or  self.imageRect.bottom > height:
            self.speed[1] =- self.speed[1]

    # 移动
    def move(self):
        self.imageRect =  self.imageRect.move(self.speed[0],self.speed[1])      #正切矩形对象运动
        screen.blit(self.image, self.imageRect)          #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动

# 类的实例化,先实例化一个小偷
theif = man()

while True:
    for event in pygame.event.get():     #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN: #键盘事件
            theif.moveControl()

    screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
    theif.crashWall()
    theif.move()
    fclock.tick(fps)                     #设置fps
    pygame.display.update()              #刷新屏幕

四、多个对象

from email.mime import image
import sys,pygame
 
# 常数
size = width,height=800,600      # 窗体大小
black = 0,0,0
white = 255,255,255                          
fps = 200

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

# 人类、属性是移动速度,方法是会移动,并且还会撞墙
class man():
    # 初始属性
    def __init__(self,init_speed,image_url,init_position):
        self.init_speed = init_speed                    # 初始速度
        self.speed = [self.init_speed,self.init_speed]  # 实际速度(横坐标速度和纵坐标速度)
        # 人类实际上是从图片类进化而来
        self.image = pygame.image.load(image_url)       #图片对象
        self.imageRect = self.image.get_rect()          #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法 
        self.imageRect.left = init_position[0]          #初始位置(横坐标)
        self.imageRect.top = init_position[1]           #初始位置(纵坐标)

    # 移动控制,←↓→↑改变方向
    def moveControl(self):
        if event.key==pygame.K_LEFT:
            self.speed[0] = -self.init_speed
        if event.key==pygame.K_RIGHT:
            self.speed[0] = self.init_speed
        if event.key==pygame.K_DOWN:
            self.speed[1] = self.init_speed
        if event.key==pygame.K_UP:
            self.speed[1] = -self.init_speed

    # 碰壁反弹
    def crashWall(self):
        if  self.imageRect.left < 0 or  self.imageRect.right > width:    
            self.speed[0] =- self.speed[0]
        if  self.imageRect.top < 0 or  self.imageRect.bottom > height:
            self.speed[1] =- self.speed[1]

    # 移动
    def move(self):
        self.imageRect =  self.imageRect.move(self.speed[0],self.speed[1])      #正切矩形对象运动
        screen.blit(self.image, self.imageRect)          #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动

# 类的实例化,这次实例两个对象
theif = man(1,"thief.jpg",[10,10])
police = man(1.2,"police.jpg",[600,400])

while True:
    for event in pygame.event.get():     #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN: #键盘事件
            theif.moveControl()
            police.moveControl()

    screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
    theif.crashWall()
    theif.move()
    police.crashWall()
    police.move()
    fclock.tick(fps)                     #设置fps
    pygame.display.update()              #刷新屏幕

五、分别控制

from email.mime import image
import sys,pygame
 
# 常数
size = width,height=800,600      # 窗体大小
black = 0,0,0
white = 255,255,255                          
fps = 200

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

# 人类、属性是移动速度,方法是会移动,并且还会撞墙
class man():
    # 初始属性
    def __init__(self,init_speed,image_url,init_position):
        self.init_speed = init_speed                    # 初始速度
        self.speed = [self.init_speed,self.init_speed]  # 实际速度(横坐标速度和纵坐标速度)
        # 人类实际上是从图片类进化而来
        self.image = pygame.image.load(image_url)       #图片对象
        self.imageRect = self.image.get_rect()          #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法 
        self.imageRect.left = init_position[0]          #初始位置(横坐标)
        self.imageRect.top = init_position[1]           #初始位置(纵坐标)

    # 移动控制,←↓→↑改变方向
    def moveControl(self,Key):
        if event.key == Key[0]:
            self.speed[0] = -self.init_speed
        if event.key == Key[1]:
            self.speed[0] = self.init_speed
        if event.key == Key[2]:
            self.speed[1] = self.init_speed
        if event.key == Key[3]:
            self.speed[1] = -self.init_speed

    # 碰壁反弹
    def crashWall(self):
        if  self.imageRect.left < 0 or  self.imageRect.right > width:    
            self.speed[0] =- self.speed[0]
        if  self.imageRect.top < 0 or  self.imageRect.bottom > height:
            self.speed[1] =- self.speed[1]

    # 移动
    def move(self):
        self.imageRect =  self.imageRect.move(self.speed[0],self.speed[1])      #正切矩形对象运动
        screen.blit(self.image, self.imageRect)          #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动

# 类的实例化,这次实例两个对象
theif = man(1,"thief.jpg",[10,10])
police = man(1.2,"police.jpg",[600,400])

while True:
    for event in pygame.event.get():     #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN: #键盘事件
            theif.moveControl([pygame.K_LEFT,pygame.K_RIGHT,pygame.K_DOWN,pygame.K_UP])
            police.moveControl([pygame.K_a,pygame.K_d,pygame.K_s,pygame.K_w])

    screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
    theif.crashWall()
    theif.move()
    police.crashWall()
    police.move()
    fclock.tick(fps)                     #设置fps
    pygame.display.update()              #刷新屏幕

六、碰撞检测

from email.mime import image
import sys,pygame
 
# 常数
size = width,height=800,600      # 窗体大小
black = 0,0,0
white = 255,255,255                          
fps = 200
start = True

# 游戏设置
pygame.init() 
screen = pygame.display.set_mode(size)
pygame.display.set_caption('神偷魅影') 
fclock = pygame.time.Clock()                  #时钟对象用于设置fps

# 人类、属性是移动速度,方法是会移动,并且还会撞墙
class man():
    # 初始属性
    def __init__(self,init_speed,image_url,init_position):
        self.init_speed = init_speed                    # 初始速度
        self.speed = [self.init_speed,self.init_speed]  # 实际速度(横坐标速度和纵坐标速度)
        # 人类实际上是从图片类进化而来
        self.image = pygame.image.load(image_url)       #图片对象
        self.imageRect = self.image.get_rect()          #获得正切矩形对象,具有左右顶底四个属性,具有移动等方法 
        self.imageRect.left = init_position[0]          #初始位置(横坐标)
        self.imageRect.top = init_position[1]           #初始位置(纵坐标)

    # 移动控制,←↓→↑改变方向
    def moveControl(self,Key):
        if event.key == Key[0]:
            self.speed[0] = -self.init_speed
        if event.key == Key[1]:
            self.speed[0] = self.init_speed
        if event.key == Key[2]:
            self.speed[1] = self.init_speed
        if event.key == Key[3]:
            self.speed[1] = -self.init_speed

    # 碰壁反弹
    def crashWall(self):
        if  self.imageRect.left < 0 or  self.imageRect.right > width:    
            self.speed[0] =- self.speed[0]
        if  self.imageRect.top < 0 or  self.imageRect.bottom > height:
            self.speed[1] =- self.speed[1]

    # 移动
    def move(self):
        self.imageRect =  self.imageRect.move(self.speed[0],self.speed[1])      #正切矩形对象运动
        screen.blit(self.image, self.imageRect)          #将一个图像绘制在另一个图像上,使图片对象和正切矩形对象一起运动

# 碰撞检测
def crashMan():
    if((abs(theif.imageRect.left - police.imageRect.left) < theif.imageRect.right-theif.imageRect.left)
    and (abs(theif.imageRect.top - police.imageRect.top) < theif.imageRect.bottom-theif.imageRect.top)):
        gameOver()

# 游戏结束,停止运行
def gameOver():
    global start
    start = False
    
# 类的实例化,这次实例两个对象
theif = man(1,"thief.jpg",[10,10])
police = man(1.2,"police.jpg",[600,400])

while True:
    for event in pygame.event.get():     #退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN: #键盘事件
            theif.moveControl([pygame.K_LEFT,pygame.K_RIGHT,pygame.K_DOWN,pygame.K_UP])
            police.moveControl([pygame.K_a,pygame.K_d,pygame.K_s,pygame.K_w])

    if start:
        screen.fill(white)                   #每一帧结束后都把屏幕重新刷白
        theif.crashWall()
        theif.move()
        police.crashWall()
        police.move()
        crashMan()
        fclock.tick(fps)                     #设置fps
        pygame.display.update()              #刷新屏幕

技能你们自己加吧,发挥你们想象力吧,现在这篇项目已经很长了,我就不继续往下写了,先告辞了😎


文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录