激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

python能用來(lái)開發(fā)游戲嗎(Python 居然可以實(shí)現(xiàn)這么牛逼的游戲項(xiàng)目?開發(fā)無(wú)壓力)

發(fā)布時(shí)間:2023-11-27 15:07:10 瀏覽量:94次

?Python 居然可以實(shí)現(xiàn)這么牛逼的游戲項(xiàng)目?開發(fā)無(wú)壓力

python能用來(lái)開發(fā)游戲嗎(Python 居然可以實(shí)現(xiàn)這么牛逼的游戲項(xiàng)目?開發(fā)無(wú)壓力)

今天小編就來(lái)教你如何用 Python 制作飛機(jī)大戰(zhàn)的游戲項(xiàng)目 !

項(xiàng)目開發(fā)代碼免費(fèi)獲取【見文末】

請(qǐng)相信我是一個(gè)單純的孩子 ,也相信大家明白我說(shuō)的打飛機(jī)是指啥意思 ,對(duì)吧 ? 嗯 ,沒(méi)毛病 。就是 用 pygame 實(shí)現(xiàn)一個(gè)飛機(jī)大戰(zhàn)的游戲 ,優(yōu)秀的我啊 !

我們知道 pygame 框架可以用于管理圖形 、動(dòng)畫聲音等 ,能夠利用它來(lái)輕松地開發(fā)復(fù)雜的游戲 ,可以讓我們更加專注于面向?qū)ο缶幊?。此項(xiàng)目是基于 pygame 框架搭建的一個(gè)小游戲 ,在此文中將實(shí)現(xiàn)此項(xiàng)目的 50% ,后續(xù)會(huì)有跟進(jìn) ,源代碼已經(jīng)放在我的 GitHub 中 ,并在進(jìn)行中將會(huì)不斷對(duì)代碼結(jié)構(gòu)進(jìn)行優(yōu)化 ,對(duì)樣式進(jìn)行優(yōu)化 。在本例中將會(huì)接觸簡(jiǎn)單的面向?qū)ο缶幊毯屠^承 。面向?qū)ο缶幊淌翘崛№?xiàng)目中某種事物的關(guān)鍵屬性進(jìn)行抽象 ,抽象模型中包括數(shù)據(jù)和行為 ,類是對(duì)象的抽象 ,對(duì)象是類的實(shí)例 。

項(xiàng)目開發(fā)代碼免費(fèi)獲取【見文末】

先送上一波效果圖(被壓縮的時(shí)間略短)

效果圖

游戲簡(jiǎn)介 :在游戲《外星人入侵》中 ,玩家控制著一艘最初出現(xiàn)在屏幕底部中央的飛船 。玩家可以使用箭頭鍵左右移動(dòng)飛船 ,還可使用空格鍵進(jìn)行射擊 。游戲開始時(shí) ,一群外星人出現(xiàn)在天空中 ,他們?cè)谄聊恢邢蛳乱苿?dòng) 。玩家的任務(wù)是射殺這些外星人 。玩家將所有外星人都消滅干凈后 ,將出現(xiàn)一群新的外星人 ,他們移動(dòng)的速度更快 。只要有外星人撞到了玩家的飛船或到達(dá)了屏幕底部 ,玩家就損失一艘飛船 。玩家損失三艘飛船后 ,游戲結(jié)束 。

游戲用例圖(第一次畫用例圖,不是很準(zhǔn)確……)

例圖

析該項(xiàng)目 ,飛船 、子彈 、外星人可以分別劃分為具有共同屬性的一類 ,類中定義各自的屬性 ,包括圖像 、形狀 、位置 、更新位置 、繪制圖像等 ;在主函數(shù)中將對(duì)象實(shí)例化 ,對(duì)對(duì)象中的成員變量和函數(shù)進(jìn)行調(diào)用實(shí)現(xiàn)移動(dòng) 、擊殺等操作 ;本節(jié)實(shí)現(xiàn)飛船和子彈類和基本功能 。

