Python游戏开发


项目一:到五秒就停下

一、Pygame最小开发框架

import sys,pygame
 
pygame.init()                               # 初始化
screen=pygame.display.set_mode((600,400))   # 设置屏幕宽高
pygame.display.set_caption('游戏之旅')       # 设置标题名称
 
while True:
    # 事件队列
    for event in pygame.event.get():
        # 退出事件
        if event.type==pygame.QUIT:
            sys.exit()
    pygame.display.update()  # 刷新屏幕

二、绘制文字

先绘制“开始游戏”在屏幕上吧。

import sys,pygame
import pygame.freetype

# 定义颜色
black = 0, 0, 0
white = 255,255,255
red = 255, 45, 0
 
pygame.init()     # 初始化
screen=pygame.display.set_mode((600,400))   # 设置屏幕宽高
pygame.display.set_caption('游戏之旅')       # 设置标题名称

f1 = pygame.freetype.Font(r"C:\Windows\Fonts\msyh.ttc",100)  # 设置文字对象

while True:
    # 事件队列
    for event in pygame.event.get():
        # 退出事件
        if event.type==pygame.QUIT:
            sys.exit()

    screen.fill(white)       #整个屏幕填充白色
    f1rect = f1.render_to(screen,(100,300),"开始计时/停止计时",fgcolor=black,size=50)
    pygame.display.update()  # 刷新屏幕

三、显示计时

import sys,pygame,time
import pygame.freetype

# 定义颜色
black = 0, 0, 0
white = 255,255,255
red = 255, 45, 0
 
pygame.init()     # 初始化
screen=pygame.display.set_mode((600,400))   # 设置屏幕宽高
pygame.display.set_caption('游戏之旅')       # 设置标题名称

f1 = pygame.freetype.Font(r"C:\Windows\Fonts\msyh.ttc",100)  # 设置文字对象
count = 0  #计时的时间(s)

while True:
    # 事件队列
    for event in pygame.event.get():
        # 退出事件
        if event.type==pygame.QUIT:
            sys.exit()
    # 计时
    count += 0.1
    time.sleep(0.1)

    screen.fill(white)       #整个屏幕填充白色
    f1rect = f1.render_to(screen,(100,300),"开始计时/停止计时",fgcolor=black,size=50)
    #round()以四舍五入的方式保留几位小数
    f1rect = f1.render_to(screen,(100,200),str(round(count,1)),fgcolor=black,size=50) 
    pygame.display.update()  # 刷新屏幕

四、控制计时

import sys,pygame,time
import pygame.freetype

# 定义颜色
black = 0, 0, 0
white = 255,255,255
red = 255, 45, 0
 
pygame.init()     # 初始化
screen=pygame.display.set_mode((600,400))   # 设置屏幕宽高
pygame.display.set_caption('游戏之旅')       # 设置标题名称
f1 = pygame.freetype.Font(r"C:\Windows\Fonts\msyh.ttc",100)  # 设置文字对象

count = 0          #计时的时间(s)
start = False      # 开始计时控制

while True:
    # 事件队列
    for event in pygame.event.get():
        # 退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if f1rect.left<event.pos[0]<f1rect.right and f1rect.top<event.pos[1]<f1rect.bottom:
                if start == False: #如果此时没有开始计时,那么就开始计时
                    start = True
                    count = 0      #重新开始计时的时候把计时清零
                else:              #如果已经开始计时了,再按就停止
                    start = False

    #如果开始计时,那么每隔0.1s,计时+0.1
    if start == True:
        count += 0.1
        time.sleep(0.1)

    screen.fill(white)       #整个屏幕填充白色
    f1rect = f1.render_to(screen,(100,300),"开始计时/停止计时",fgcolor=black,size=50)
    #round()以四舍五入的方式保留几位小数
    CountRect=f1.render_to(screen,(200,100),"计时:"+str(round(count,1))+"s",fgcolor=black,size=50)
    pygame.display.update()  # 刷新屏幕

五、判断胜负

import sys,pygame,time
import pygame.freetype

# 定义颜色
black = 0, 0, 0
white = 255,255,255
red = 255, 45, 0
 
pygame.init()     # 初始化
screen=pygame.display.set_mode((600,400))   # 设置屏幕宽高
pygame.display.set_caption('游戏之旅')       # 设置标题名称
f1 = pygame.freetype.Font(r"C:\Windows\Fonts\msyh.ttc",100)  # 设置文字对象

count = 0          #计时的时间(s)
start = False      # 开始计时控制

while True:
    # 事件队列
    for event in pygame.event.get():
        # 退出事件
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if f1rect.left<event.pos[0]<f1rect.right and f1rect.top<event.pos[1]<f1rect.bottom:
                if start == False: #如果此时没有开始计时,那么就开始计时
                    start = True
                    count = 0      #重新开始计时的时候把计时清零
                else:              #如果已经开始计时了,再按就停止
                    start = False
    screen.fill(white)       #整个屏幕填充白色

    #如果开始计时,那么每隔0.1s,计时+0.1
    if start == True:
        count += 0.1
        time.sleep(0.1)

    #判断胜负,如果刚好5s的时候按下停止,游戏成功,否则失败
    if round(count,1) == 5.0 and start == False:  #由于是浮点数,判断时精确到一位小数
        f1win=f1.render_to(screen,(100,200),"恭喜你,游戏成功了!",fgcolor=red,size=50)  #输出提示的字样
    if round(count,1) != 5.0 and start == False and round(count,1) != 0.0:
        f1win=f1.render_to(screen,(100,200),"失败了,请继续努力",fgcolor=red,size=50)  #输出提示的字样

    # 绘制文字
    f1rect = f1.render_to(screen,(100,300),"开始计时/停止计时",fgcolor=black,size=50)
    #round()以四舍五入的方式保留几位小数
    CountRect=f1.render_to(screen,(200,100),"计时:"+str(round(count,1))+"s",fgcolor=black,size=50)
    pygame.display.update()  # 刷新屏幕

六、游戏作弊

思考,如何让玩家一定失败,且不易被察觉。😈😈😈😈😈😈😈😈😈😈

七、打包程序

  1. 按win+R打开运行(只针对windows环境)

  2. 输入cmd打开命令行

  3. 输入pip install pyinstaller安装PyInstaller 模块(需联外网)

  4. 输入 Pyinstaller -F 你要打包的程序的绝对路径

    注意中间有空格,-F就是只生产单个文件,别的指令就自己查文档吧

项目二:生死追逐

一、初始版本

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 许可协议。转载请注明来源 彭韦浩 !
  目录