課程設計教學目的:
本課程設計是本專業的一門重要實踐性教學環節。在學習了專業基礎課和《Python程序設計》課程的基礎上,本課程設計旨在加深對Python程序設計的認識,對Python語言及其語言生態有一個進一步的掌握和應用,學會運用Python標准庫及外接相關庫來解決實際問題的基本能力,培養和提高學生分析問題、解決問題的能力,尤其是提高學生使用Python為開發語言來進行問題描述、交流與思考的能力,為畢業設計和以後的工程實踐打下良好的基礎。
本課程設計具體目的:
為全面了解Python技術歷史、現狀與發展趨勢的基礎上,系統掌握Python基本概念、編程思想以及程序設計技術,具備熟練的Python編程技能和面向對象軟件設計技術思想。
通過總體框架到頁面設計再到代碼實現,了解Python設計的一般步驟,並熟練掌握Python的設計思想。
本課題主要訓練邏輯思維和Python語法,對代碼編寫由大到小,由總體到模塊,掌握其基本邏輯,對以後的設計可以做到舉一反三,進而形成邏輯思維。
課程設計教學任務和要求:
本課程設計主要任務是以Python為開發語言完成一個100~300行左右規模的程序項目開發。設計參考題目見附件1。
課程設計的基本要求是:在課程設計的各個階段嚴格、規范地完成相關的文檔,例如總體方案報告,詳細設計報告、功能說明、數據結構說明、算法說明、程序設計框圖、圖例和源程序等。要求所寫文檔結構合理、內容完整、敘述清晰。程序源碼要有詳細注釋,可讀性好。更高要求是:有創意、系統界面美觀。
本課程設計具體任務和要求:
我負責游戲邏輯的實現。
Vel_y是游戲中魚下落的速度,游戲中每當接到了炸彈,貓的表情會變成哭臉,同時生命值減一,遺漏魚時,生命值也會減一,當生命值為0時,游戲結束。
游戲的啟動頁面:
游戲的運行界面:
當Round>2時,會插入炸彈:
圖3 炸彈界面
良好
總體上來說,游戲的運行基本滿足了當初設計時的構想,滿足了設計要求。
游戲具體邏輯的實現:
pygame事件可以處理游戲中的各種事情,pygame中的事件處理是放在一個實時的循環中來完成的。將代碼都放在一個while True的循環中,但是這樣會造成死循環,所以在裡面加一句sys.exit()來退出。
for event in pygame.event.get()
上面的代碼將會創建當前等待處理的事件的一個列表,然後使用for循環來遍歷裡面的事件。這樣,我們將會根據事件產生的順序依次地進行不同的操作。常見的事件是按鍵按下,按鍵釋放以及鼠標移動。通常需要最先處理QUIT事件(在用戶關閉窗口的時候會產生該事件。)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame支持一些鼠標事件,他們包括:
MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN.
在MOUSEMOTION中包含了一些屬性:event.pos,event.rel,event.buttons
Elif event.type == MOUSEMOTION:
mouse_x,mouse_y = event.pos
move_x,move_y = event.rel
MOUSEBUTTONUP裡面的屬性:
elif event.type == MOUSEBUTTONUP:
if game_over:
game_over = False
lives = 10
score = 0
Round =1
vel_y=0.4
mine=0
flag=0
pic=cat
bomb_y = -50
在pygame中,使用pygame.key.get_pressed()來輪詢鍵盤接口。這個方法會返回布爾值的一個列表,其中每個鍵一個標志。使用鍵常量值來匹配按鍵,這樣的好處就是不必遍歷事件系統就可以檢測多個鍵的按下。
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
sys.exit()
if game_over:
screen.blit(init,(60, 60))
print_text(font3, 200, 400,"Clicked To Play!")
print_text(font2, 310, 480,"[email protected] developed by xiaoxiami")
圖4 游戲結束頁面
else:
#Round setting
if score >300 and score <600:
Round=2
elif score >600 and score <900:
Round =3
elif score >900 and score <1200:
Round=4
elif score >1200 and score <1500:
Round =5
elif score >=1500:
Round =6
#draw the Round
print_text(font1, 280, 0, "Round: " + str(Round))
#speed setting
if Round ==1:
vel_y=0.4
elif Round ==2:
vel_y=0.6
elif Round ==3:
vel_y=0.8
elif Round ==4:
vel_y=1.0
elif Round ==5:
vel_y=1.2
如果錯過魚的話,就重置魚的位置,給它一個隨機的x值,然後生命值減一:
if bomb_y > 500:
bomb_x = random.randint(0, 500)
bomb_y = -50
lives -= 1
if lives == 0:
game_over = True
簡單碰撞檢測函數,查看是否接住魚:
elif bomb_y > pos_y:
if bomb_x > pos_x-10 and bomb_x < pos_x + 70:
score += 10
bomb_x = random.randint(0, 500)
bomb_y = -50
同理炸彈的檢測和這個是類似的:
if mine_y > 500:
mine_x = random.randint(0, 500)
mine_y = -50
為了控制貓的坐標不超出屏幕范圍,加入了以下代碼:
pos_x = mouse_x
if pos_x < 0:
pos_x = 0
elif pos_x > 510:
pos_x = 500
貓在接到炸彈。或者生命值小於5的時候,會變成哭臉,因此我們還需要加載一張哭臉的位圖,然後在程序中添加一些相應的邏輯代碼:
加載貓的哭臉位圖:
cat2=pygame.image.load("aodamiao_3.png")
當接到炸彈的時候,貓變成哭臉:
elif mine_y > pos_y:
if mine_x > pos_x and mine_x < pos_x + 40:
mine_x = random.randint(0, 500)
mine_y = -50
lives-=1
pic=cat2
if lives == 0:
game_over = True
當貓的生命值小於5時,貓變成哭臉:
if lives<5:
pic=cat2
try...except...finally...
用於判斷貓的位置是否超出了游戲窗口:
try:
print("開始執行try...")
mouse_x>0
mouse_x<510
except ZeroDivisionError as e:
print(“貓超出范圍”)
finally:
print("執行finally...")
print("END...")
通過print 輸出可能出錯的變量,可以通過錯誤信息和print 輸出的內容來進行修改bug,print在測試完成後還需要刪除
pdb
啟動Python的單步調試器pdb,程序一行行執行。可以采用pdb.set_trace()在代碼中設置斷點