项目一:到五秒就停下
一、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() # 刷新屏幕
六、游戏作弊
思考,如何让玩家一定失败,且不易被察觉。😈😈😈😈😈😈😈😈😈😈
七、打包程序
按win+R打开运行(只针对windows环境)
输入cmd打开命令行
输入pip install pyinstaller安装PyInstaller 模块(需联外网)
输入 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() #刷新屏幕
技能你们自己加吧,发挥你们想象力吧,现在这篇项目已经很长了,我就不继续往下写了,先告辞了😎