python編的游戲越玩越卡_用Python寫游戲,不到十分鐘就學會了

安裝pygame

本人電腦是windows 10、python3.6,pygame下載地址:pypi.python.org/pypi/Pygame…

請自行下載對應python版本的pygame

運行以下命令

創建Pygame窗口及響應用戶輸入

新建一個文件夾alien_invasion,并在文件夾中新建alien_invasion.py文件,輸入如下代碼。

運行上述代碼,我們可以得到一個灰色界面的窗口:

創建設置類

為了在寫游戲的過程中能便捷地創建一些新功能,下面額外編寫一個settings模塊,其中包含一個Settings類,用于將所有設置存儲在一個地方。

這樣在以后項目增大時修改游戲的外觀就更加容易。

我們首先將alien_invasion.py中的顯示屏大小及顯示屏顏色進行修改。

首先在alien_invasion文件夾下新建python文件settings.py,并向其中添加如下代碼:

然后再alien_invasion.py中導入Settings類,并使用相關設置,修改如下:

添加飛船圖像

接下來,我們需要將飛船加入游戲中。為了在屏幕上繪制玩家的飛船,我們將加載一幅圖像,再使用Pygame()方法blit()繪制它。

在游戲中幾乎可以使用各種類型的圖像文件,但是使用位圖(.bmp)文件最為簡單,這是因為Pygame默認加載位圖。

雖然其他類型的圖像也能加載,但是需要安裝額外的庫。

我們推薦去免費的圖片素材網站上去找圖像:pixabay.com/

我們在主項目文件夾(alien_invasion)中新建一個文件夾叫images,將如下bmp圖片放入其中。

接下來,我們創建飛船類ship.py:

重構:模塊game_functions

在大型項目中,經常需要在添加新代碼前重構既有代碼。重構的目的是為了簡化代碼的結構,使其更加容易擴展。

我們將實現一個game_functions模塊,它將存儲大量讓游戲Alien invasion運行的函數。通過創建模塊game_functions,可避免alien_invasion.py太長,使其邏輯更容易理解。

函數check_events()

首先我們將管理事件的代碼移到一個名為check_events()的函數中,目的是為了隔離事件循環

然后我們修改alien_invasion.py代碼,導入game_functions模塊,并將事件循環替換成對函數check_events()的調用:

函數update_screen()

將更新屏幕的代碼移到一個名為update_screen()函數中,并將這個函數放在模塊game_functions中:

其中alien_invasion修改如下:

從上面一套流程走下來,我們發現:在實際的開發過程中,我們一開始將代碼編寫得盡可能的簡單,并在項目越來越復雜時進行重構。接下來我們開始處理游戲的動態方面。

駕駛飛船

這里我們要實現的就是使玩家通過左右箭頭鍵來控制飛船的左移與右移。

響應按鍵

因為在pygame中,每次按鍵都被注冊為KEYDOWN事件,在check_events()中,我們通過event.type檢測到KEYDOWN事件后還需進一步判斷是哪個按鍵。代碼如下:

允許不斷移動

玩家按住右箭頭不動時,我們希望飛船能不斷地移動,直到玩家松開為止。這里我們通過KETUO事件來判斷。因此我們設置一個標志位moving_right來實現持續移動。原理如下:

飛船不動時,標志moving_right將為false。玩家按下右箭頭時,我們將這個標志設置為True;玩家松開時,我們將標志重新設置成False。

這個移動屬性是飛船屬性的一種,我們用ship類來控制,因此我們給這個類增加一個屬性名稱叫,moving_right以及一個update()方法來檢測標志moving_right的狀態。

ship

game_functions

最后在alien_invasion中調用update()方法

左右移動

前面我們實現了向右移動,接下來實現向左移動,邏輯類似,代碼就不貼了。

調整飛船的速度

當前,每次執行while循環時,飛船最多移動一個像素,我們可以在Settings中添加ship_speed_factor,用于控制飛船的速度。我們將根據這個屬性決定飛船每次循環時最多移動多少距離。

Settings:

Ship:

限制飛船的活動范圍

如果玩家按住箭頭的時間過長,飛船就會消失,那么如何使飛船抵達屏幕邊緣時停止移動?這里我們只需要修改Ship類中的update方法,增加一個邏輯判斷。

重構

這里我們主要講check_events()函數進行重構,將其中部分代碼分成兩部分,一部分處理KEYDOWN事件,一部分處理KEYUP事件。

game_functions:

射擊

接下來添加射擊功能,使玩家按空格鍵時發射子彈,子彈將在屏幕中向上穿行,抵達屏幕后消失。

添加子彈設置

在Settings類中增加一些子彈的屬性,這里我們創建一個寬3像素,高15像素的深灰色子彈。子彈的速度比飛船稍低。

創建Bullet類

將子彈存儲到group中

前面定義了Bullet類和必要的設置后,就可以編寫代碼了,在玩家每次按空格鍵時都會發射一發子彈。

首先,我們在alien_invasion中創建一個group,用于存儲所有的有效子彈。

開火