在構(gòu)建子彈類時(shí) ,用到了繼承的概念 ,當(dāng)在參與大型項(xiàng)目開發(fā)設(shè)計(jì)時(shí) ,繼承是一個(gè)非常關(guān)鍵的概念 。繼承是對(duì)已有類的一種復(fù)用 ,子類繼承父類 ,可以對(duì)父類中的方法和數(shù)據(jù)進(jìn)行重寫 ,也可以新定義只屬于子類的成員變量 。當(dāng)項(xiàng)目中有許多類具有相同的基本屬性時(shí) ,可以考慮將這些基本屬性抽象為一個(gè)父類 ,子類通過(guò)繼承父類而擁有父類中的數(shù)據(jù)和方法 ,這會(huì)提高代碼的可讀性 ,也省去很多重復(fù)的代碼 。

新建以下幾個(gè)文件 :

  1. alien-invasion.py 主函數(shù)
  2. ship.py 飛船類
  3. bullet.py 子彈類
  4. game_functions.py 許多主函數(shù)會(huì)調(diào)用的函數(shù)
  5. settings.py 配置文件 ,常量

其目錄結(jié)構(gòu)如下 :


python能用來(lái)開發(fā)游戲嗎(Python 居然可以實(shí)現(xiàn)這么牛逼的游戲項(xiàng)目?開發(fā)無(wú)壓力)

方法 1——

  1. git clone https://github.com/AlisaBen/easycoding
  2. powershell進(jìn)入到工程目錄下(/fun_python>)
  3. cd http://www.toutiao.com/a6717818487055581709/alien_invasion
  4. python alien_invasion.py

方法2——

  1. 按照下面代碼部分新建文件 ,并復(fù)制代碼
  2. 在文件的同級(jí)目錄下新建images目錄
  3. 找飛船和子彈的圖片分別命名為外星飛船.png和生氣.png.emmm…畫風(fēng)有點(diǎn)不對(duì) ,怪我了 ,闊以自己找圖片替代 ,對(duì)應(yīng)修改飛船類和子彈類的文件名就好 ~
  4. 進(jìn)入到代碼的根目錄下
  5. python alien_invasion.py

代碼

alien-invasion.py

  • run_game()定義了主函數(shù) ,首先繪制屏幕 , 對(duì)象 screen 是一個(gè) surface ,在 pygame 中,surface 是屏幕的一部分 ,顯示游戲元素 。每個(gè)元素 ,外星人或者飛船 ,子彈都是一個(gè)surface 。
  • ship = Ship(game_settings,screen)就是一個(gè)對(duì)象是類的實(shí)例的例子 ,arguments 是類初始化需要傳入的參數(shù) ,ship就是Ship類型的對(duì)象 ,可以訪問(wèn)Ship類中的數(shù)據(jù)和方法 。
  • 每個(gè)游戲循環(huán)中 ,更新飛船位置 ,子彈位置 ,子彈編組 ,重新渲染游戲界面 。
  • 子彈編組用來(lái)管理屏幕中的所有子彈 ,其實(shí)用列表來(lái)管理子彈對(duì)象也是可以實(shí)現(xiàn)的 ,但是 pygame 自帶的 Group 已經(jīng)定義了一些函數(shù) ,更加方便 。
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
 pygame.init()
 # 獲取配置
 game_settings = Settings()
 # 繪制屏幕
 screen = pygame.display.set_mode((game_settings.screen_width,game_settings.screen_height))
 backgound_color = (220,230,230)
 pygame.display.set_caption("Alien Invasion")
 # 飛船實(shí)例化
 ship = Ship(game_settings,screen)
 # 子彈編組,管理屏幕中所有的子彈,保存繼承Sprite類的Bullet實(shí)例
 bullets = Group()
 while True:
 # 檢測(cè)飛船事件:左移右移發(fā)射子彈
 gf.check_events(ship,game_settings,screen,bullets) # 修改飛船移動(dòng)標(biāo)志
 ship.update() # 根據(jù)飛船移動(dòng)標(biāo)志重新計(jì)算飛船中心位置
 # 更新所有子彈位置
 gf.update_bullets(bullets)
 # 繪制飛船子彈
 gf.update_screen(game_settings,screen,ship,bullets) 
run_ame()

ship.py類

  • 飛船類中主要涉及類初始化 ,飛船位置更新和渲染飛船surface 。
  • 在初始化中主要定義一些代表飛船屬性的成員變量 ,如圖像 ,飛船矩形外形 ,飛船中心 ,飛船左移標(biāo)志和右移標(biāo)志等 。
  • 涉及 pygame 的圖像load()方法和get_rect()方法 ,主要是為了之后飛船和外星人進(jìn)行碰撞計(jì)算 ,其實(shí)可以直接self.image = pygame.image.load('images/外星飛船.png')加載圖像 ,但是圖像太大 ,就pygame.transform.smoothscale方法修改圖像大小 。
