用Pycharm编写一款小游戏
一、概述
开发环境为:Pycharm2020版、用到了Python里面的Pygame包这个模块的相关功能、并且开发了一个较为简单的打飞机的小游戏界面,实现了游戏的可视化及不错的效果。
二、程序详细设计
通过百度下载了该游戏所需要的素材,包括自己的飞机、敌人的飞机、游戏的背景图片以及游戏中所需要的音效等。
代码展示:
import math #引用数学模块
import random
import pygame
#初始化
pygame.init()
screen=pygame.display.set_mode((1800,900))
pygame.display.set_caption('打飞机')
icon=pygame.image.load('飞机2.png')
pygame.display.set_icon(icon)
bgImg=pygame.image.load('背景3.jpeg')
#分数
score=0
font=pygame.font.Font('freesansbold.ttf',32)
#游戏结束
is_over=False
over_font=pygame.font.Font('freesansbold.ttf',80)
def check_is_over():
if is_over:
text="Game Over"
render = over_font.render(text, True,(255,0,0))
screen.blit(render, (650, 450))
def show_score():
text=f"Score:{score}"
score_render=font.render(text,True,(0,255,0))
screen.blit(score_render,(10,10))
#添加音效
pygame.mixer.music.load('bgm1.wav')
pygame.mixer.music.play(-1)
#添加射中音效
bao_sound=pygame.mixer.Sound('击中bgm1.mp3')
#飞机
playerImg=pygame.image.load('飞机2.png')
playX=300
playY=750
playStop=0
#敌人类
number_of_enemies=6
class Enemy():
def __init__(self):
self.img=pygame.image.load('敌人飞机.png')
self.x=random.randint(200,900)
self.y=random.randint(50,200)
self.step=random.randint(1,2)
def reset(self):
self.x=random.randint(200,900)
self.y=random.randint(50,200)
enemies=[] #保存所有的敌人
for i in range(number_of_enemies):
enemies.append(Enemy())
def distance(bx,by,ex,ey):
a=bx-ex
b=by-ey
return math.sqrt(a*a+b*b)
print(distance(1,1,4,5)) #开根号
#子弹类
class Bullet():
def __init__(self):
self.img=pygame.image.load('子弹4.png')
self.x=playX+39
self.y=playY+30
self.step=2
def hit(self):
global score
for e in enemies:
if(distance(self.x,self.y,e.x,e.y)<20):
bao_sound.play()
bullets.remove(self)
e.reset()
score+=1
print(score)
bullets=[] #保存现有的子弹
#显示子弹偏移
def show_bullets():
for b in bullets:
screen.blit(b.img,(b.x,b.y))
b.hit()
b.y-=b.step
if b.y<0:
#如果子弹出了界面,就移除
bullets.remove(b)
#显示敌人,并且实现敌人的移动和下沉
def show_enemy():
global is_over
for e in enemies:
screen.blit(e.img, (e.x, e.y))
e.x+= e.step
if (e.x > 1603 or e.x < 0):
e.step *= -1
e.y += 70 #飞机移动速度,需要更改
if e.y>735:
is_over=True
print("游戏结束!")
enemies.clear()
def move_player():
global playX
playX += playStop
# 防止飞机出界
if playX > 1681:
playX = 1681
if playX < 0:
playX = 0
#游戏主循环
while 1:
screen.blit(bgImg,(0,0))
show_score() #显示分数
for event in pygame.event.get():
if event.type==pygame.QUIT:
running=False
#键盘控制移动
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_RIGHT:
playStop=0.8
elif event.key==pygame.K_LEFT:
playStop=-0.8
elif event.key==pygame.K_SPACE:
print("发射子弹...")
# 创建一颗子弹
bullets.append(Bullet())
if event.type==pygame.KEYUP:
playStop=0
screen.blit(playerImg,(playX,playY))
move_player()#移动玩家
show_enemy()
show_bullets()
check_is_over()
pygame.display.update()
三、运行效果图
四、总结
通过此次动手设计小游戏,体会到了很多的快乐,尤其是游戏设计完成的那一刻,以及在游戏开发过程中解决问题所带来的愉悦感。在设计的过程中,也学到了很多的知识,例如如何设计颜色以及设计游戏的背景图和音效等等,而且在设计的过程中,代码都是从头到尾做到自己操作。