這里我們修改check_keydown_events()函數,來監聽玩家按下空格鍵的事件。這里還需要修改update_screen()函數,確保屏幕每次更新時,都能重繪每一個子彈。

我們來看下效果:

刪除消失的子彈

在alien_invasion中刪除消失的子彈。

限制子彈數量

為了鼓勵玩家有目標的射擊,我們規定屏幕上只能同時存在3顆子彈,我們只需要在每次創建子彈前檢查未消失的子彈數目是否小于3即可。

創建update_bullets()函數

為了使alien_invasion中代碼更加簡單,我們將檢查子彈管理的代碼,移到game_functions模塊中:

創建fire_bullet()函數

這里我們將發射子彈的代碼移到一個獨立的函數中:

添加外星人,并檢測碰撞

在我們完成新的任務之前,我們先給游戲添加一個結束游戲的快捷鍵Q:

創建第一個外星人

這里和創建飛船的方法一樣

創建一群外星人

這里我們首先確定一行能容納多少個外星人以及要繪制幾行。這里改動代碼較多,直接看效果:

其實做為一個開發者,有一個學習的氛圍跟一個交流圈子是一個特別重要的事情,這里我創建了一個python交流群12546470,不管你是小白還是大牛歡迎入駐,大家一起交流成長。

移動外星人

前面我們創建的是靜態的外星人,現在我們需要讓外星人動起來。這里我們在Settings類中設置外星人移動的速度,然后通過Alien類中的update的方法來實現移動

射殺外星人

要想射殺外星人,就必須先檢測兩個編組成員之間是否發生碰撞,在游戲中,碰撞就是游戲元素重疊在一起。

這里我們使用sprite.groupcollide()來檢測兩個編組的成員之間的碰撞。

子彈擊中外星人時,需要立馬知道,并同時使被碰撞的外星人立即消失,因此我們需要在更新子彈的位置后立即檢測碰撞。

結束游戲

這里我們還需要知道何時該結束游戲,有以下幾種情況:

飛船全部被摧毀

外星人到達屏幕底部

實際效果:

計分

最后我們將給游戲添加一個Play按鈕,用于根據需要啟動游戲以及在游戲結束后重啟游戲。

我們還將實現一個計分系統,能夠在玩家等級提高時加快節奏。

添加Play按鈕

這里可以先將游戲初始化為非活動狀態,當我們點擊了按鈕,就開始游戲。

由于Pygame中沒有內置的創建按鈕的方法。因此我們可以通過創建一個Button類來創建一個自帶標簽的實心矩形。

我們通過檢測鼠標發生點擊后的坐標是否與我們繪制的按鈕發生碰撞與否來判斷是否發生了點擊事件。

提高等級

為了使玩家將敵人消滅干凈后能夠提高游戲難度,增加趣味性,這里我們可以在Settings類中進行修改,增加靜態初始值,和動態初始值。

記分、等級、剩余飛船

打包成exe可執行文件

上面游戲開發完了,那么你需要將其轉成文exe的可執行文件。我們采用pyinstaller,安裝步驟參考:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Map Reduce和流處理

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~本文由從流域到海域翻譯,發表于騰訊云社區map()和reduce()是在集群式設備上用來做大規模數據處理的方法,用戶定義一個特定的映射,函數將使用該映射對一系列鍵值對進行處理…

Flume實戰監聽網絡端口

具體的配置解釋見官網 http://flume.apache.org/FlumeUserGuide.html#flume-sources 1、flume安裝目錄下新建文件夾 example 2、在example下新建文件 netcat-logger.conf內容如下:#name the components on this agent a1.sources r1 a1.sinks k1 a1.channels…

滑動關機代碼bat_BAT面試算法進階--(2) 無重復字符的最長子串(滑動法優化+ASCII碼法)...

一.算法題題目Given a string, find the length of the longest substring without repeating characters.ExampleGiven "abcabcbb", the answer is "abc", which the length is 3.Given "bbbbb", the answer is "b", with the length…

jpa findone怎么用_Jpa VS MyBatis,你用哪個?

經常看到有小伙伴在討論 JPA 和 MyBatis 這兩個孰優孰劣的問題,其實松哥覺得這是一個偽命題,沒必要為這種問題爭個面紅耳赤,每種框架有它存在的道理,也有各自擅長的事情,今天松哥就和大家來聊聊這兩個框架,…

國家開放大學本科計算機應用基礎,【(精華版)最新國家開放大學電大本科《計算機應用基礎》網絡課網考形考作業一及三試題答案】.docx...

【(精華版)最新國家開放大學電大本科《計算機應用基礎》網絡課網考形考作業一及三試題答案】(精華版)最新國家開放大學電大本科《計算機應用基礎》網絡課網考形考作業一及三試題答案 盜傳必究 形考作業一 一、單選題 1當前的計算機一般被認為是第四代計算機,它所采用…

Reset Password 重置密碼 (CentOS 5,6,7 ; Juniper Networks: SRX100 )

