20212222《Python程式設計》實驗四 Python綜合實踐實驗報告
課程:《Python程式設計》
班級:2122
姓名: 黃凱琳
學號:20212222
實驗教師:王志強
實驗日期:2022年5月22日
必修/選修: 公選課
1.實驗內容
Python綜合應用:運用pygame嘗試編寫flappy bird程式碼
2. 實驗過程及結果
- 前期準備
剛聽到大作業實驗要求的時候,我也很懵,詢問了曾經選過python課程的學長,決定製作flappy bird遊戲。
- 實驗過程
在網上搜索了一些教學視訊與教學部落格,flappy bird這款遊戲的教程很多,對新手很友好,最後選擇跟視訊一起編寫程式碼並執行,其中也有一些小問題。
(1) 下載pygame
這裡我已經下載過,只做一下示意,第一步在cmd中進行下載
第二步 在pycharm中再次下載
在這裡匯入pygame模組
在這裡我已經下載pygame
(2) 編寫程式碼
import pygame
import sys
import random
class Bird(object):
"""定義一個鳥類"""
def __init__(self):
"""定義初始化方法"""
self.birdRect = pygame.Rect(65, 50, 50, 50) # 鳥的矩形
# 定義鳥的3種狀態列表
self.birdStatus = [pygame.image.load("assets/1.png"),
pygame.image.load("assets/2.png"),
pygame.image.load("assets/dead.png")]
self.status = 0 # 預設飛行狀態
self.birdX = 120 # 鳥所在X軸座標,即是向右飛行的速度
self.birdY = 350 # 鳥所在
self.jump = False # 預設情況小鳥自動降落
self.jumpSpeed = 10 # 跳躍高度
self.gravity = 5 # 重力
self.dead = False # 預設小鳥生命狀態為活著
def birdUpdate(self):
if self.jump:
# 小鳥跳躍
self.jumpSpeed -= 1 # 速度遞減,上升越來越慢
self.birdY -= self.jumpSpeed # 鳥Y軸座標減小,小鳥上升
else:
# 小鳥墜落
self.gravity += 0.1 # 重力遞增,下降越來越快
self.birdY += self.gravity # 鳥Y軸座標增加,小鳥下降
self.birdRect[1] = self.birdY # 更改Y軸位置
class Pipeline(object):
"""定義一個管道類"""
def __init__(self):
"""定義初始化方法"""
self.wallx = 400 # 管道所在X軸座標
self.pineUp = pygame.image.load("assets/top.png")
self.pineDown = pygame.image.load("assets/bottom.png")
def updatePipeline(self):
""""管道移動方法"""
self.wallx -= 5 # 管道X軸座標遞減,即管道向左移動
# 當管道執行到一定位置,即小鳥飛越管道,分數加1,並且重置管道
if self.wallx < -80:
global score
score += 1
self.wallx = 400
def createMap():
"""定義建立地圖的方法"""
screen.fill((255, 255, 255)) # 填充顏色
screen.blit(background, (0, 0)) # 填入到背景
import pygame
import sys
import time
class Bird(object):
# 定義小鳥
def __init__(self):
# 定義初始化方法
self.birdRect = pygame.Rect(65, 50, 50, 50)
self.birdStatus = [pygame.image.load(r'picture/1.png'),
pygame.image.load(r'picture/2.png'),
pygame.image.load(r'picture/dead.png')]
self.status = 0
self.birdx = 120
self.birdy = 350
self.jump = False
self.jumpSpeed = 10
self.gravity = 5
self.dead = False
def birdUpdate(self):
# 定義移動方法
if self.jump:
self.jumpSpeed -= 1
self.birdy -= self.jumpSpeed
else:
self.gravity += 0.2
self.birdy += self.gravity
self.birdRect[1] = self.birdy
class Pipeline(object):
# 定義管道類
def __init__(self):
self.wallx = 400
self.pineUp = pygame.image.load(r'picture/top.png')
self.pineDown = pygame.image.load(r'picture/bottom.png')
def updatePipeline(self):
# 定義移動方法
self.wallx -= 5
if self.wallx < -80:
global score
score += 1
self.wallx = 400
def createMap():
screen.blit(background, (0, 0))
# 顯示管道
screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300))
screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500))
Pipeline.updatePipeline()
# 顯示小鳥
if Bird.dead:
Bird.status = 2
elif Bird.jump:
Bird.status = 1
screen.blit(Bird.birdStatus[Bird.status], (Bird.birdx, Bird.birdy))
Bird.birdUpdate() # 更新小鳥狀態
font.render('Score' + str(score), -1, (255, 255, 255))
screen.blit(font.render('Score' + str(score), -1, (255, 255, 255)), (100, 50))
pygame.display.update()
def checkDead():
upRect = pygame.Rect(Pipeline.wallx, -300, Pipeline.pineUp.get_width(), Pipeline.pineUp.get_height())
downRect = pygame.Rect(Pipeline.wallx, 500, Pipeline.pineDown.get_width(), Pipeline.pineDown.get_height())
# 檢測矩形碰撞
if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
Bird.dead = True
# 邊界檢測
else:
if 0 < Bird.birdRect[1] < height:
Bird.dead = False
return True
else:
return False
def getResult():
# 獲取總分
final_text1 = "Game Over"
final_text2 = "Your Score:" + str(score)
ft1_font = pygame.font.SysFont("Arial", 70)
ft1_surf = font.render(final_text1, 1, (242, 3, 36))
ft2_font = pygame.font.SysFont("Arial", 50)
ft2_surf = font.render(final_text2, 1, (253, 177, 6))
screenwidth = int(screen.get_width() / 2)
surf1 = int(ft1_surf.get_width() / 2)
surf2 = int(ft2_surf.get_width() / 2)
screen.blit(ft1_surf, [screenwidth - surf1, 100])
screen.blit(ft2_surf, [screenwidth - surf2, 200])
pygame.display.update()
if __name__ == '__main__':
pygame.init()
pygame.font.init() # 初始化字型類
font = pygame.font.SysFont(None, 50)
size = width, height = 400, 650
screen = pygame.display.set_mode(size) # 設定視窗
clock = pygame.time.Clock() # 設定時鐘
color = (255, 255, 255)
Bird = Bird() # 例項小鳥類
Pipeline = Pipeline()
score = 0
while True:
clock.tick(60) # 每秒執行60次
# 輪詢事件監測
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN or pygame.MOUSEBUTTONDOWN and not Bird.dead:
Bird.jump = True
Bird.gravity = 5
Bird.jumpSpeed = 10
# screen.fill(color)
background = pygame.image.load(r'picture/background.png')
if checkDead():
pass
else:
createMap()
getResult()
time.sleep(2)
createMap() # 生成地圖
pygame.quit()
以上是本次實驗的程式碼
l 問題:
這一部分一直在報錯,不能正常執行。
原因是我從網上找到並儲存遊戲所需圖片時沒有把圖片的名稱和路徑都設定為參考程式碼裡相同,所以執行時找不到它
(3) 連線雲伺服器 上傳程式碼
關於這個操作,我完全把c語言的華為雲實驗方法應用過來了,但c語言與python的執行還是有差別,所以也查閱了很多資料
l 首先,開啟雲伺服器,在putty上登入
l 上傳程式碼到ECS主機
l 在putty上執行它!
參考了這篇文章
下面是遊戲成功執行圖片(視訊提交給課代表)
3、主要問題
- 編寫程式碼問題已經在第二部分呈現,
- 編寫程式碼很難,有很多不懂的語句,報錯了需要不斷查資料改正
-
執行程式碼時有錯,因為檔案地址與視訊博主不同,最後更正
- 用雲伺服器做實驗,參考c語言執行方法,但是python又不同,有搜尋方法
- pygame找不到螢幕 解決方法:安裝xming
## 課堂總結
在大一下學期選擇了python選修課,其實是一個很大的挑戰,因為在此之前沒有接觸過程式設計,同時還要學習另一種語言c語言,所以壓力比較大。但是我還是有在認真聽課,雖然那些知識點對我來說難度很高。還記得第一次做實驗報告的時候,完完全全不懂該怎麼寫,需要使用的網站,軟體都沒有接觸過,因為託管程式碼到碼雲真的抱著電腦研究了整整一個週末,但最後也堅持做好了所有作業,並且也學到很多知識。王老師講課風格也很輕鬆,要點清楚明瞭。在python課程的學習過程中,還熟悉了有關程式設計能力學習的其他方面,懂得了遇到問題是常態,不斷搜尋學習才是解決問題的關鍵,在日後的計算機能力學習中,一定會更加順利。
最後,王志強老師真的是個很好的老師,會在課上花費主要時間來講課,而不是什麼都不講直接寫程式碼。
我的一點小建議是,老師可以放慢一點講課速度,多講一些常用的語句,過難且少用的知識可以略講,因為學校沒有開設python必修課,大家對python的瞭解都是比較淺薄的,尤其是大一無基礎的孩子們,真的會覺得難度大,不太跟得上,希望志強老師可以把python課上得越來越好!!