少儿编程分享:手把手教你用Python编写战斗机游戏(一)
- 格式:pdf
- 大小:184.04 KB
- 文档页数:4
python实例:利⽤pygame实现⼩游戏“飞机⼤战”0、程序代码代码1:1import random2import pygame34# 屏幕⼤⼩的常量5 SCREEN_RECT = pygame.Rect(0, 0, 480, 700)6# 刷新的帧率7 FRAME_PER_SEC = 608# 创建敌机的定时器常量9 CREATE_ENEMY_EVENT = EREVENT10# 英雄发射⼦弹事件11 HERO_FIRE_EVENT = EREVENT+112#⼦弹速度13 BULLET_SPEED = -2.5141516class GameSprite(pygame.sprite.Sprite):17""""飞机⼤战游戏精灵"""1819def__init__(self, image_name, speed = 1):20# 调⽤⽗亲的初始化⽅法21 super().__init__()22# 定义对象的属性23 self.image = pygame.image.load(image_name)24 self.rect = self.image.get_rect()25 self.speed = speed2627def update(self):28#在屏幕的垂直⽅向上移动29 self.rect.y += self.speed303132class Background(GameSprite):33""""游戏背景精灵"""3435def__init__(self, is_alt = False):36# 1.调⽤⽗类构造⽅法37 super().__init__("./images/background.png")38# 2.判断是否与前图像循环重合,若否,则需重新设置初始位置39if is_alt:40 self.rect.y = -self.rect.height414243def update(self):44# 1.调⽤⽗类的⽅法,,,注意super后⾯要加括号!!!45 super().update()46# 2.判断是否移出屏幕47if self.rect.y >= SCREEN_RECT.height:48 self.rect.y = -self.rect.height495051class Enemy(GameSprite):52""""敌机精灵"""5354def__init__(self):55# 1.调⽤⽗类⽅法,创建敌机精灵56 super().__init__("./images/enemy1.png")57# 2. 指定敌机的初始随机速度 1-2-358 self.speed = random.randint(1,3)59# 3.指定敌机的初始随机位置60 self.rect.bottom = 06162 max_x = SCREEN_RECT.width - self.rect.width63 self.rect.x = random.randint(0, max_x)646566def update(self):6768# 1.调⽤⽗类⽅法,保持垂直⽅向的飞⾏69 super().update()70# 2.判断是否⾮出屏幕,如果是,需要从精灵组删除敌机71if self.rect.y >= SCREEN_RECT.height:72#print("飞出屏幕,需要从精灵组删除...")73# kill⽅法可以将精灵从精灵组中移除74 self.kill()7576def__del__(self):77#print("敌机挂了%s" %self.rect)78pass798081class Hero(GameSprite):82"""英雄精灵"""8384def__init__(self):85# 1.调⽤⽗类⽅法,设置image和speed86 super().__init__("./images/me1.png", speed = 0)87 self.speed1 = 088# 2.设置英雄的初始位置89 self.rect.centerx = SCREEN_RECT.centerx90 self.rect.bottom = SCREEN_RECT.bottom - 10091# 3.创建⼦弹精灵组92 self.bullets = pygame.sprite.Group()9394def update(self):95#(错误的判断句,会导致⼀旦出界就很难再恢复回来)if 0 <= self.rect.x <= SCREEN_RECT.width - self.rect.width: 96 self.rect.x += self.speed97if self.rect.x < 0:98 self.rect.x = 099elif self.rect.right > SCREEN_RECT.width:100 self.rect.right = SCREEN_RECT.width101102 self.rect.y += self.speed1103if self.rect.y < 0:104 self.rect.y = 0105elif self.rect.bottom > SCREEN_RECT.height:106 self.rect.bottom = SCREEN_RECT.height107108109def fire(self):110#print("发射⼦弹")111# 1.创建⼦弹精灵112 bullet = Bullet()113# 2.设置精灵位置114 bullet.rect.bottom = self.rect.y115 bullet.rect.centerx = self.rect.centerx116# 3.将精灵添加到精灵组117 self.bullets.add(bullet)118119120class Bullet(GameSprite):121""""⼦弹精灵"""122123def__init__(self):124# 调⽤⽗类⽅法125 super().__init__("./images/bullet1.png", BULLET_SPEED)126127def update(self):128 super().update()129if self.rect.bottom < 0:130 self.kill()131132def__del__(self):133#print("⼦弹被销毁")134passView Code代码2:1from plane_sprites import *2# 游戏主程序34class PlaneGame(object):5""""飞机⼤战主游戏"""67def__init__(self):8print("游戏初始化")910# 1.创建游戏的窗⼝11 self.screen = pygame.display.set_mode(SCREEN_RECT.size)12# 2.创建游戏的时钟13 self.clock = pygame.time.Clock()14# 3.调⽤私有⽅法,精灵和精灵组的创建15 self.__create_sprites()16# 4.设置定时器事件——创建敌机 1s17 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)18 pygame.time.set_timer(HERO_FIRE_EVENT, 300)1920def__create_sprites(self):21# 创建背景精灵和精灵组22 bg1 = Background()23 bg2 = Background(True)24 self.back_group = pygame.sprite.Group(bg1, bg2)25# 创建敌机精灵26 self.enemy_group = pygame.sprite.Group()27# 创建英雄精灵28 self.hero = Hero()29 self.hero_group = pygame.sprite.Group(self.hero)303132def start_game(self):33print("游戏开始...")3435while True:36# 1.设置刷新帧率37 self.clock.tick(FRAME_PER_SEC)38# 2.事件监听39 self.__event_handler()40# 3.碰撞检测41 self.__check_collide()42# 4.更新/绘制精灵组43 self.__update_sprites()44# 5.更新显⽰45 pygame.display.update()464748def__event_handler(self):49for event in pygame.event.get():50#判断是否退出游戏51if event.type == pygame.QUIT:52 PlaneGame.__game_over()53elif event.type == CREATE_ENEMY_EVENT:54#print("敌机出现。
python版飞机⼤战代码分享利⽤pygame实现了简易版飞机⼤战。
源代码如下:# -*- coding:utf-8 -*-import pygameimport sysfrom pygame.locals import *from pygame.font import *import timeimport randomclass Hero(object):#玩家英雄类def __init__(self, screen_temp):self.x = 210self.y = 700self.life = 21# self.life = 100self.image = pygame.image.load("./feiji/hero1.png")self.screen = screen_tempself.bullet_list = []#⽤来存储⼦弹对象的引⽤#爆炸效果⽤的如下属性self.hit = False #表⽰是否要爆炸self.bomb_list = [] #⽤来存储爆炸时需要的图⽚self.__create_images() #调⽤这个⽅法向bomb_list中添加图⽚self.image_num = 0 #⽤来记录while True的次数,当次数达到⼀定值时才显⽰⼀张爆炸的图,然后清空,,当这个次数再次达到时,再显⽰下⼀个爆炸效果的图⽚ self.image_index = 0#⽤来记录当前要显⽰的爆炸效果的图⽚的序号def __create_images(self):#添加爆炸图⽚self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n1.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n2.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n3.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n4.png"))def display(self):#显⽰玩家的飞机#如果被击中,就显⽰爆炸效果,否则显⽰普通的飞机效果if self.hit == True:self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))#(self.x, self.y)是指当前英雄的位置#blit⽅法(⼀个对象,左上⾓位置)self.image_num += 1print(self.image_num)if self.image_num == 7:self.image_num = 0self.image_index += 1print(self.image_index) #这⾥⼦弹打住英雄时没有被清除掉,所以打⼀下,就死了if self.image_index > 3:time.sleep(1)exit()#调⽤exit让游戏退出#self.image_index = 0else:if self.x< 0: #控制英雄,不让它跑出界⾯self.x = 0elif self.x > 382:self.x = 382if self.y < 0:self.y = 0elif self.y > 750:self.y = 750self.screen.blit(self.image,(self.x, self.y))#z这⾥是只要没有被打中,就⼀直是刚开始的样⼦#不管玩家飞机是否被击中,都要显⽰发射出去的⼦弹for bullet in self.bullet_list:bullet.display()bullet.move()def move(self, move_x,move_y):self.x += move_xself.y += move_ydef fire(self):#通过创建⼀个⼦弹对象,完成发射⼦弹bullet = Bullet(self.screen, self.x, self.y)#创建⼀个⼦弹对象self.bullet_list.append(bullet)def bomb(self):self.hit = Truedef judge(self):global lifeif life <= 0:self.bomb()class Bullet(object):#玩家⼦弹类def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 40self.y = y_temp - 20self.image = pygame.image.load("./feiji/bullet.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self):self.y -= 10class Bullet_Enemy(object):#敌机⼦弹类def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 25self.y = y_temp + 30self.image = pygame.image.load("./feiji/bullet1.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image,(self.x,self.y))def move(self, hero):self.y += 10global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 10#self.bullet_list.remove()print("---judge_enemy---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss(object):#boss⼦弹类1def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6self.x += 2global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss1(object):#boss⼦弹类2def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6self.x -= 2global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss2(object):#boss⼦弹类3def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Base(object):#基类类似于抽象类def __init__(self, screen_temp, x, y, image_name):self.x = xself.y = yself.screen = screen_tempself.image = pygame.image.load(image_name)self.alive = Truedef display(self):if self.alive == True:self.screen.blit(self.image, (self.x, self.y))def move(self):self.y += 5class bomb_bullet(Base):#炸弹类def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb.png")def judge(self, hero):if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falsehero.bomb()if self.y >= 850:#self.alive = Falseself.y = 0self.x = random.randint(45, 400)#print("bomb.y = %d"%self.y)class supply(Base):#补给类def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), -300, "./feiji/bomb-1.gif")def judge(self, hero):global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falselife += 10if self.y >= 1500:self.y = 0self.x = random.randint(45, 400)self.alive = Trueclass clear_bullet(Base):def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb-2.gif")self.alive = Falsedef judge(self, hero, enemies):global qq += 1#self.move()if q == 20:#self.move()self.alive = Trueq = 0if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falsefor enemy in enemies:enemy.hit == Trueclass EnemyPlane(object):#敌机类def __init__(self, screen_temp):self.x = random.randint(15, 480)self.y = 0self.image = pygame.image.load("./feiji/enemy0.png")self.screen = screen_tempself.bullet_list = []#⽤来存储⼦弹对象的引⽤#self.direction = "right"#⽤来设置这个飞机默认的移动⽅向self.hit = Falseself.bomb_list = []self.__create_images()self.image_num = 0self.image_index = 0#利⽤产⽣的随机数,随机确定飞机初始移动⽅向self.k = random.randint(1, 20)if self.k <= 10:self.direction = "right"elif self.k > 10:self.direction = "left"def display(self, hero):#显⽰敌⼈的飞机if not self.hit:self.screen.blit(self.image, (self.x,self.y))else:self.screen.blit(self.bomb_list[self.image_index], (self.x,self.y))self.image_num += 1if self.image_num == 3 and self.image_index < 3:self.image_num = 0self.image_index += 1#print(self.image_index)# if self.image_index > 2:# time.sleep(0.1)for bullet in self.bullet_list:bullet.display()if(bullet.move(hero)):self.bullet_list.remove(bullet)def move(self):#利⽤随机数来控制飞机移动距离,以及移动范围d1 = random.uniform(1,3)d2 = random.uniform(0.2,3)p1 = random.uniform(50,100)p2 = random.uniform(-200,0)if self.direction == "right":self.x += d1elif self.direction == "left":self.x -= d1if self.x > 480 - p1:#480 - 50self.direction="left"elif self.x < p2:self.direction = "right"self.y += d2def bomb(self):self.hit = Truedef __create_images(self):self.bomb_list.append(pygame.image.load("./feiji/enemy0_down1.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down2.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down3.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down4.png")) def fire(self):#利⽤随机数来控制敌机的开⽕,1/80的概率s = random.randint(0,800)bullet1 = Bullet_Enemy(self.screen, self.x, self.y)if s < 10:self.bullet_list.append(bullet1)class EnemyPlanes(EnemyPlane):#敌机群类继承⾃EnemyPlane类def __init__(self, screen_temp):EnemyPlane.__init__(self, screen_temp)self.num = 0self.enemy_list = [] #⽤列表存储产⽣的多架敌机self.screen = screen_tempdef add_enemy(self, num):#产⽣多架敌机的函数self.num = numfor i in range(num):enemy = EnemyPlane(self.screen)self.enemy_list.append(enemy)def display(self, hero):for i in range(self.num):self.enemy_list[i].display(hero)def move(self):for i in range(self.num):self.enemy_list[i].move()def fire(self):#s = random.randint(0,1000)for i in range(self.num):self.enemy_list[i].fire()class Boss(EnemyPlane):#boss敌机类继承⾃EnemyPlane类def __init__(self,screen_temp):EnemyPlane.__init__(self,screen_temp)self.x = 150self.y = 0self.bomb_list = []self.__create_images()self.image = pygame.image.load("./feiji/enemy2.png")self.screen = screen_tempself.bullet_list = []def __create_images(self):#self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down1.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down3.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down4.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down5.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down6.png"))def display(self, hero):#显⽰敌⼈的飞机global g#print(g)self.screen.blit(self.bomb_list[g], (self.x,self.y))for bullet in self.bullet_list:bullet.display()if(bullet.move(hero)):self.bullet_list.remove(bullet)def move(self):d1 = 0self.y += 0def fire(self):global ss += 1bullet1 = Bullet_Boss(self.screen, self.x, self.y)bullet2 = Bullet_Boss1(self.screen, self.x, self.y)bullet3 = Bullet_Boss2(self.screen, self.x, self.y)if s == 20:s = 0self.bullet_list.append(bullet1)self.bullet_list.append(bullet2)self.bullet_list.append(bullet3)def judge1(hero,enemy):#判断敌机的炸毁for bullet1 in hero.bullet_list:if bullet1.y in range(int(enemy.y),int(enemy.y + 30)) and bullet1.x in range(int(enemy.x-10),int(enemy.x + 50)): hero.bullet_list.remove(bullet1)enemy.bomb()if bullet1.y < 0 or bullet1.x < 0 or bullet1.x > 480: #删除越界的玩家⼦弹hero.bullet_list.remove(bullet1)def judge3(hero,boss):#判断boss的炸毁global goal, g, goal0for bullet3 in hero.bullet_list:if bullet3.y in range(int(boss.y), int(boss.y + 60)) and bullet3.x in range(int(boss.x), int(boss.x + 100)):hero.bullet_list.remove(bullet3)g += 1boss.image = boss.bomb_list[g]print("g = %d"%g)if g >= 6:boss.y, g, goal = 0, 0, 0boss.bomb()goal0 += 10def clear_enemy(enemies):#清除敌机群类中被炸毁的敌机global goal, goal0for enemy in enemies.enemy_list:if enemy.hit == True and enemy.image_index == 3:enemies.enemy_list.remove(enemy)enemies.num -= 1goal += 1goal0 += 5print("goal = %d"%goal)if enemy.y >= 850:enemies.enemy_list.remove(enemy)enemies.num -= 1def judge_num(enemies):#判断频幕上敌⼈的数量,如果为零,继续添加敌⼈n = random.randint(1,5)if len(enemies.enemy_list) == 0:enemies.add_enemy(n)def show_text(screen_temp):#在屏幕上显⽰⽂字text = "GOAL:" + str(goal0) + "Life:" + str(life)font_size = 50pos = (0,0)color = (0,255,0)cur_font = pygame.font.SysFont("宋体",font_size)text_fmt = cur_font.render(text, 1, color)screen_temp.blit(text_fmt, pos)def creat_bomb(screen_temp):bomb = bomb_bullet(screen_temp)bomb_list = []bomb_list.apend(bomb)#定义的全局变量goal = 0 #玩家得分goal0 = 0g = 0 #击中boss的次数life = 100#⽣命值s = 0 #判断⼤boss是否发射⼦弹q = 0def main():#主函数执⾏#获取事件,⽐如按键等bb = Falsemove_x = 0move_y = 0pygame.init()screen = pygame.display.set_mode((480,852),0,32)# 210,400background = pygame.image.load("./feiji/background.png") pygame.display.set_caption("飞机⼤战")atlas = pygame.image.load("./feiji/New Atlas.png")#创建玩家飞机hero = Hero(screen)#创建敌机群enemis = EnemyPlanes(screen)enemis.add_enemy(5)#创建boss对象boss = Boss(screen)#创建炸弹对象bomb = bomb_bullet(screen)#创建补给对象supply0 = supply(screen)clear = clear_bullet(screen)left_key, right_key, up_key, down_key, done = 0, 0, 0, 0, 0 # mark = 0#⽤来判断boss发射⼦弹while True:if done:if done % 8 == 0:done = 1hero.fire()else:done += 1for event in pygame.event.get():#判断是否是点击了退出按钮if event.type == QUIT:print("exit")exit()#判断是否是按下了键if event.type == KEYDOWN :#down#检测按键是否是a或者leftif event.key == K_a or event.key == K_LEFT:#print('left')move_x = -5left_key += 1#检测按键是否是d或者rightelif event.key == K_d or event.key == K_RIGHT:#print('right')elif event.key == K_w or event.key == K_UP:move_y = -5up_key += 1elif event.key == K_s or event.key == K_DOWN: move_y = 5down_key += 1#检测按键是否是空格键elif event.key == K_SPACE:#print('space')hero.fire()done = 1#enemis.fire()elif event.key == K_b:print('b')hero.bomb()if event.type == KEYUP:if event.key == K_a or event.key == K_LEFT: left_key -= 1if right_key == 0:move_x = 0else:move_x = 5if event.key == K_d or event.key == K_RIGHT: right_key -= 1if left_key == 0:move_x = 0else:move_x = -5if event.key == K_w or event.key == K_UP:up_key -= 1if down_key == 0:move_y = 0else:move_y = 5if event.key == K_s or event.key == K_DOWN: down_key -= 1if up_key == 0:move_y = 0else:move_y = -5if event.key == K_SPACE:done = 0screen.blit(background, (0, 0))hero.move(move_x, move_y)hero.display()hero.judge()enemis.display(hero)enemis.move()enemis.fire()bomb.display()bomb.judge(hero)bomb.move()supply0.display()supply0.judge(hero)supply0.move()#clear.display()#clear.judge(hero, enemis)#clear.move()for i in range(enemis.num):judge1(hero, enemis.enemy_list[i])#enemis.enemy_list[i].judge(hero)clear_enemy(enemis)judge_num(enemis)show_text(screen)boss.move()# mark+=1# if mark==8:boss.fire()# mark = 0#boss.judgejudge3(hero, boss)pygame.display.update()if __name__ == "__main__":main()⽅法是利⽤⾯向对象的思想,写了基本的敌机类、英雄类、武器类等,利⽤继承关系产⽣多架敌机。
【python】10分钟教你⽤Python做个打飞机⼩游戏超详细教程整体框架开始之前-精灵类Sprite⼦弹类class Bullet玩家飞机类class Player敌机类class Enemy游戏主体循环以及帧率设置让⼦弹飞刷出敌机 打怪把飞机敌机⼦弹都画出来处理键盘事件分数显⽰ 和 GameOver最终代码这次还是⽤python的pygame库来做的游戏。
关于这个库的内容,读者可以上⽹了解⼀下。
本⽂只讲解⽤到的知识。
代码参考⾃⽹上,⾃⼰也做了⼀点代码简化。
尽量把最核⼼的⽅⾯⽤最简单的⽅式呈现给⼤家,让⼤家尽快掌握这个游戏的框架。
⾄于那些华丽的功能,⼤家在弄懂了核⼼知识以后,再去添加也是⾮常easy的。
这个游戏设计⽤到了⾯向对象的编程思想。
游戏主体划分为三个主要的类:⼦弹类class Bullet玩家类class Player敌机类class Enemy在屏幕上可见的也就是这三个东西了。
⾃⼰的飞机、敌⼈的飞机、⼦弹。
因此整个游戏的核⼼就是:把这三个东西的图像呈现在屏幕上。
判断和处理⼦弹撞击敌机和敌机撞击玩家这两种情况。
下⾯我们会展开为⼤家⼀⼀讲解。
在下⾯的代码中,你们会⼤量见到这个pygame.sprite模块。
这⾥就给⼤家介绍⼀下。
“sprite”,中⽂翻译“精灵”,在游戏动画⼀般是指⼀个独⽴运动的画⾯元素,在pygame中,就可以是⼀个带有图像(Surface)和⼤⼩位置(Rect)的对象。
简单来说是⼀个会动图⽚。
它的两个成员变量self.image=要显⽰图⽚的Surfaceself.rect = 显⽰Surface的区域对于self.rect,常⽤的设置rect的⽅法:self.rect = self.image.get_rect()。
然后设定self.rect.topleft=(0,0)来设定左上⾓的位置,从⽽设定这个精灵在屏幕上的显⽰位置。
精灵特别适合⽤在OO语⾔中,⽐如Python。
python实现飞机⼤战游戏飞机⼤战(Python)代码分为两个python⽂件,⼯具类和主类,需要安装pygame模块,能完美运⾏(⽹上好多不完整的,调试得⼼累。
实现出来,成就感还是满满的),如图所⽰:完整代码如下:1.⼯具类plane_sprites.pyimport randomimport pygame# 屏幕⼤⼩的常量SCREEN_RECT = pygame.Rect(0, 0, 480, 700)# 刷新的帧率FRAME_PER_SEC = 60# 创建敌机的定时器常量CREATE_ENEMY_EVENT = EREVENT# 英雄发射⼦弹事件HERO_FIRE_EVENT = EREVENT + 1class GameSprite(pygame.sprite.Sprite):"""飞机⼤战游戏精灵"""def __init__(self, image_name, speed=1):super().__init__()# 调⽤⽗类的初始化⽅法self.image = pygame.image.load(image_name)# 定义对象的属性self.rect = self.image.get_rect()self.speed = speeddef update(self):# 在屏幕的垂直⽅向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def __init__(self, is_alt=False):super().__init__("C:/Users/Administrator/Desktop/background.png")# 1. 调⽤⽗类⽅法实现精灵的创建(image/rect/speed) if is_alt:# 2. 判断是否是交替图像,如果是,需要设置初始位置self.rect.y = -self.rect.heightdef update(self):super().update()# 1. 调⽤⽗类的⽅法实现if self.rect.y >= SCREEN_RECT.height:# 2. 判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上⽅self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敌机精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/enemy1.png")# 1. 调⽤⽗类⽅法,创建敌机精灵,同时指定敌机图⽚ self.speed = random.randint(1, 3)# 2. 指定敌机的初始随机速度 1 ~ 3self.rect.bottom = 0# 3. 指定敌机的初始随机位置max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self):super().update()# 1. 调⽤⽗类⽅法,保持垂直⽅向的飞⾏# 2. 判断是否飞出屏幕,如果是,需要从精灵组删除敌机if self.rect.y >= SCREEN_RECT.height:self.kill()# print("飞出屏幕,需要从精灵组删除...")# kill⽅法可以将精灵从所有精灵组中移出,精灵就会被⾃动销毁def __del__(self):# print("敌机挂了 %s" % self.rect)passclass Hero(GameSprite):"""英雄精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/me1.png", 0)self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120self.bullets = pygame.sprite.Group()def update(self):self.rect.x += self.speedif self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("发射⼦弹...")for i in (0, 1, 2):bullet = Bullet()bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerxself.bullets.add(bullet)class Bullet(GameSprite):"""⼦弹精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/bullet1.png", -2)def update(self):super().update()if self.rect.bottom < 0:self.kill()def __del__(self):print("⼦弹被销毁...")2.主类plane_main.pyimport pygamefrom plane_sprites import *class PlaneGame(object):"""飞机⼤战主游戏"""def __init__(self):print("游戏初始化")self.screen = pygame.display.set_mode(SCREEN_RECT.size)self.clock = pygame.time.Clock()self.__create_sprites()pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)def __create_sprites(self):bg1 = Background()bg2 = Background(True)self.back_group = pygame.sprite.Group(bg1, bg2)self.enemy_group = pygame.sprite.Group()self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("游戏开始...")while True:self.clock.tick(FRAME_PER_SEC)self.__event_handler()self.__check_collide()self.__update_sprites()pygame.display.update()def __event_handler(self):for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:# print("敌机出场...")# 创建敌机精灵enemy = Enemy()self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:# print("向右移动...")keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:enemy = Enemy()self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)if len(enemies) > 0:self.hero.kill()PlaneGame.__game_over()def __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)self.hero.bullets.update()self.hero.bullets.draw(self.screen)@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':game = PlaneGame()game.start_game()更多关于python游戏的精彩⽂章请点击查看以下专题:更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
python打飞机代码Python打飞机游戏开发:从零开始,一步一步教你制作一个简单的飞机射击游戏摘要:本文将以Python编程语言为基础,一步一步教你如何制作一个简单的飞机射击游戏。
我们将使用Pygame库来实现游戏的图形界面和交互功能,通过编写游戏的关键代码,如飞机的移动、敌机的生成和碰撞检测等,最终实现一个完整的飞机射击游戏。
第一步:准备工作在开始编写代码之前,我们需要先安装Pygame库。
在命令行中输入以下命令:pip install pygamePygame是专门用于游戏开发的Python库,它提供了丰富的函数和方法,方便我们进行游戏开发。
第二步:创建游戏窗口在创建游戏窗口之前,我们需要先导入Pygame库,并初始化它。
在代码的开头添加以下代码:pythonimport pygame# 初始化Pygame库pygame.init()# 设置游戏窗口大小screen_width = 480screen_height = 600screen = pygame.display.set_mode((screen_width, screen_height)) 第三步:加载游戏图片和音效在游戏中,我们需要使用一些图片和音效来呈现游戏的效果。
在创建游戏窗口的代码后面,我们可以添加以下代码来加载游戏需要的资源:python# 加载背景图片background = pygame.image.load("background.png")# 加载飞机图片player = pygame.image.load("player.png")# 加载敌机图片enemy = pygame.image.load("enemy.png")# 加载爆炸图片和音效explosion_img = pygame.image.load("explosion.png") explosion_sound = pygame.mixer.Sound("explosion.wav")第四步:绘制游戏界面我们使用一个循环来更新游戏界面,并获取玩家的输入。
python打飞机代码飞机游戏一直以来都是人们喜欢的一种小型休闲游戏。
通过控制飞机的移动和开火,玩家可以享受到刺激和乐趣。
在这篇文章中,我将为你介绍如何使用Python编写一个简单的打飞机游戏。
首先,我们需要安装Pygame库。
Pygame是一个专门用于开发游戏的Python 库,提供了许多有用的功能。
你可以使用以下命令来安装Pygame:```pip install pygame```安装完成后,我们可以开始编写游戏代码了。
让我们首先导入所需的库:```pythonimport pygameimport randomimport time```接下来,我们需要初始化Pygame并创建游戏窗口:```pythonpygame.init()width = 800height = 600screen = pygame.display.set_mode((width, height))pygame.display.set_caption("打飞机游戏")```在游戏窗口中,我们可以使用pygame.draw模块绘制游戏元素,比如敌机、子弹和玩家飞机:```pythonplayer_image = pygame.image.load("player.png")player_rect = player_image.get_rect()player_rect.centerx = width // 2player_rect.bottom = height - 10bullet_image = pygame.image.load("bullet.png")bullet_rect = bullet_image.get_rect()enemy_image = pygame.image.load("enemy.png")enemy_rect = enemy_image.get_rect()enemy_rect.centerx = random.randint(0, width)enemy_rect.top = 0```在游戏中,我们需要不断地获取用户输入来控制飞机的移动和开火。
python实现飞机⼤战游戏(pygame版)简介使⽤python实现pygame版的飞机⼤战游戏;环境:Windows系统+python3.8.0游戏规则:1.点击“PLAY”或者按键“P”开始游戏;2.敌机根据设置频率从顶部随机位置⽣成,⽣成后向下移动;3.飞船在底部中间⽣成,玩家使⽤上下左右键控制飞船移动,敲击空格键发射⼦弹;4.⼦弹打到敌机,该敌机产⽣爆炸效果并累计分数到右上⾓;5.消灭10只飞机后,等级升⾼,敌机⽣成频率变快,下落速度也变快;6.当三条命都消失了,游戏结束。
游戏运⾏效果如下:实现过程1.新建⽂件“file.py”,⽤来存储信息到⽂件和读取⽂件的信息,本例⽤来存储和读取最⾼分;import pickle# filename = 'file/stats.pkl'# 存储信息到⽂件def save_file(obj, filename):statsObj = load_file(filename)if statsObj == 0:# 不存在⽂件时,直接保存字典with open(filename, 'wb') as f:pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)else:# 存在⽂件时,只修改⽂件中的最⾼分for key, val in statsObj.items():# 获取⽂件最⾼分的值(当⽂件字段不⽌⼀个时候使⽤)if key == 'highScore':statsObj[key] = obj['highScore']obj = statsObjwith open(filename, 'wb') as f:pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)# 读取信息def load_file(filename):try:with open(filename, 'rb') as f:return pickle.load(f)except FileNotFoundError:# 不存在⽂件则输⼊错误信息msg = "Sorry, the file " + filename + " does not exist."print(msg)return 0# obj = {'highScore': 20, 'points': 5}# obj = {'highScore': 50}# save_file(obj, filename)# filedata = load_file(filename)# print(filedata)2.k新建⽂件settings.py,⽤来定义⼀些必须的基本属性和初始值;import file as fclass Settings():def __init__(self):self.screen_width = 480self.screen_height = 660self.bg_color = (230, 230, 230)# ⼦弹设置(宽、⾼、颜⾊、最⼤数量)self.bullet_width = 5self.bullet_height = 15self.bullet_color = 255, 255, 255# 敌机移动频率self.enemy_frequency = 0# 加快游戏节奏的速度self.speedup_scale = 1.1# 分数的提⾼速度self.score_scale = 1.5self.initialize_settings()# 初始化统计信息self.reset_stats()# 统计信息⽂件路径self.filename = 'file/stats.pkl'# 游戏刚启动时处于⾮活动状态self.game_active = False# 读取⽂件的最⾼分,在任何情况下都不应重置最⾼得分statsObj = f.load_file(self.filename)if statsObj == 0:# 不存在⽂件则显⽰最⾼分0highScore = 0else:for key, val in statsObj.items():# 获取⽂件最⾼分的值(当⽂件字段不⽌⼀个时候使⽤)if key == 'highScore':highScore = valself.high_score = highScoredef initialize_settings(self):"""初始化随游戏进⾏⽽变化的设置"""self.player_move_speed = 2.5self.bullet_speed = 3self.enemy_move_speed = 1# 记分self.one_points = 50def increase_speed(self):"""提⾼速度设置"""# self.player_move_speed *= self.speedup_scaleself.bullet_speed *= self.speedup_scaleself.enemy_move_speed *= self.speedup_scaleself.one_points = int(self.one_points * self.score_scale)def reset_stats(self):"""初始化在游戏运⾏期间可能变化的统计信息"""# 可射失的数量self.player_limit = 3# 射击分数self.score = 0# 等级self.level = 1# 打中多少矩形升⼀级self.level_number = 10# ⽣成敌机频率间隔self.enemy_frequency_space = 503.新建⽂件enemy.py,⽤来定义敌机类(位置topleft随机⽣成)和声明⽅法move;import pygameimport randomfrom pygame.sprite import Spriteclass Enemy(Sprite):def __init__(self, enemy_down_imgs, settings):super(Enemy, self).__init__()self.image = pygame.image.load('images/enemy1.png')self.rect = self.image.get_rect()self.rect.topleft = [random.randint(0, settings.screen_width - self.rect.width), 0]self.down_imgs = enemy_down_imgsself.speed = settings.enemy_move_speedself.down_index = 0# 敌机移动,边界判断及删除在游戏主循环⾥处理def move(self):self.rect.top += self.speed4.新建⽂件player.py,⽤来定义玩家类(可上下左右移动)和相应的⽅法;import pygamefrom pygame.sprite import Spriteclass Player(Sprite):def __init__(self, settings, screen):super(Player, self).__init__()self.settings = settingsself.screen = screenself.screen_rect = self.screen.get_rect()# 引⼊飞船图⽚并定位self.image = pygame.image.load('images/player.png')self.rect = self.image.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 移动标志self.move_left = Falseself.move_right = Falseself.move_down = Falseself.move_up = Falsedef rotate(self, angle):# 图⽚旋转self.image = pygame.transform.rotate(self.image, angle)def scale(self, multiple):# 图⽚缩放self.image = pygame.transform.smoothscale(self.image, (multiple, multiple))def update(self):if self.move_left and self.rect.left > self.screen_rect.left:self.rect.centerx -= self.settings.player_move_speedif self.move_right and self.rect.right < self.screen_rect.right:self.rect.centerx += self.settings.player_move_speedif self.move_down and self.rect.bottom < self.screen_rect.bottom:self.rect.centery += self.settings.player_move_speedif self.move_up and self.rect.top > 0:self.rect.centery -= self.settings.player_move_speeddef draw_player(self):"""绘制飞船到屏幕"""self.screen.blit(self.image, self.rect)5.新建⽂件“bullet.py”,⽤来定义⼦弹类(位置在飞船的顶部,并往上移动)和相应的⽅法;import pygamefrom pygame.sprite import Spriteclass Bullet(Sprite):""" ⼀个对飞船发射的⼦弹进⾏管理的类 """def __init__(self, settings, screen, player):""" 在飞船所处的位置创建⼀个⼦弹对象 """super(Bullet, self).__init__()self.screen = screen# 在 (0,0) 处创建⼀个表⽰⼦弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, settings.bullet_width, settings.bullet_height)self.rect.centerx = player.rect.centerx# 飞船顶部self.rect.bottom = player.rect.top# 存储⽤⼩数表⽰的⼦弹位置self.y = float(self.rect.y)self.color = settings.bullet_colorself.speed = settings.bullet_speeddef update(self):"""向上移动⼦弹"""# 更新表⽰⼦弹位置的⼩数值(⼦弹往右)self.y -= self.speed# 更新表⽰⼦弹的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制⼦弹"""pygame.draw.rect(self.screen, self.color, self.rect)6.新建⽂件“button.py”,⽤来定义按钮类和相应⽅法,本例使⽤于绘制“PLAY”按钮;import pygame.fontclass Button():def __init__(self, screen, msg):"""初始化按钮的属性"""self.screen = screenself.screen_rect = screen.get_rect()# 设置按钮的尺⼨和其他属性self.width, self.height = 100, 30self.button_color = (216, 30, 6)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 36)# 创建按钮的rect对象,并使其居中self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.center# 按钮的标签只需创建⼀次self.prep_msg(msg)def prep_msg(self, msg):"""将msg渲染为图像,并使其在按钮上居中"""self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):# 绘制⼀个⽤颜⾊填充的按钮,再绘制⽂本self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)7.新建⽂件“scoreboard.py”,⽤来定义记分板,本例使⽤于绘制左上⾓飞船(⽣命数)、顶部中间的“最⾼分”、右上⾓的“积分”和“等级”;import pygame.fontfrom pygame.sprite import Groupfrom player import Playerclass Scoreboard():"""显⽰得分信息的类"""def __init__(self, settings, screen):"""初始化显⽰得分涉及的属性"""self.screen = screenself.screen_rect = screen.get_rect()self.settings = settings# 显⽰得分信息时使⽤的字体设置self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 30)# 飞船缩放值self.scaleValue = 20# 准备初始得分图像\最⾼得分\等级self.prep_score()self.prep_high_score()self.prep_level()self.prep_players()def prep_score(self):"""将得分转换为渲染的图像"""rounded_score = int(round(self.settings.score, -1))score_str = '{:,}'.format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color)# 将得分放在屏幕右上⾓self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right -20self.score_rect.top = 10def prep_high_score(self):""" 将最⾼得分转换为渲染的图像 """high_score = int(round(self.settings.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True, self.text_color)# 将最⾼得分放在屏幕顶部中央self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef prep_level(self):"""将等级转换为渲染的图像"""self.level_image = self.font.render(str(self.settings.level), True, self.text_color)# 将等级放在得分下⽅self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom + 10def prep_players(self):""" 显⽰还余下多少艘飞船 """self.players = Group()for player_number in range(self.settings.player_limit):player = Player(self.settings, self.screen)# 缩放球⼤⼩并赋值位置player.scale(self.scaleValue)player.rect.x = 10 + player.rect.width * player_number * 0.5player.rect.y = self.score_rect.topself.players.add(player)def show_score(self):"""在屏幕上显⽰得分"""self.screen.blit(self.score_image, self.score_rect)self.screen.blit(self.high_score_image, self.high_score_rect)self.screen.blit(self.level_image, self.level_rect)# 绘制飞船self.players.draw(self.screen)8.新建⽂件“game_functions.py”,存放跟游戏有关的所有业务逻辑函数(代码有详细的注释信息);import sysimport pygamefrom bullet import Bulletfrom enemy import Enemyimport file as f# 事件def check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound):""" 响应按键和⿏标事件 """for event in pygame.event.get():if event.type == pygame.QUIT:save_file(settings)sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound)elif event.type == pygame.KEYUP:check_keyup_events(event, player)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y)def check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound):""" 响应按键 """if event.key == pygame.K_DOWN:player.move_down = Trueelif event.key == pygame.K_UP:player.move_up = Trueelif event.key == pygame.K_LEFT:player.move_left = Trueelif event.key == pygame.K_RIGHT:player.move_right = Trueelif event.key == pygame.K_SPACE:fireSound.play()# 点击空格键创建⼀颗⼦弹fire_bullet(settings, screen, player, bullets)elif event.key == pygame.K_p:start_game(settings, scoreboard)elif event.key == pygame.K_q:save_file(settings)sys.exit()def check_keyup_events(event, player):""" 响应松开 """if event.key == pygame.K_DOWN:player.move_down = Falseelif event.key == pygame.K_UP:player.move_up = Falseelif event.key == pygame.K_LEFT:player.move_left = Falseelif event.key == pygame.K_RIGHT:player.move_right = Falsedef check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y):"""在玩家单击Play按钮时开始新游戏"""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not settings.game_active:start_game(settings, scoreboard)def start_game(settings, scoreboard):"""开始游戏"""# 重置游戏设置settings.initialize_settings()# 隐藏光标pygame.mouse.set_visible(False)# 重置游戏统计信息settings.reset_stats()settings.game_active = True# 重置记分牌图像scoreboard.prep_score()scoreboard.prep_high_score()scoreboard.prep_level()scoreboard.prep_players()def save_file(settings):# 保持⽂件obj = {'highScore': settings.high_score}f.save_file(obj, settings.filename)# 敌机def update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound): # ⽣成敌机,需要控制⽣成频率if settings.enemy_frequency % settings.enemy_frequency_space == 0:enemy1 = Enemy(enemy_down_imgs, settings)enemies.add(enemy1)settings.enemy_frequency += 1if settings.enemy_frequency >= 100:settings.enemy_frequency = 0for enemy in enemies:# 移动敌机enemy.move()# 敌机与玩家飞机碰撞效果处理两个精灵之间的圆检测if pygame.sprite.collide_circle(enemy, player):enemies_down.add(enemy)enemies.remove(enemy)settings.player_limit -= 1scoreboard.prep_players()break# 移动出屏幕后删除飞机if enemy.rect.top < 0:enemies.remove(enemy)# 敌机被⼦弹击中效果处理# 将被击中的敌机对象添加到击毁敌机 Group 中,⽤来渲染击毁动画# ⽅法groupcollide()是检测两个精灵组中精灵们的矩形冲突enemies1_down = pygame.sprite.groupcollide(enemies, bullets, True, True)if enemies1_down:explosiveSound.play()# 计算分数并渲染for enemys in enemies1_down.values():settings.score += settings.one_points * len(enemys)scoreboard.prep_score()# 渲染最⾼分check_high_score(settings, scoreboard)# 等达到等级数量升级并渲染新等级settings.level_number -= 1if settings.level_number == 0:settings.increase_speed()settings.level += 1scoreboard.prep_level()# 还原为4(同settings⼀致)settings.level_number = 10# 加快⽣成敌机if settings.enemy_frequency_space > 10:settings.enemy_frequency_space -= 10# 遍历key值返回的碰撞敌机for enemy_down in enemies1_down:# 点击销毁的敌机到列表enemies_down.add(enemy_down)# 敌机被⼦弹击中效果显⽰for enemy_down in enemies_down:if enemy_down.down_index == 0:passif enemy_down.down_index > 7:enemies_down.remove(enemy_down)continue#显⽰碰撞图⽚screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect) enemy_down.down_index += 1# 显⽰精灵enemies.draw(screen)# ⼦弹def fire_bullet(settings, screen, player, bullets):"""创建⼦弹"""new_bullet = Bullet(settings, screen, player)bullets.add(new_bullet)def update_bullets(screen, bullets):"""更新⼦弹的位置,并删除已消失的⼦弹"""# 更新⼦弹的位置bullets.update()# 删除已消失的⼦弹并同时更新飞船的⽣命for bullet in bullets.copy():if bullet.rect.top < screen.get_rect().top:bullets.remove(bullet)# 分数def check_high_score(settings, scoreboard):"""检查是否诞⽣了新的最⾼得分"""if settings.score > settings.high_score:settings.high_score = settings.scorescoreboard.prep_high_score()# 屏幕def update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets): """ 更新屏幕上的图像,并切换到新屏幕 """# 绘制飞船到屏幕player.draw_player()# 绘制⼦弹到屏幕for bullet in bullets.sprites():bullet.draw_bullet()# 渲染记分牌信息scoreboard.show_score()#if settings.player_limit == 0:settings.game_active = Falsesettings.reset_stats()# 清空矩形列表和⼦弹列表enemies.empty()bullets.empty()screen_rect = screen.get_rect()player.rect.centerx = screen_rect.centerxplayer.rect.bottom = screen_rect.bottom# 如果游戏处于⾮活动状态,就绘制 Play 按钮if not settings.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()9.新建⽂件shootingenemy.py,主函数⽤来初始化程序,并同步更新程序的信息;import pygamefrom pygame.sprite import Groupfrom settings import Settingsfrom button import Buttonfrom player import Playerimport game_functions as gffrom scoreboard import Scoreboarddef run_game():pygame.init()# 初始化全部⾳频,并加载爆炸声⾳乐pygame.mixer.init()# 等待1spygame.time.delay(1000)pygame.mixer.music.load('file/bgsound.mp3')# -1代表⽆限循环(背景⾳乐)pygame.mixer.music.play(-1)# 爆炸声explosiveSound = pygame.mixer.Sound('file/explosiveSound.wav')# 枪声fireSound = pygame.mixer.Sound('file/fireSound.wav')# 游戏循环帧率设置clock = pygame.time.Clock()settings = Settings()screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))# 全屏显⽰# screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)pygame.display.set_caption('飞机⼤战')# 左上⾓图标ic_launcher = pygame.image.load('images/ic_launcher.png').convert_alpha()pygame.display.set_icon(ic_launcher)# 背景图background = pygame.image.load('images/background.png').convert_alpha()# 敌机图⽚enemy_img1= pygame.image.load('images/enemy1.png')enemy_img2= pygame.image.load('images/enemy2.png')enemy_img3= pygame.image.load('images/enemy3.png')enemy_img4= pygame.image.load('images/enemy4.png')# 敌机不同状态的图⽚列表,多张图⽚展⽰为动画效果enemy_down_imgs = []enemy_down_imgs.append(enemy_img1)enemy_down_imgs.append(enemy_img2)enemy_down_imgs.append(enemy_img3)enemy_down_imgs.append(enemy_img4)# 储存敌机enemies = Group()# 存储被击毁的飞机,⽤来渲染击毁动画enemies_down = Group()# 创建Play按钮play_button = Button(screen, 'Play')# 创建飞船player = Player(settings, screen)# 创建⼦弹的编组bullets = Group()# 创建记分牌scoreboard = Scoreboard(settings, screen)while True:# 绘制背景screen.blit(background, (0, 0))# 控制游戏最⼤频率clock.tick(60)# 检查玩家输⼊(不加会导致⼀直加载)gf.check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound)if settings.game_active:# 更新飞船位置player.update()# 更新敌机gf.update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound)# 更新⼦弹位置gf.update_bullets(screen, bullets)# 更新屏幕信息gf.update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets)run_game(),10.在⽂件shootingenemy.py⽬录路径下,执⾏命令“python shootingenemy.py”弹出窗⼝,即可对其操作游玩。
Python⼩游戏代码:飞机⼤战(超详细)我⽤的是pycharm,⼤家可以⽤别的Python编辑器。
创建⼀个新的⽂件夹,把图⽚的⽂件夹导⼊,图⽚的链接我放下⾯了,⼤家⾃取。
提取码:Leo1在刚才的⽂件夹⾥新建Python⽂件,输⼊以下代码# coding:utf-8import pygame, sys, random, time, easyguifrom pygame.locals import *# 初始化pygame环境pygame.init()# 创建⼀个长宽分别为480/650窗⼝canvas = pygame.display.set_mode((480, 650))canvas.fill((255, 255, 255))# 设置窗⼝标题pygame.display.set_caption("飞机⼤战")bg = pygame.image.load("images/bg1.png")enemy1 = pygame.image.load("images/enemy1.png")enemy2 = pygame.image.load("images/enemy2.png")enemy3 = pygame.image.load("images/enemy3.png")b = pygame.image.load("images/bullet1.png")h = pygame.image.load("images/hero.png")#开始游戏图⽚startgame=pygame.image.load("images/startGame.png")#logo图⽚logo=pygame.image.load("images/LOGO.png")#暂停图⽚pause = pygame.image.load("images/game_pause_nor.png")# 添加时间间隔的⽅法def isActionTime(lastTime, interval):if lastTime == 0:return TruecurrentTime = time.time()return currentTime - lastTime >= interval# 定义Sky类class Sky():def __init__(self):self.width = 480self.height = 852self.img = bgself.x1 = 0self.y1 = 0self.x2 = 0self.y2 = -self.height# 创建paint⽅法def paint(self):canvas.blit(self.img, (self.x1, self.y1))canvas.blit(self.img, (self.x2, self.y2))# 创建step⽅法def step(self):self.y1 = self.y1 + 1self.y2 = self.y2 + 1if self.y1 > self.height:self.y1 = -self.heightif self.y2 > self.height:self.y2 = -self.height# 定义⽗类FlyingObjectclass FlyingObject(object):def __init__(self, x, y, width, height, life, img):self.x = xself.y = yself.width = widthself.height = heightself.life = lifeself.img = img# 敌飞机移动的时间间隔stTime = 0self.interval = 0.01# 添加删除属性self.canDelete = False# 定义paint⽅法def paint(self):canvas.blit(self.img, (self.x, self.y))# 定义step⽅法def step(self):# 判断是否到了移动的时间间隔if not isActionTime(stTime, self.interval):returnstTime = time.time()# 控制移动速度self.y = self.y + 2# 定义hit⽅法判断两个对象之间是否发⽣碰撞def hit(self, component):c = componentreturn c.x > self.x - c.width and c.x < self.x + self.width and \ c.y > self.y - c.height and c.y < self.y + self.height# 定义bang⽅法处理对象之间碰撞后的处理def bang(self, bangsign):# 敌机和英雄机碰撞之后的处理if bangsign:if hasattr(self, 'score'):GameVar.score += self.scoreif bangsign == 2:self.life -= 1# 设置删除属性为Trueself.canDelete = True# 敌机和⼦弹碰撞之后的处理else:self.life -= 1if self.life == 0:# 设置删除属性为Trueself.canDelete = Trueif hasattr(self, 'score'):GameVar.score += self.score# 定义outOfBounds⽅法判断对象是否越界def outOfBounds(self):return self.y > 650# 重构Enemy类class Enemy(FlyingObject):def __init__(self, x, y, width, height, type, life, score, img):FlyingObject.__init__(self, x, y, width, height, life, img)self.type = typeself.score = score# 重构Hero类class Hero(FlyingObject):def __init__(self, x, y, width, height, life, img):FlyingObject.__init__(self, x, y, width, height, life, img)self.x = 480 / 2 - self.width / 2self.y = 650 - self.height - 30self.shootLastTime = 0self.shootInterval = 0.3def shoot(self):if not isActionTime(self.shootLastTime, self.shootInterval):returnself.shootLastTime = time.time()GameVar.bullets.append(Bullet(self.x + self.width / 2 - 5, self.y - 10, 10, 10, 1, b))# 重构Bullet类class Bullet(FlyingObject):def __init__(self, x, y, width, height, life, img):FlyingObject.__init__(self, x, y, width, height, life, img)def step(self):self.y = self.y - 2# 重写outOfBounds⽅法判断⼦弹是否越界def outOfBounds(self):return self.y < -self.height# 创建componentEnter⽅法def componentEnter():# 随机⽣成坐标x = random.randint(0, 480 - 57)x1 = random.randint(0, 480 - 50)x2 = random.randint(0, 480 - 100)# 根据随机整数的值⽣成不同的敌飞机n = random.randint(0, 9)# 判断是否到了产⽣敌飞机的时间if not isActionTime(stTime, GameVar.interval):returnstTime = time.time()if n <= 7:GameVar.enemies.append(Enemy(x, 0, 57, 45, 1, 1, 1, enemy1))elif n == 8:GameVar.enemies.append(Enemy(x1, 0, 50, 68, 2, 3, 5, enemy2))elif n == 9:if len(GameVar.enemies) == 0 or GameVar.enemies[0].type != 3:GameVar.enemies.insert(0, Enemy(x2, 0, 100, 153, 3, 10, 20, enemy3))# 创建画组件⽅法def componentPaint():# 判断是否到了飞⾏物重绘的时间if not isActionTime(GameVar.paintLastTime, GameVar.paintInterval):returnGameVar.paintLastTime = time.time()# 调⽤sky对象的paint⽅法GameVar.sky.paint()for enemy in GameVar.enemies:enemy.paint()# 画出英雄机GameVar.hero.paint()# 画出⼦弹对象for bullet in GameVar.bullets:bullet.paint()# 写出分数和⽣命值renderText('SCORE:' + str(GameVar.score), (0, 0))renderText('LIFE:' + str(GameVar.heroes), (380, 0))# 创建组件移动的⽅法def componentStep():# 调⽤sky对象的step⽅法GameVar.sky.step()for enemy in GameVar.enemies:enemy.step()# 使⼦弹移动for bullet in GameVar.bullets:bullet.step()# 创建删除组件的⽅法def componentDelete():for enemy in GameVar.enemies:if enemy.canDelete or enemy.outOfBounds():GameVar.enemies.remove(enemy)for bullet in GameVar.bullets:if bullet.canDelete or bullet.outOfBounds():GameVar.bullets.remove(bullet)# 从列表中删除英雄机if GameVar.hero.canDelete == True:GameVar.heroes -= 1if GameVar.heroes == 0:#easygui.msgbox('游戏结束')GameVar.state = GameVar.STATES['GAME_OVER']else:GameVar.hero = Hero(0, 0, 60, 75, 1, h)# 定义GameVar类class GameVar():sky = Sky()enemies = []# 产⽣敌飞机的时间间隔lastTime = 0interval = 1.5# 重绘飞⾏物的时间间隔paintLastTime = 0paintInterval = 0.04# 创建英雄机对象hero = Hero(0, 0, 60, 75, 1, h)# 创建列表存储⼦弹对象bullets = []# 添加分数和⽣命值score = 0heroes = 3#创建字典存储游戏状态STATES = {'START':1,'RUNNING':2,'PAUSE':3,'GAME_OVER':4}state = STATES['START']print(GameVar.state)# 定义renderText⽅法def renderText(text, position):my_font = pygame.font.SysFont("微软雅⿊", 40)newText = my_font.render(text, True, (255, 255, 255))canvas.blit(newText, position)# 创建游戏退出事件处理⽅法def handleEvent():for event in pygame.event.get():if event.type == pygame.QUIT or event.type == KEYDOWN and event.key == K_ESCAPE: pygame.quit()sys.exit()#点击⿏标开始游戏if event.type == MOUSEBUTTONDOWN and event.button == 1:if GameVar.state == GameVar.STATES['START']:GameVar.state = GameVar.STATES['RUNNING']# 英雄机跟随⿏标移动if event.type == MOUSEMOTION:if GameVar.state == GameVar.STATES['RUNNING']:GameVar.hero.x = event.pos[0] - GameVar.hero.width / 2GameVar.hero.x = event.pos[0] - GameVar.hero.width / 2 GameVar.hero.y = event.pos[1] - GameVar.hero.height / 2# 调⽤⽅法判断⿏标移⼊画布if isMouseOver(event.pos[0], event.pos[1]):#print('⿏标移⼊事件')if GameVar.state == GameVar.STATES['PAUSE']:GameVar.state = GameVar.STATES['RUNNING']# 调⽤⽅法判断⿏标移出画布if isMouseOut(event.pos[0], event.pos[1]):#print('⿏标移出事件')if GameVar.state == GameVar.STATES['RUNNING']:GameVar.state = GameVar.STATES['PAUSE']# 创建⽅法判断⿏标移出画布def isMouseOut(x, y):if x >= 479 or x <= 0 or y >= 649 or y <= 0:return Trueelse:return False# 创建⽅法判断⿏标移⼊画布def isMouseOver(x, y):if x > 1 and x < 479 and y > 1 and y < 649:return Trueelse:return False# 创建checkHit⽅法def checkHit():# 判断英雄机是否与每⼀架敌飞机发⽣碰撞for enemy in GameVar.enemies:if GameVar.hero.hit(enemy):# 敌机和英雄机调⽤bang⽅法enemy.bang(1)GameVar.hero.bang(2)# 判断每⼀架敌飞机是否与每⼀颗⼦弹发⽣碰撞for bullet in GameVar.bullets:if enemy.hit(bullet):# 敌机和⼦弹调⽤bang⽅法enemy.bang(0)bullet.bang(0)#创建controlState⽅法控制游戏状态def controlState():#游戏开始状态if GameVar.state == GameVar.STATES['START']:GameVar.sky.paint()GameVar.sky.step()canvas.blit(logo,(-40,200))canvas.blit(startgame,(150,400))#游戏运⾏状态elif GameVar.state == GameVar.STATES['RUNNING']:componentEnter()componentPaint()componentStep()checkHit()GameVar.hero.shoot()componentDelete()#游戏暂停状态elif GameVar.state == GameVar.STATES['PAUSE']:componentPaint()componentPaint()GameVar.sky.step()canvas.blit(pause,(0,0))#游戏结束状态elif GameVar.state == GameVar.STATES['GAME_OVER']: componentPaint()GameVar.sky.step()renderText('gameOver',(180,320))while True:#调⽤控制游戏状态的⽅法controlState()# 刷新屏幕pygame.display.update()# 调⽤handleEvent⽅法handleEvent()# 延迟处理pygame.time.delay(15)运⾏程序就可以了!。
python飞机大战流程Python飞机大战是一款非常经典的游戏,玩家需要操控一个飞机击败敌人并保护自己。
以下是Python飞机大战流程的详细解释,包括游戏的规则、玩家操作以及游戏流程的设计。
1.游戏规则-玩家操控一个飞机,通过上下左右键来移动飞机。
-飞机会不断发射子弹,玩家可以用子弹攻击敌人。
-敌人也会不断发射子弹,并且会在不同位置进行移动。
-飞机和敌人的子弹会相互碰撞,如果玩家的飞机被击中,则游戏结束。
-玩家需要击败所有的敌人才能过关。
2.玩家操作-玩家通过键盘上的上下左右键来移动飞机。
-空格键用来发射子弹。
-当玩家击败所有的敌人时,可以进入下一关卡。
3.游戏流程设计- 导入必要的库和模块,如pygame库用来实现游戏界面和动画效果。
-设定游戏界面的大小和背景色。
-创建玩家飞机,并设置其初始位置和速度。
-创建敌人飞机,并设置其初始位置和速度。
-创建子弹,并设置其初始位置和速度。
-监听键盘事件,实现玩家控制飞机移动和发射子弹的操作。
-循环更新游戏界面,包括玩家飞机、敌人飞机和子弹的移动和碰撞检测。
-当玩家飞机被击中或者玩家击败所有敌人时,显示游戏结束界面并判断是否进入下一关卡。
-如果玩家选择进入下一关卡,则增加敌人飞机的数量和速度,然后重新开始游戏。
-如果玩家选择退出游戏,则结束游戏流程。
4.具体实现- 在程序中导入pygame库和其他必要的模块。
-创建游戏界面,并设置界面的大小和背景颜色。
-创建飞机类,包括飞机的图像、位置、速度、移动和射击等方法。
-创建敌人类,包括敌人的图像、位置、速度、移动和射击等方法。
-创建子弹类,包括子弹的图像、位置、速度、移动和碰撞检测等方法。
-在游戏循环中,监听键盘事件,并根据用户的操作来移动飞机和发射子弹。
-更新游戏界面,包括飞机、敌人和子弹的移动和碰撞检测。
-判断游戏是否结束,如果玩家飞机被击中或者敌人被击败,则显示游戏结束界面。
-根据玩家选择的操作来决定是否进入下一关卡或者退出游戏。
基于Python的飞机大战游戏开发基于Python的飞机大战游戏开发引言飞机大战游戏自问世以来,一直受到广大玩家的喜爱。
随着计算机技术的不断发展和普及,基于Python的飞机大战游戏开发也成为了一项具有挑战性和创新性的任务。
本文将介绍基于Python的飞机大战游戏开发过程中的关键步骤和技术,以及其中涉及的基于Python编程语言的特点和优势。
一、飞机大战游戏概述飞机大战游戏是一种射击游戏,玩家需要操控一个战斗飞机,与敌机进行空中对抗。
通过射击敌机并躲避敌机的攻击,玩家可以获得积分和能力提升道具,逐渐完成游戏目标。
二、Python编程语言简介Python是一种高级编程语言,被广泛应用于各种领域。
它具有简洁而优雅的语法,易学易用的特点,适合初学者入门。
此外,Python还具有丰富的第三方库和强大的生态系统,为开发飞机大战游戏提供了良好的基础。
三、游戏开发前期准备在进行游戏开发之前,我们需要对游戏进行详细的需求分析和规划。
主要包括:1.确定游戏的基本功能和玩法,例如玩家的控制方式、敌机的种类和行为等。
2.设计游戏的界面和图形风格,选择合适的美术资源。
3.搭建游戏开发环境,确保Python及相关开发库的安装和配置完成。
四、游戏主要功能实现1.游戏主循环游戏主循环是游戏的核心部分,它负责监听用户的输入和更新游戏的状态。
在这个循环中,我们需要实现游戏界面的绘制、用户输入的响应以及游戏逻辑的计算等功能。
2.玩家飞机玩家飞机是游戏中最基本的角色之一,玩家将通过操控飞机进行战斗。
我们可以利用Python的图形库来实现玩家飞机的绘制和移动控制。
同时,还可以设计不同类型的子弹和加速道具等来提升飞机的战斗能力。
3.敌机敌机是游戏中的主要敌人,玩家需要通过射击和躲避来与敌机进行战斗。
我们可以设计多种类型的敌机,每种敌机具有不同的行为和攻击方式。
在敌机的移动和攻击过程中,我们可以利用Python的物理引擎库来实现更加真实的效果。
python开发飞机⼤战游戏本⽂实例为⼤家分享了python开发飞机⼤战游戏的具体代码,供⼤家参考,具体内容如下import pygameimport randomimport math # 数学模块# 初始化界⾯pygame.init()# 设置窗⼝⼤⼩windows = pygame.display.set_mode((800, 600))# 设置窗⼝标题pygame.display.set_caption("⼩赵同学")# 引⼊图⽚ logoicon = pygame.image.load('logo.jpg')pygame.display.set_icon(icon)# 4.游戏获取背景bgcolor = pygame.image.load('bj.png')# 5.设置玩家飞机playerimg = pygame.image.load('fj.png')X = 350 # 设置玩家X轴Y = 480 # 设置玩家Y轴# 停⽌移动就可以将palyerStep改为0。
控制⼀个变量来指定飞机指定移动playerStep = 0# 添加背景⾳乐pygame.mixer.music.load('bj.mp3')pygame.mixer.music.play(-1)# 添加射中的⾳效# bao_music = pygame.mixer.Sound('bj.mp3')# 分数score = 0# 添加字体和⼤⼩font = pygame.font.Font('freesansbold.ttf', 32)# 字体类def show_score():# 显⽰的⽂字text = f"Score:{score}"# 渲染然后显⽰显⽰text True表⽰24位的字score_render = font.render(text, True, (0, 255, 0))# 指定字体放到那个位置windows.blit(score_render, (10, 10))# 游戏结束的变量over = Falseover_font = pygame.font.Font('freesansbold.ttf', 64)# 结束的提⽰语def check_over():if over:text = "Game Over"render = font.render(text, True, (255, 0, 0))windows.blit(render, (320, 200))# 8.添加敌⼈.# 11.添加多个敌⼈number_enemy = 6# 敌⼈类class Enemy:def __init__(self):#self.img = pygame.image.load('enemy.png')self.x = random.randint(200, 600) # 随机产⽣Xself.y = random.randint(50, 250) # 随机产⽣Yself.step = random.randint(2, 4) # 随机产⽣速度# 当被射中时恢复位置def reset(self):self.x = random.randint(200, 600)self.y = random.randint(50, 180)def distance(bx, by, ex, ey):a = bx - exb = by - eyreturn math.sqrt(a * a + b * b) # 开根号# 保存所有的敌⼈enemis = []for i in range(number_enemy): # 每次循环都都在class Enemy中过⼀边,所以随机产⽣⼀个敌⼈的参数并且保存到列表中 enemis.append(Enemy())# 显⽰敌⼈并且实现敌⼈的移动下沉def enemy(): # 循环保存敌⼈的列表,每个敌⼈都过在这个for循环⾥被限制了移动的轨迹global overfor e in enemis:windows.blit(e.img, (e.x, e.y))e.x += e.stepif e.x > 750 or e.x < 0: # 判断敌⼈是否到了边界e.step *= -1 # 敌⼈碰到界⾯往返e.y += 40 # 设置敌⼈往下沉# 判断敌⼈的位置如果到达指定的地⽅则游戏结束if e.y > 436:over = Trueprint("游戏结束啦")enemis.clear()# 设置飞机及飞机移动范围的函数 == 飞机类型def fiji_type(): # 设置飞机的坐标和飞机X Y轴最⼤的移动位置global X, Y# 5. 设置飞机windows.blit(playerimg, (X, Y))# 6.飞机移动X += plagerStep# 预防飞机出界if X > 680:X = 680if X < 0:X = 0# ⼦弹的类class Bullet:def __init__(self):self.img = pygame.image.load('bullet.png')self.x = X + 55 # 设置⼦弹的X轴self.y = Y + 5 # ⼦弹出现在玩家的上⽅self.step = 2 # ⼦弹移动的速度# 击中敌⼈def hit(self):global scorefor e in enemis:if distance(self.x, self.y, e.x, e.y) < 30:# 射中了bullets.remove(self)e.reset() # 重置敌⼈# 没击中加10分score += 10bullets = [] # 保存现有的⼦弹# 显⽰⼦弹移动def show_bullets():for b in bullets:windows.blit(b.img, (b.x, b.y))b.hit() # 查看是否击中了敌⼈b.y -= b.step # 往上移动# 判断⼦弹是否出了界⾯if b.y < 0:bullets.remove(b)# 3.游戏主循环running = Truewhile running:# 4.背景# 每个循环是画⼀张画组成的# 画出来bgcolorwindows.blit(bgcolor, (0, 0))# 调⽤这个字体show_score()# event.get操作事件for event in pygame.event.get():# 判断操作类型是不是QUITif event.type == pygame.QUIT:# 如果程序为False就会停⽌则关闭running = False# 7.控制飞机的移动# 通过控制键盘的事件来控制(playerStep值)飞机的移动 if event.type == pygame.KEYDOWN:# 判断按下键盘右键,按下则移动if event.key == pygame.K_RIGHT:plagerStep = 3# 判断按下左键elif event.key == pygame.K_LEFT:plagerStep = -3# 判断按下空格健的反应elif event.key == pygame.K_SPACE:# 创建⼀个⼦弹b = Bullet()bullets.append(b)# 判断松来按键停⽌,if event.type == pygame.KEYUP:plagerStep = 0# 调⽤飞机的类型的函数fiji_type()# 调⽤敌⼈这个函数enemy()show_bullets() # 显⽰⼦弹# 游戏结束语check_over()# 刷新更新数据pygame.display.update()# global 设置全局变量''' 游戏结构1.设置窗⼝⼤⼩2.背景图3.显⽰飞机4.移动飞机5.控制出界6.获取键盘事件7.显⽰敌⼈8.敌⼈移动9.下沉和随机位置10.显⽰多个敌⼈11.响应空格键12.添加⼦弹13.发射⼦弹14.射中检测之距离15.射中检测16.添加⾳效17.添加并显⽰分数18.游戏结束19.结束提⽰'''以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
⽤pycharm写⼀个打飞机的游戏⾸先要pycharm中安装pygame,源代码mport sys # 导⼊系统模块import random # 导⼊随机数import pygame # 导⼊pygame模块import pygame.locals # 导⼊pygame本地策略APP_ICON = “res/app.ico” # 设计图⽚常量IMG_BACKGROUND = “res/img_bg_level_1.jpg” # 设计图⽚常量设置敌机图⽚库常量元组IMG_ENEMYS = (“res/img-plane_1.png”,“res/img-plane_2.png”,“res/img-plane_3.png”,“res/img-plane_4.png”,“res/img-plane_5.png”,“res/img-plane_6.png”,“res/img-plane_7.png”)IMG_PLAYER = “res/hero2.png” # 设置玩家飞机图⽚IMG_BULLET = “res/bullet_13.png” # 设置⼦弹图⽚创建所有显⽰的图形⽗类Modelclass Model:window = None # 主窗体对象,⽤于模型访问使⽤构造⽅法def init(self, img_path, x, y):self.img = pygame.image.load(img_path) # 背景图⽚self.x = x # 窗体中放置的x坐标self.y = y # 窗体中放置的y坐标将模型加⼊窗体的⽅法抽取到⽗类def display(self):self.window.blit(self.img, (self.x, self.y)) # 填充图⽚到窗体中@staticmethod # 碰撞操作与模型对象⽆关,属于模型相关操作,定义为静态⽅法def is_hit(rect1,rect2): # 定义双⽅是否碰撞的静态⽅法return pygame.Rect.colliderect(rect1, rect2) # 返回两个矩形是否相交,即是否碰撞背景类class Background(Model):定义背景移动的⽅法def move(self):加⼊判断if self.y <= Game.WINDOW_HEIGHT: # 更新⾼度的引⽤ # 如果没有超出屏幕就正常移动self.y += 1 # 纵坐标⾃增1else: # 如果超出屏幕,恢复图⽚位置为原始位置self.y = 0 # 纵坐标 = 0覆盖⽗类display⽅法,做辅助背景贴图def display(self):self.window.blit(self.img, (self.x, self.y)) # 原始背景贴图,推荐使⽤super().display()self.window.blit(self.img, (self.x, self.y - Game.WINDOW_HEIGHT)) # 更新⾼度的引⽤ # 辅助背景即将原始背景图⽚展⽰第⼆遍,坐标位置与第⼀遍展⽰上下拼接吻合玩家类class PlayerPlane(Model):覆盖init⽅法def init(self,img_path, x, y):super().init(img_path, x, y) # 调⽤⽗类构造⽅法self.bullets = [] # 定义⼦弹列表为空,默认没有⼦弹覆盖display⽅法def display(self,enemys): # 在显⽰飞机和⼦弹的同时,传⼊敌机列表,判断⼦弹是否与敌机相撞,添加enemys形参super().display() # 调⽤⽗类⽅法remove_bullets = [] # 定义被删除的⼦弹列表for bullet in self.bullets: # 循环⼦弹优化⼦弹存储队列,超出屏幕移出⼦弹if bullet.y < -29 : # 如果⼦弹位置超出屏幕remove_bullets.append(bullet) # 将要删除的⼦弹加⼊列表else: # 如果⼦弹位置未超出屏幕范围rect_bullet = pygame.locals.Rect(bullet.x, bullet.y, 20, 29) # 创建⼦弹矩形对象,传⼊x,y,width,heightfor enemy in enemys: # 对未超出屏幕显⽰范围的⼦弹与所有敌机进⾏碰撞检测rect_enemy = pygame.locals.Rect(enemy.x,enemy.y,100,68) # 创建敌机矩形对象,传⼊x,y,width,height调⽤碰撞检测⽅法,传⼊当前⼦弹对象,传⼊敌机对象,判断是否碰撞if Model.is_hit(rect_bullet,rect_enemy) : # 如果碰撞enemy.is_hited = True # 击中敌机即设置当前敌机为被击中状态enemy.bomb.is_show = True # 设置爆破效果状态开启enemy.bomb.x = enemy.x # 设置爆破效果开启位置x坐标enemy.bomb.y = enemy.y # 设置爆破效果开启位置y坐标remove_bullets.append(bullet) # 将产⽣碰撞的⼦弹加⼊删除列表sound = pygame.mixer.Sound(“res/bomb.wav”) # 添加混⾳⾳效⽂件sound.play() # 播放爆破效果⾳break # 当前⼦弹击中了⼀架敌机,终⽌对剩余敌机的碰撞检测,终⽌敌机循环for bullet in remove_bullets: # 循环删除⼦弹列表self.bullets.remove(bullet) # 从原始⼦弹列表中删除要删除的⼦弹敌机类class EnemyPlane(Model):覆盖init⽅法def init(self):img = IMG_ENEMYS[random.randint(0,len(IMG_ENEMYS)-1)] # 设置图⽚路径随机从元组中获取x = random.randint(0, Game.WINDOW_WIDTH - 100) # 设置x坐标随机⽣成横向位置 0 到屏幕宽度 - 飞机宽度(100)y = random.randint(-Game.WINDOW_HEIGHT, -68) # 设置y坐标随机⽣成纵向位置 -屏幕⾼度到 -飞机⾼度super().init(img,x,y) # 调⽤⽗类构造⽅法self.is_hited = False # 添加敌机被击中的状态self.bomb = Bomb() # 为敌机添加绑定的爆破效果对象定义敌机移动的⽅法def move(self):控制敌机到达底部后,返回顶部if self.y < Game.WINDOW_HEIGHT and not self.is_hited : # 添加敌机被击中的状态判定 # 敌机未超出屏幕self.y += 4 # 控制敌机移动速度else: # 敌机超出屏幕self.img = pygame.image.load(IMG_ENEMYS[random.randint(0, len(IMG_ENEMYS) - 1)]) # 修改敌机到达底部后返回的图⽚随机⽣成,同初始化策略self.x = random.randint(0, Game.WINDOW_WIDTH - 100) # 修改敌机到达底部后返回顶部的策略,x随机⽣成,同初始化策略self.y = random.randint(-Game.WINDOW_HEIGHT, -68) # 修改敌机到达底部后返回顶部的策略,y随机⽣成,同初始化策略self.is_hited = False # 重置敌机是否被击中状态为未被击中,False⼦弹类class Bullet(Model):定义⼦弹移动的⽅法def move(self):self.y -= 12 # 控制⼦弹移动速度爆炸效果类class Bomb(Model): # 创建爆炸效果类def init(self): # 定义单独的初始化⽅法self.x = None # 定义爆炸显⽰的横坐标xself.y = None # 定义爆炸显⽰的纵坐标yself.imgs = [ pygame.image.load(“res/bomb-”+str(i)+".png") for i in range(1,7)] # 加载爆炸效果使⽤的所有图⽚列表self.is_show = False # 定义是否开启爆破效果属性self.times = 0 # 定义爆破图⽚展⽰控制变量设置测试类⼊⼝操作if name == “main”:Game().run()import sys # 导⼊系统模块import random # 导⼊随机数import pygame # 导⼊pygame模块import pygame.locals # 导⼊pygame本地策略APP_ICON = “res/app.ico” # 设计图⽚常量IMG_BACKGROUND = “res/img_bg_level_1.jpg” # 设计图⽚常量设置敌机图⽚库常量元组IMG_ENEMYS = (“res/img-plane_1.png”,“res/img-plane_2.png”,“res/img-plane_3.png”,“res/img-plane_4.png”,“res/img-plane_5.png”,“res/img-plane_6.png”,“res/img-plane_7.png”)IMG_PLAYER = “res/hero2.png” # 设置玩家飞机图⽚IMG_BULLET = “res/bullet_13.png” # 设置⼦弹图⽚创建所有显⽰的图形⽗类Modelclass Model:window = None # 主窗体对象,⽤于模型访问使⽤构造⽅法def init(self, img_path, x, y):self.img = pygame.image.load(img_path) # 背景图⽚self.x = x # 窗体中放置的x坐标self.y = y # 窗体中放置的y坐标将模型加⼊窗体的⽅法抽取到⽗类def display(self):self.window.blit(self.img, (self.x, self.y)) # 填充图⽚到窗体中@staticmethod # 碰撞操作与模型对象⽆关,属于模型相关操作,定义为静态⽅法def is_hit(rect1,rect2): # 定义双⽅是否碰撞的静态⽅法return pygame.Rect.colliderect(rect1, rect2) # 返回两个矩形是否相交,即是否碰撞背景类class Background(Model):定义背景移动的⽅法def move(self):加⼊判断if self.y <= Game.WINDOW_HEIGHT: # 更新⾼度的引⽤ # 如果没有超出屏幕就正常移动self.y += 1 # 纵坐标⾃增1else: # 如果超出屏幕,恢复图⽚位置为原始位置self.y = 0 # 纵坐标 = 0覆盖⽗类display⽅法,做辅助背景贴图def display(self):self.window.blit(self.img, (self.x, self.y)) # 原始背景贴图,推荐使⽤super().display()self.window.blit(self.img, (self.x, self.y - Game.WINDOW_HEIGHT)) # 更新⾼度的引⽤ # 辅助背景即将原始背景图⽚展⽰第⼆遍,坐标位置与第⼀遍展⽰上下拼接吻合class Game:WINDOW_WIDTH = 512 # 定义窗体宽度常量WINDOW_HEIGHT = 768 # 定义窗体⾼度常量设置测试类⼊⼝操作if name == “main”:Game().run()最后运⾏,图⽚如下。
计算机编程编写一个简单的人机对战游戏编程语言:Python一、简介人机对战游戏是计算机编程中常见的项目之一。
通过编写游戏代码,可以实现人类和计算机之间的对战,增加了游戏的趣味性和挑战性。
本文将介绍如何使用Python语言编写一个简单的人机对战游戏。
二、游戏规则在这个简单的人机对战游戏中,游戏场地为一个矩形区域,玩家和计算机分别控制一个小方块,通过键盘控制方向进行移动。
游戏的目标是在规定时间内尽可能多地吃到食物,同时要避免撞到边界或对方。
当时间结束后,比较两方吃到的食物数量,吃得更多的一方获胜。
三、游戏设计1. 导入必要的模块在Python中,我们可以使用pygame模块来实现简单的游戏功能。
首先,我们需要导入pygame模块并初始化:```pythonimport pygameimport randompygame.init()```2. 设定游戏界面设置游戏界面的宽度和高度,以及游戏界面的标题:```pythonwidth = 800height = 600screen = pygame.display.set_mode((width, height))pygame.display.set_caption("人机对战游戏")```3. 定义玩家和计算机的方块通过定义一个方块类,我们可以创建出玩家和计算机的方块对象,并设置初始位置和移动速度:```pythonclass Block(pygame.sprite.Sprite):def __init__(self, x, y, color):super().__init__()self.image = pygame.Surface([20, 20])self.image.fill(color)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.speed_x = 0self.speed_y = 0def update(self):self.rect.x += self.speed_xself.rect.y += self.speed_y```4. 定义食物通过创建食物对象,我们可以随机生成食物的位置,并在游戏界面上显示出来:```pythonclass Food(pygame.sprite.Sprite):def __init__(self, color):super().__init__()self.image = pygame.Surface([20, 20])self.image.fill(color)self.rect = self.image.get_rect()def reset(self):self.rect.x = random.randrange(0, width - 20)self.rect.y = random.randrange(0, height - 20)```5. 实现游戏逻辑通过控制玩家方块的移动,判断是否吃到食物或撞到边界或对方,来更新游戏的状态。
基于Python的飞机大战游戏开发基于Python的飞机大战游戏开发一、游戏开发背景随着互联网的普及和技术的不断进步,游戏开发行业也持续蓬勃发展。
飞机大战游戏作为一种经典的射击游戏类型,在游戏玩家中依然很受欢迎。
本文将基于Python编程语言,介绍如何开发一款简单的飞机大战游戏。
通过本次开发,读者可以了解到游戏开发的基本流程和技术点,也可以在此基础上进行更复杂的游戏开发。
二、游戏开发流程1. 游戏概念设定:在游戏开发之前,首先需要对游戏的概念进行设定。
比如,本游戏是一款经典的2D飞机大战游戏,玩家控制一个飞机进行射击击败敌人、拾取道具等游戏操作。
设定游戏的主题和目标,这样可以更好地引导游戏的开发进程。
2. 游戏界面设计:游戏界面是玩家和游戏交互的重要环节。
在这一步中,我们需要设计游戏的背景、角色、道具等元素,以及各种界面效果,比如游戏开始、暂停、结束等。
Python的Pygame库提供了丰富的图形库和工具,可以帮助我们实现这些设计。
3. 游戏逻辑编码:在游戏逻辑编码阶段,我们需要根据游戏的规则和设定,编写游戏的各种功能和行为。
比如,玩家飞机的移动、射击,敌人的生成和移动,道具的产生和效果等。
可以通过Python语言的条件判断、循环等程序结构,实现游戏的逻辑功能。
4. 游戏测试和调试:在整个开发过程中,我们需要不断地进行测试和调试,确保游戏的各项功能正常运行。
这里可以先从单一功能进行测试,再逐渐整合各个模块进行整体测试。
通过测试和调试,可以及时发现和解决游戏中的bug和问题,提高游戏的质量和稳定性。
5. 游戏优化和美化:在游戏开发的最后阶段,我们需要对游戏进行优化和美化,使其更加流畅、漂亮和具有吸引力。
优化方面可以从游戏性能、代码的简洁性等方面考虑,优化游戏的加载速度和运行效率;美化方面可以加入一些音效、背景音乐,还可以通过更加精美的图形、动画效果等,提升游戏的表现力和用户体验。
三、Python的游戏开发库在Python的游戏开发中,Pygame库是非常流行的开发工具。
飞机大战小游戏编程实现飞机大战是一款经典的射击游戏,它的快节奏和刺激的战斗场景吸引了无数玩家。
如果你对编程有一定了解,那么你也可以尝试自己编写一个飞机大战小游戏。
本文将为你介绍如何使用Python语言实现一个简单的飞机大战小游戏。
一、游戏背景设置在开始编程之前,我们需要对游戏背景进行设置。
首先,我们需要导入所需的Python库,如pygame库,它是一个专门用于游戏开发的库。
接下来,我们需要创建游戏窗口,并设置窗口的标题和大小。
为了让游戏更加流畅,我们还需要设置游戏时钟的刷新频率。
二、玩家飞机的控制在游戏中,玩家将扮演一名飞行员,操控着自己的战机进行战斗。
为了实现飞机的控制,我们需要定义一个飞机类,并在类中实现飞机的移动、射击等功能。
在游戏中,我们可以通过监听键盘事件来实现对飞机的控制,例如W键用于向上移动,S键用于向下移动,以及空格键用于射击。
三、敌机的生成和移动在游戏中,敌机将会以一定的速度从顶部出现,并向下移动。
我们可以使用一个敌机类来实现敌机的生成和移动功能。
为了使游戏更有挑战性,我们可以设置敌机的数量和速度,并在敌机被击中或者飞出屏幕范围时进行重新生成。
四、碰撞检测和得分统计在飞机大战游戏中,当玩家的飞机与敌机发生碰撞时,游戏结束。
为了实现碰撞检测功能,我们需要定义一个碰撞检测函数,并在游戏循环中调用该函数。
除了碰撞检测之外,我们还需要实现得分统计功能。
例如,当玩家击落一个敌机时,玩家的得分将会增加。
五、游戏结束和重新开始在游戏中,当玩家的飞机与敌机发生碰撞时,游戏结束。
为了实现游戏结束功能,我们可以创建一个结束界面,并在游戏循环中判断是否游戏结束。
当游戏结束时,玩家可以选择重新开始游戏或退出游戏。
六、总结通过本文的介绍,你已经了解了使用Python语言实现一个简单的飞机大战小游戏的基本步骤。
当然,这只是一个简单的示例,你可以根据自己的想法和编程知识进行扩展和优化。
编写一个自己的飞机大战小游戏不仅可以提升你的编程技能,还可以给你带来快乐和满足感。
⼀、利⽤Python编写飞机⼤战游戏-⾯向对象设计思想相信⼤家看到过⽹上很多关于飞机⼤战的项⽬,但是对其中的模块⽅法,以及使⽤和游戏⼯作原理都不了解,看的也是⼀脸懵逼,根本看不下去。
下⾯我做个详细讲解,在做此游戏需要⽤到pygame模块,所以这⼀章先进⾏pygame⼊门讲解--设置游戏窗⼝,绘制游戏背景,绘制战机图⽚,绘制战机移动动画(后⾯利⽤⾯向对象重新设计整个项⽬)1、先看看游戏屏幕样式及⼯作原理2、再看看动画⼯作原理3、分析完了,上代码,所有说明注释写的很清楚#!/usr/bin/env python# coding=utf-8# author:刘仲# datetime:2018/7/11 9:58# software: PyCharmimport pygamepygame.init() # 加载pygame中的所有模块,这是⼀句固定的代码screen = pygame.display.set_mode((480, 700)) # 创建⼀个游戏窗⼝,屏幕⼤⼩480*700,这⾥⼀般背景图⽚多⼤,屏幕就设置多⼤"""绘制背景图⽚步骤:1、图⽚⼀般事先存在本地磁盘⾥,所以我们把需要的图⽚先加载到内存中2、将加载到内存的图⽚绘制到屏幕指定的位置3、刷新屏幕显⽰,否则绘制的图⽚⽆法显⽰制作动画:动画就是将多张静⽌的图⽚快速的播放,这⾥就涉及到帧数的问题,⼀般每秒60刷新60次就能制作⾼品质的动画。
所以,pygame中提供了⼀个时钟类,可以调⽤tick()⽅法控制帧数"""bg = pygame.image.load('./images/background.png') # 加载背景图⽚到内存im = pygame.image.load('./images/me1.png') # 加载战机到内存enemy1 = pygame.image.load('./images/enemy1.png') # 加载敌机到内存clock = pygame.time.Clock() # 创建时钟对象hero = pygame.Rect(200, 500, 102, 126) # 创建⼀个和战机⼤⼩相等的矩形对象# rect⽅法可以创建⼀个矩形对象,参数(x,y,weight,height),xy是原点位置,weight和height是矩形宽和⾼enemy_1 = pygame.Rect(200, 100, 57, 43) # 创建⼀个和敌机⼤⼩的矩形对象# 如何让游戏屏幕⼀直显⽰,这就叫游戏循环,把所有更新图⽚位置,刷新帧数,监听事件都写在游戏循环⾥while True:clock.tick(60) # 每秒刷新60次for event in pygame.event.get(): # 监听⽤户做的各种操作,pygame.event.get()返回来的是⼀个⽤户操作的动作列表if event.type == pygame.QUIT: # 判断⽤户是否点击退出按钮,即游戏窗⼝的叉叉print('游戏退出...')pygame.quit() # 卸载所有pygame的模块exit() # 退出整个系统hero.y -= 2 # 战机以2的速度向上移动enemy_1.y += 1 # 敌机以1的速度乡下移动screen.blit(bg, (0, 0)) # 将背景图⽚绘制到屏幕,绘制就调⽤屏幕对象的blit⽅法# (疑问:屏幕图像不是固定的吗,也没有去改变y值,# 为何放在循环⾥?这是因为每次循环都需要重新绘制⼀遍屏幕,再将飞机的图⽚绘制到新的屏幕上,这样就不会出现飞机残影)screen.blit(im, hero) # 将战机绘制到屏幕screen.blit(enemy1, enemy_1) # 将敌机绘制到屏幕pygame.display.update() # 这句也是固定代码,更新屏幕显⽰,否则⽆法显⽰绘制好的图⽚pygame.quit() # 游戏退出4、运⾏效果如下,我截取的是图⽚,实际是在⼀个向上移动⼀个向移动的动画效果这个只是⼊门,制作简单的,晚上或明天会继续更新,利⽤⾯向对象实现完整的屏幕背景滚动,飞机发射⼦弹,碰撞检测的代码。
游戏分享:手把手教你用Python编写
战斗机游戏
2018.1.23
游戏制作
今天我们要分享的是战斗机游戏!在这个游戏中,飞机(游戏主角)需要躲避迎面飞来的炮弹(敌人)。
下面让我们一起来看一下如何编写这个小游戏吧!
初始设置
首先,创建一个新的.py文件然后置入下面的代码:
import pygame
from pygame.locals import*
pygame.init()
和其他所有python程序一样,我们要首先导入(import)我们所要使用的模块(module)。
在今天这个例子里,我们要导入pygame以及pygame.locals,以用于后面的内容。
最后一行pygame.init()将所有的PyGame模块初始化,在我们正式开始写PyGame的“正文内容”之前,都要先加上这一行。
屏幕对象
首先,我们需要为所有的物体创建一个画布窗口,我们把这个变量叫做screen。
为了创建这个变量,我们需要调用pygame.display下的set_mode()方法(method),并向set_mode()传递一个元组(tuple)来表示窗口的高和宽(在这里我们设置一个高800宽600的窗口)。
import pygame
from pygame.locals import*
pygame.init()
screen=pygame.display.set_mode((800,600))
现在,如果你运行程序,你将会看到一个窗口突然出现,并在我们退出程序时马上消失。
看来我们已经成功创建了画布!在下一部分,我们将加入游戏的main循环,这样我们就能确保只有我们输入正确的退出命令时,程序才会退出。
游戏循环
游戏的主循环内包含了所有要发生的事件。
当我们玩游戏时,这段程序一直在运行。
它能够不断更新游戏的状态,渲染游戏屏幕效果,并且收集玩家输入的指令。
除了让主循环在游戏进行中不断执行,我们也需要让循环在我们退出程序时停止。
因而,我们需要引入一些相应的指令,让程序能够在这些指令输入(input)时作出相应的反应。
所有输入的指令(以及之后一些其他的事件)都会进入PyGame 的事件队列中,我们可以通过pygame.event.get()来得到这些事件。
这个命令会返回队列中的事件列表,在游戏中,程序将对这些事件进行循环,并且根据事件的类别作出相应的反应。
在下一段代码中,我们要处理的是KEYDOWN和QUIT事件:
#用于让主循环不断运行的变量
running=True
#主循环
while running:
#针对事件队列的for循环
for event in pygame.event.get():
#检测是否有KEYDOWN事件,KEYDOWN是一个在pygame.locals中定义了的事件常量,这个库我们之前导入过
if event.type==KEYDOWN:
#如果按了ESC键,把running的值设为False,并退出主循环
if event.key==K_ESCAPE:
running=False
#检测是否有QUIT事件,如果有的话,把running的值设为Flase elif event.type==QUIT:
running=False
把这几行代码加到之前的代码之后,然后执行程序。
你应该会看到一个空白的窗口。
这个窗口只会在你按下ESC键以激活QUIT事件的时候才会关闭。
Surface和Rect对象
Surface和Rect是PyGame里的基础模块。
我们可以把surface理解为一张白纸,我们可以在这张白纸上画任何想画的东西。
我们的screen变量也是一个“surface“,因为它也是用于承载图像的。
Rect代表surface内的一个矩形区域。
现在,让我们创建一个50像素x50像素的surface,用surf变量来代表这个surface,然后给这个surface对象填充颜色。
由于窗口的默认背景色是黑色,我们将把这个surface对象填充为白色,这样在颜色对比之下就更明显一些。
然后我们要对这个surface调用get_rect()方法,然后得到这个surface代表的矩形区域以及surface的x、y坐标。
#创建surface对象,将长和宽以元组的形式传递
surf=pygame.Surface((50,50))
#用白色填充surface对象,让它与背景有所区别
surf.fill((255,255,255))
rect=surf.get_rect()
Blit和Flip
要使我们创建的surface显示在屏幕上,仅仅创建它是不够的,我们还需要用blit 把这个surface放到另一个surface(screen)上。
在PyGame中,我们可以把blit理解为“画”。
我们可以用blit把一个surface画在另一个surface上,在这里,我们的另一个surface就是我们的大画布screen。
下面的代码显示如何将surface变量surf画在screen上:
#这行的意思是“在画布screen横坐标400纵坐标300的地方画一个surf”
screen.blit(surf,(400,300))
pygame.display.flip()
blit()带有两个参数:一个是我们要画上去的surface,另一个是我们要画的位置的坐标。
在这里,(400,300)代表了screen画布的中心,但是当你真正执行程序的时候你会发现,surf并没有出现在屏幕的正中央。
这是因为blit()都是从左上角开始画图的,(400,300)代表了surface的左上角。
需要注意的是,我们在blit后调用了pygame.display.flip()。
Flip会在每一次循环时刷新屏幕,从而显示在上一次循环后屏幕更新后的状态。
如果不调用flip()的话,这些更新是不会显示的。
(未完待续)。