一些重置root 密碼的文檔分享(來自官網): CentOS 5,6,7 Juniper Networks : SRX100 鏈接:https://share.weiyun.com/5BM4kwK 密碼:f3t5xu轉載于:https://www.cnblogs.com/ling3blog/p/905018…

python正則表達式中的轉義字符_python 正則表達式之轉義字符

最近在整理python相關的知識,使用python對網站進行爬取數據的時候,需要使用到轉義字符,之前對轉義字符理解一直比較模糊,并且在python中還有一個叫原生字符r。所以通過網上調查資料對該內容進行整理,已備不時之需。 字…

計算機控制系統a卷-答案,計算機控制系統2010-2011年試題A答案

濟南大學2010 ~2011學年第一學期課程考試試卷(A卷)4、振鈴現象:(雖然閉環系統輸出較快地趨向于穩態值)……課 程 計算機過程控制系統 授課教師 王小平 數字調節器輸出u(kT)以2T為周期上下擺動。………考試時間 2010年 12 月 30日 考試班級 … ……學 號 …

非root用戶ssh 執行 sudo遠程機器免密鑰

非root用戶ssh 執行 sudo遠程機器免密鑰 # 1、登陸192.168.1.10 ssh-keygen -t rsa # 一路回車 # 將公鑰添加到認證文件中 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 并設置authorized_keys的訪問權限 chmod 600 ~/.ssh/authorized_keys [rootwebserver ~]# c…

分數的拆分原理和方法_常見的節稅原理你知道嗎?

節稅可以幫助大家合理的降低稅收支出,然后實現企業以及利益的最大化。但是節稅的時候一般都會使用一些節稅原理,因為不同的結節稅原理會有不同的節稅方法,這樣節稅效果也是不同的,那么生活中有哪些常見的節稅原理呢?第…

Flume實戰監聽文件夾內文件變化

Flume官網有多種場景的source,sink,channel的配置 1、flume安裝目錄下新建文件夾 example 2、在example下新建文件 spooldir-logger.conf內容如下: a1.sources r1 a1.sinks k1 a1.channels c1# Describe/configure the source a1.source…

python如何獲取輸入_python如何從鍵盤獲取輸入實例

python中使用input()函數來獲取用戶輸入 函數 input() 讓程序暫停運行,等待用戶輸入一些文本,獲取用戶的輸入后,Python將其存儲到一個變量中,以方便后期使用。 name input("Tell me your name,and I will repeat it back to…

cad打印本計算機未配置,CAD打印的基本設置詳細教程

CAD打印的基本設置詳細教程開始畫圖之前我們就考慮到打印的需要,要用多大紙張,打印比例應該設置成多少,打印后的字高、線寬、顏色應該設置成多少,在繪制圖形的時候,這些為打印而做的準備工作必須做好。要想正確地打印圖…

原 BinaryWriter和BinaryReader(二進制文件的讀寫)

原文 BinaryWriter和BinaryReader(二進制文件的讀寫) C#的FileStream類提供了最原始的字節級上的文件讀寫功能,但我們習慣于對字符串操作,于是StreamWriter和 StreamReader類增強了FileStream,它讓我們在字符串級別上操…

python redis 消息隊列_Python的Flask框架應用調用Redis隊列數據的方法

任務異步化打開瀏覽器,輸入地址,按下回車,打開了頁面。于是一個HTTP請求(request)就由客戶端發送到服務器,服務器處理請求,返回響應(response)內容。 我們每天都在瀏覽網…

go ip過濾_用Go實現自己的爬蟲

作者:Masamune在日常生活中,我們時常會遇到一些采集數據相關的需求,比如獲取一些官方數據整理到excel表中進行統計,聚合一些網頁新聞提高自己的閱讀效率等等。雖然許多爬蟲教程都是用python寫的,但是我認為Go語言是比p…

Flume實戰采集文件內容存入HDFS

1、flume安裝目錄下新建文件夾 example 2、在example下新建文件 log-hdfs.conf 內容如下: # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1#exec 指的是命令 # Describe/configure the source a1.sources.r1.type exec #F…

總結計算機語言的基本元素,認識程序設計中基本元素教案.doc

曲靖師院計算機科學與工程學院學生試講教案表課題:認識程序中的基本元素 年級:高一 課時:1課時授課時間:20分鐘 講授者:秦巧林 指導教師:崔麗梅教學目標知識與技能1. 掌握計算機程序中常用的常量、變量、函…

python海龜繪圖圓形_python之海龜繪圖

1. 基本功能介紹 在海龜作圖中,我們可以編寫指令讓一個虛擬的(想象中的)海龜在屏幕上來回移動。這個海龜帶著一只鋼筆,我們可以讓海龜無論移動到哪都使用這只鋼筆來繪制線條。通過編寫代碼,以各種很酷的模式移動海龜&a…

PLSQL Developer導入csv文件到oracle

csv文件內容: 要導入的表結構 create table RPT_MONILUCE_2_P01 ( imsi NUMBER, road_line NUMBER, ci NUMBER, diff NUMBER, rn NUMBER, sdate DATE, report_id NUMBER(20) ) 步驟: 1、在csv第一行上增加…