import pygame
class Ship(object):
 """docstring for Ship"""
 def __init__(self, game_settings,screen):
 super(Ship, self).__init__()
 self.game_settings = game_settings
 self.screen = screen # screen游戲界面
 self.image = pygame.image.load('images/外星飛船.png').convert_alpha() # 加載飛船圖像
 # 修改圖像大小
 self.width,self.height = self.image.get_size()
 self.image = pygame.transform.smoothscale(self.image,(self.width//2,self.height//2))
 self.rect = self.image.get_rect()
 self.screen_rect = screen.get_rect()
 # 獲取游戲界面的中心x坐標(biāo)和底部位置便可確定飛船位置
 self.rect.centerx = self.screen_rect.centerx
 self.rect.bottom = self.screen_rect.bottom - game_settings.screen_height / 5
 self.center = float(self.rect.centerx) # centerx中只能表示整數(shù)
 # 移動(dòng)標(biāo)志
 self.moving_right = False
 self.moving_left = False
 ef update(self):
 """
 根據(jù)移動(dòng)標(biāo)志調(diào)整飛船位置
 更改為根據(jù)self.center更新位置
 """
 if self.moving_right and self.rect.right < self.screen_rect.right:
 # self.rect.centerx += 1
 self.center += self.game_settings.ship_speed_factor
 if self.moving_left and self.rect.left > 0:
 # self.rect.centerx -= 1
 self.center -= self.game_settings.ship_speed_factor
 # 更新centerx,因?yàn)槔L制圖形是根據(jù)self.rect()
 # self.rect()定位需要根據(jù)centerx,bottom
 self.rect.centerx = self.center 
 de blitme(self):
 """在self.rect位置繪制圖像"""
 self.screen.blit(self.image,self.rect)

bullet.py

在子彈類中尤為需要說(shuō)明的是該類繼承了Sprite精靈類 ,繼承精靈類中的方法 。

import pygame
from pygame.sprite import Sprite
# 繼承Spite類,完善自己的代碼
class Bullet(Sprite):
 """docstring for Bullet"""
 def __init__(self, game_settings,screen,ship):
 super(Bullet, self).__init__()
 self.screen = screen
 # # 在0,0位置創(chuàng)建bullet,并設(shè)置寬高
 # self.rect = pygame.Rect(0,0,game_settings.bullet_width,game_settings.bullet_height)
 # # 調(diào)整子彈位置到飛船所在位置,調(diào)整top相同,中心x坐標(biāo)相同
 # self.rect.centerx = ship.rect.centerx
 # self.rect.top = ship.rect.top
 # # 將y坐標(biāo)存儲(chǔ)為小數(shù)值,以便能夠微調(diào)子彈的速度
 # self.y = float(self.rect.y)
 # self.color = game_settings.bullet_color
 # self.speed_factor = game_settings.bullet_speed_factor
 # 把子彈換成一個(gè)好玩的圖片,把圖片轉(zhuǎn)換成位圖
 self.image = pygame.image.load('images/生氣.png').convert_alpha()
 # 修改圖像大小
 self.width,self.height = self.image.get_size()
 self.image = pygame.transform.smoothscale(self.image,(self.width//10,self.height//10))
 self.rect = self.image.get_rect()
 # 調(diào)整子彈位置到飛船所在位置,調(diào)整top相同,中心x坐標(biāo)相同
 self.rect.centerx = ship.rect.centerx
 self.rect.top = ship.rect.top
 # 將y坐標(biāo)存儲(chǔ)為小數(shù)值,以便能夠微調(diào)子彈的速度
 self.y = float(self.rect.y)
 self.speed_factor = game_settings.bullet_speed_factor
 def udate(self):
 """向上移動(dòng)子彈"""
 # 更新一次坐標(biāo)y向上移動(dòng)speed_factor個(gè)像素
 self.y -= self.speed_factor
 # 更新子彈的rect位置
 self.rect.y = self.y
 def daw_bullet(self):
 # """
 # API:rect(Surface,color,Rect,width=0)->Rect
 # draw a rectangular shape on the Surgace
 # The width argument is the thickness to draw the outer edge. 
 # If width is zero then the rectangle will be filled.
 # """
 # pygame.draw.rect(self.screen,self.color,self.rect)
 """在self.rect位置繪制圖像"""
 self.screen.blit(self.image,self.rect)

game_functions.py

  • 該文件的作用主要是集成主函數(shù)邏輯函數(shù) ,判斷飛船事件 ,更新子彈編組和更新屏幕
  • fill函數(shù)填充屏幕嚴(yán)肅 ,參數(shù)rgb
  • 需要說(shuō)明的是 bullets 子彈編組需要更新判斷子彈是否超出屏幕 ,以從編組中刪除 ,否則會(huì)影響效率
  • 鼠標(biāo)和鍵盤監(jiān)聽事件pygame.event.get();事件鍵pygame.K_RIGHTpygame.K_LEFT pygame.K_SPACE 事件類型pygame.KEYDOWN pygame.KEYUP
import pygame
import sys
from bullet import Bullet
def check_eydown_events(event,ship,game_settings,screen,bullets):
 """
 按下鍵盤事件:右移,左移,發(fā)射子彈
 """
 if event.key == pygame.K_RIGHT:
 ship.moving_right = True
 elif event.key == pygame.K_LEFT:
 ship.moving_left = True
 elif event.key == pygame.K_SPACE:
 fire_bullet(game_settings,screen,ship,bullets)
def fire_bulet(game_settings,screen,ship,bullets):
 """
 如果沒(méi)有超過(guò)當(dāng)前屏幕顯示的最多子彈數(shù),實(shí)例化子彈,添加到子彈編組中
 """
 if(len(bullets) < game_settings.bullet_allowed):
 bullet = Bullet(game_settings,screen,ship)
 bullets.add(bullet)
def check_keyp_events(event,ship):
 """
 抬起鍵,抬起空格不發(fā)生任何事
 """
 if event.key == pygame.K_RIGHT:
 ship.moving_right = False
 elif event.key == pygame.K_LEFT:
 ship.moving_left = False
def check_evets(ship,game_settings,screen,bullets):
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 sys.exit()
 elif event.type == pygame.KEYDOWN:
 check_keydown_events(event,ship,game_settings,screen,bullets)
 elif evnt.type == pygame.KEYUP:
 check_keyup_events(event,ship)
def update_scren(game_settings,screen,ship,bullets):
 screen.fill(game_settings.background_color)
 ship.blitme()
 """
 API:pygame.sprite.Group.sprites
 sprites() -> sprite_list
 bullet迭代器
 """
 for bullet in bullets.sprites():
 bullet.draw_bullet()
 pygame.display.flip()
def update_bulletbullets):
 bullets.update()
 # 超出屏幕邊界移除子彈
 # 子彈編組副本
 for bullet in bullets.copy():
 if bullet.rect.bottom <= 0:
 bullets.remove(bullet)
 # 注釋掉,調(diào)試用,耗時(shí)
 # print(len(bullets))

settings.py配置文件

將常量變量繼承在配置文件中 ,當(dāng)需要修改常量提高游戲體驗(yàn)時(shí) ,直接修改該文件即可

class Settings(object):
 """docstring for Settings"""
 def __init__(self):
 super(Settings, self).__init__()
 self.screen_width = 1200
 self.screen_height = 800
 self.background_color = (230,230,230)
 self.ship_speed_factor = 1.5 # 飛船一個(gè)while循環(huán)走1.5像素
 # 子彈配置
 self.bullet_width = 3
 self.bullet_height = 15
 self.bullet_color = (120,120,120)
 self.bullet_speed_factor = 3
 self.bullet_allowed = 5 # 最大子彈數(shù)

pygame接口文檔總結(jié)

1. 轉(zhuǎn)發(fā)文章+關(guān)注小編

2. 私信回復(fù)“ Python ”獲取本套游戲源碼+視頻學(xué)習(xí)資料

python能用來(lái)開發(fā)游戲嗎(Python 居然可以實(shí)現(xiàn)這么牛逼的游戲項(xiàng)目?開發(fā)無(wú)壓力)

熱門課程推薦

熱門資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定