摘 要
作為早期最經典游戲之一的飛機大戰,它是一種傳統的電腦游戲,經常出現在便攜式終端、手機和計算機中。可是,傳統的飛行游戲是一個二次元平面上的,用黑白制作的居多。然而,隨著計算機網絡的飛速發展,在電腦上可以看到多種顏色的飛機大戰。
Python是一種目前廣泛使用的語言,非常受使用者們的歡迎,因其自身的優越性很快就得到了迅速的發展。這對C++,java等今年來流行的語言造成了很強的影響。擁有良好的通用性,作業迅速,良好的跨平臺和穩性是Python技術的優點,目前,像個人電腦、數據操作、電腦和手機游戲后臺、手機移動端和計算機應用的很多方面都在使用Python作為開發語言,技術穩定成熟,縮短開發時間,重復性好,在線擴展方便。
本游戲是一個基于面向對象編程思想,選用Python開發語言,Pycharm為開發工具,而實現于PC端的一款飛機大戰游戲。該游戲操作靈活簡單,趣味性較強,玩家可以通過鍵盤進行游戲操作,通過移動躲避敵方飛機子彈,并發射子彈消滅敵方飛機,從而獲取積分。游戲主要涉及了實現飛機移動、發射子彈、多條生命、碰撞檢測、敵方飛機血量檢測、事件監聽、發放補給包,刷新游戲畫面及音樂,記錄游戲分數和使用者的信息,使游戲界面更多樣化,展現出游戲的整體的開發創新流程和設計想法。
關鍵詞:飛機大戰;電腦游戲;Python;
Design and Implementation of Aircraft Battle System Based on Python
Abstract
As one of the most classic games in the early days of Aircraft Warfare, it is a traditional computer game, often appearing in portable terminals, mobile phones and computers. However, the traditional flight game is a quadratic plane, mostly made in black and white. However, with the rapid development of computer network, we can see many kinds of color fights on the computer.
Python is a widely used language, which is very popular with users. Because of its own advantages, it has been rapidly developed. This has a strong impact on C++, Java and other popular languages this year. Python technology has the advantages of good versatility, rapid operation, good cross-platform and stability. At present, Python is used as the development language in many aspects, such as personal computers, data manipulation, computer and mobile game backstage, mobile phones and computer applications. The technology is stable and mature, shortens the development time, has good repeatability, and is easy to expand online.
This game is based on the idea of object-oriented programming, using Python development language, Pycharm as a development tool, and implemented on the PC side of an aircraft war game. The game is flexible, simple and interesting. Players can operate the game by keyboard, evade enemy aircraft bullets by moving, and shoot bullets to kill enemy aircraft, so as to obtain points. The game mainly involves the realization of aircraft movement, launching bullets, multiple lives, collision detection, enemy aircraft blood volume detection, event monitoring, distribution of supply packages, refreshing game pictures and music, recording game scores and user information, making the game interface more diversified, showing the overall development and innovation process and design ideas of the game.
Key Words: aircraft war; game; Python;
目 錄
摘 要 3
Abstract 4
第一章 緒論 5
1.1 項目背景及意義 5
1.2 國內外研究現狀 6
1.3 項目主要工作 7
1.4 本文組織結構 9
第二章 開發平臺與開發技術 10
2.1 開發平臺 10
2.1.1 系統開發環境介紹 10
2.1.2 數據庫系統介紹 10
2.1.3 開發工具介紹 10
2.2 開發技術 12
2.2.1 Python語言簡介 12
2.2.2 Pygame模塊簡介 13
2.2.3 Tkinter模塊簡介 13
2.2.4腳本系統架構設計 13
第三章 飛機大戰游戲模塊設計 15
3.1 需求分析 15
3.2 可行性分析 16
3.3 總體設計原則 17
3.4數據庫設計 18
3.5系統流程圖 19
3.6 系統模塊設計 20
3.6.1 主界面選項卡功能 20
3.6.2 游戲難度的調整 21
3.6.3 游戲界面繪畫功能 21
3.6.4 游戲控制功能 22
3.6.5 結束游戲功能 22
3.7 游戲難點分析 22
第四章 主要功能具體實現 24
4.1 主界面選項卡實現 24
4.1.1主界面的實現 24
4.1.2注冊功能實現 25
4.1.3登錄功能實現 25
4.1.4試玩功能實現 26
4.1.5積分榜實現 26
4.1.6游戲設置實現 27
4.2 游戲功能實現 28
4.2.1游戲界面繪制 28
4.2.2鍵盤及鼠標控制實現 29
4.2.3飛機移動實現 30
4.2.4發射子彈模塊實現 31
4.2.5擊中爆炸實現 31
4.2.6展示血量和繪制血條 32
4.2.7積分模塊實現 33
第五章 系統測試 35
5.1 測試的定義及其重要性 35
5.1.1 測試的定義 35
5.1.2 測試的重要性 35
5.2 測試方法及過程 36
5.3 測試結果 36
5.3.1評價 36
5.3.2 BUG修復進度 37
第六章 總結與展望 38
參考文獻 39
第一章 緒論
1.1 項目背景及意義
隨著社會經濟實力的迅速發展,人們的就業壓力越來越大。長期的暴力和忙碌的工作壓力使人們感到緊張。為了緩解緊張工作帶來的壓力,我們應該勞逸結合,采用適當的休閑娛樂方式放松自己。有很多方法可以減輕壓力。玩游戲為自己選擇正確的方式也是緩解壓力的許多方法之一。看電影、電視和音樂也可以緩解壓力,但人們可以被動地聽,而不參與互動。而游戲有很好的互動性,玩家既要綜合看角色如何移動,又要在角色中工作。在游戲中,玩家的行為也會影響游戲。除了有趣的人,游戲還可以用來緩解壓力。當你休息的時候,你不必考慮任何事情,壓力也會降低。
隨著個人電腦的普及,游戲并沒有被廣泛接受。主要原因是不能充分發揮計算機的性能。游戲程序不能最大限度地利用PC機的硬件資源,而機器與人之間的交互作用還不夠。因此,由于圖形化、剛性操作和低性能,PC游戲不被接受。然而在計算機硬件的迅猛發展的前提下,同時伴有C、C++、Java、Python等高級語言不斷涌現,這一問題已經被解決,游戲質量得到大幅度提升。比如從暴雪1998年發布的星際爭霸,世界魔獸爭霸,再到今天的英雄聯盟等,帶給所有玩家一個偉大的樂趣和一個良好的游戲體驗。當然,除了游戲本身的卓越品質外,它還可以支持廣泛的硬件設備和操作系統功能,不容忽視,高、中、低端的電腦都有很好的流暢性。
自網絡游戲發展以來,市場競爭十分激烈,為了迎合市場的需求,這就促使開發者快速有效地響應玩家的需求,做到更好,以爭取網絡游戲市場的一席之地。在傳統的游戲開發中,C/C++技術得到了廣泛的應用。雖然C/C++具有明顯的優勢性和來發優勢,但很多時候我們并不關心程序的效率,而關注程序開發效率、維護效率、跨平臺性等。
Python堅持清晰劃一的編碼風格,可讀性較好,相較于其他語言更易維護[1]。此外,Python還是免費開源的,具有極其豐富與強大的類庫,支持代碼熱更新。綜合時間及需求考慮,構建基于飛機戰爭的系統使用Python來開發是非常合適且具有意義的。
1.2 國內外研究現狀
Python因風格簡潔、可讀性較好深受編程人員的喜愛,并得到了廣泛運用[1]。對于游戲開發來說開發過程中會遇到各種各樣的問題,所以在編寫程序和運行代碼的過程中,關于設計的邏輯和設計過程,都是一個不斷發現問題、解決問題的過程,不斷完善以達到預期的功能才是我們希望看到的。Python語言具有其他語言所沒有的特性,可以使用它進行開發游戲系統。
Python的多樣性,意味著可以橫跨多個領域,絕不僅限于Web開發、桌面程序、移動應用,甚至包含硬件開發等。所以并沒有被束縛在單一的平臺之上,Python具有良好的可移植性,在游戲開發上使用Python可以大大方便項目的開發和維護。
由上面論述可知,通過Pygame工具的應用,可以簡化項目的開發,Pygame使開發者不必過多的在意一些瑣碎的問題,因為這些問題Pygame工具會幫我們解決,這讓開發者擁有更多的時間和精力放在游戲的關鍵部分,給開發者帶來了相當大的便利。最關鍵的是,Pygame擁有跨平臺的特性,這使得基于它開發的項目可以自由的在各個操作系統上運行,這省去了很多繁瑣的修改。隨著Pygame開發工具的流行,該工具以其獨特的優越性,越來越多的被應用于各種游戲的開發。下面是具體的開發路線:
圖1- 1 游戲主循環
1.3 項目主要工作
飛機大戰系統主要包含以下兩個模塊:
主頁面功能包括:
(1)登錄及注冊(含有非空性,重復性校驗)
(2)游客試玩(內容和正常玩家一樣,最后積分不錄入數據庫,也不進入積分榜)
(3)積分榜(展示前20玩家及相應積分)
(4)設置(游戲音量設置)
游戲功能內容:
(1)頁面內包括:游戲主體頁面、操作按鍵提示,重新開始,退出游戲,我方飛機血量及三倍子彈存儲量。
(2)我方飛機具有,靈活移動、進行射擊、初始HP、撿取補給(碰到即可)、自爆、重生、開啟\關閉三倍子彈功能。
(3)敵方飛機分為小型、大型、BOSS共三種,且不同類型的敵方飛機屬性不同。
敵方飛機可發射子彈 具有血條 且隨著積分增加,敵方飛機血量也會增加。
(4)boss飛機:游戲達到一定積分后,boss飛機會加入戰場。
(5)補給包括兩種:
藍色補給:回復一定HP。
紅色補給:增加三倍子彈的存儲量。
在這里插入圖片描述
圖1- 2 項目主要工作
1.4 本文組織結構
本文的具體內容和組織結構,簡要敘述如下:
第一章對本文的研究及應用背景進行講述,并提出開發本游戲需要進行的主要工作和本文的組織結構。
第二章介紹了游戲平臺的特點和系統開發環境的特性,首先是介紹了開發平臺,系統開發環境介紹、數據庫系統介紹以及開發工具介紹,在開發技術中,介紹了Python動態腳本語言、腳本系統架構設計以及腳本接口模塊設計、Python調用引擎函數和相關技術難點。
第三章按照面向對象的設計思想,從需求分析和可行性分析、并根據分析結果對飛機大戰游戲進行了模塊設計,明確包含游戲主頁面設計、調整游戲難度、進行游戲控制等核心功能的具體要求。
第四章圍繞主頁面及游戲界面,對其中的重要功能實現,闡述功能實現,對具體實現給出標明代碼注釋,程序截圖幫助閱讀及理解。
第五章對程序進行了功能測試、并對比需求及實現情況,對軟件質量提出評價,記錄重要性較高的BUG。
第六章對該系統開發過程進行總結,并給出該系統的不足之處,提出提升空間。
第二章 開發平臺與開發技術
2.1 開發平臺
2.1.1 系統開發環境介紹
當前程序是以Python為編程語言,主要功能實現依賴于pygame模塊,主要用到surface對象之間的位置變化,再利用事件監聽讓程序運行起來。運行中Surface對象的位置發生變化后,界面刷新,用戶對鼠標與鍵盤進行操作時,監聽操作完成相應事件[2]。
軟件開發方式:①系統總體設計②系統詳細設計③編碼④測試
系統運行環境:Windows7及更高版本;
2.1.2 數據庫系統介紹
MySQL是一種開源關系數據庫管理系統,進行數據庫管理所使用的查詢語言(SQL)也被廣泛使用[3]。
MySQL是開源的并支持個人修改設置,用戶可以在通用公共許可證進行下載。軟件體積較小,安裝使用非常簡單,且以便于維護,安裝維護成本較低。
MySQL具有可靠性高、性能卓越、適應性強、服務穩定等優點,并被人們廣泛關注。大多數人認為MySQL是在不進行事務處理的情況下管理內容的最佳選擇[4]。
因此,在數據庫使用需求較為簡單情況下,我選擇MySQL作為數據庫管理工具。
2.1.3 開發工具介紹
PyCharm是一種Python 集成開發環境,它有一套工具可以幫助用戶提高開發Python語言的效率,例如帶有常用的第三方類庫、調試及智能提示、支持單元測試、代碼跳躍、項目管理、自動作業、語法突出顯示、版本控制。
編碼支持:其支持智能化的、可配置的編輯器提供代碼完成、代碼片段、代碼折疊和窗口拆分支持,使用戶快速便捷的完成任務,節省了用戶的時間。
項目代碼導航器:這個IDE快速的幫助引領使用者在文件之間切換,快速尋找定位關聯代碼,使用者還可以使用默認或者自己設置的快捷鍵來提高編程效率。
代碼分析:使用者可以通過工具提示信息,在不允許代碼的前提下,完成代碼修改及調優。
Python重構:在程序編寫過程中,導入域/變量/常量,重命名,提取方法/超類,移動和前推/后退重構這些操作可以使用這個功能來實現,極大的減少了用戶的任務量。
集成版本控制:如果用戶想使用這些功能,如登錄、輸入、視圖拆分和合并, -用戶可以在VCS用戶界面中找到,這是其通用的功能。
具有自帶的調試器,調試器的功能多樣化,可以提供多種功能,用戶通過對基于Python和 Django的項目進行調試,同樣,系統的單元測試,也可以通過它來解決,
該調試器包括blake點、分步、多屏幕視圖、窗口和計算表達式等。
單元測試:Pycharm在默認條件下使用pytest框架去執行單元測試用例
另一方面,Pycharco還為Django的開發提供了一些很好的功能,以及對Google應用引擎的支持,以及對Pycharm的支持。
圖2- 1 Pycharm主要功能
2.2 開發技術
Python用作該軟件的開發語言,其關鍵技術在于布局、事件監控和數據存儲[5]。布局主要是美化游戲界面以及界面的排版。用戶交互界面用布局來實現,給用戶帶來美觀、舒適、直接的用戶體驗。所以,界面布局的設計會影響到使用者的客觀感受,獲取用戶操作使用事件監視技術,而數據監視技術記錄所有操作,創建用戶需要提取的數據。
2.2.1 Python語言簡介
Python誕生于1989年,由Givavo RSM開發和設計,設計Python的最初目的是為了高效的完成某一項任務而創造的[6]。它從一種為提高研究項目的工作效率而創建的通用編程語言開始。時至今日,在互聯網行業發展迅猛的同時,Python語言也得到了優化與改進,由于其良好的可移植姓和豐富實用的類庫支持,它已經出現在許多領域[6]。比如機器學習與深度學習,自動化測試用例、日常腳本編寫、數據分析及處理等等。如人工智能的阿爾法狗就是成功的應用Python技術的例子。
Python的主要特點有:
(1)低入門標準的Python語法相當簡短,編寫的程序通常簡短,非常像日常使用的自然語言,有利于開發者的使用和理解。
(2)作為一門面向對象的語言,類和對象的使用,體現了Python的特征,面向對象的語言特點是在該語言被創造的時候就體現的。Python之所以能成為一門被大眾喜愛的編程語言在于它的精心設計的數據和內存管理。
(3)對于內存的管理,Python也有其特定的部分負責,對于開發者來說,程序就顯得有必要了,因為開發者只有理解這些程序的前后邏輯才能更好的寫出項目,使他們不像C/C++程序員那樣專注于處理內存事務[7]。Python的程序設計和編寫時間更短、出錯更少也是基于此特性。
(4)主機語言與其通信可以方便的被嵌入,可以用C語言編寫對于一些對性能特別強調的地方,這些擴展在Python中被調用以實現性能改進的目的。相反,Python解釋器可以嵌入到C/C++中,它取代接口可以通過動態鏈接庫的形式進行,通過這種方式,程序開發由此變得靈活方便[8]。
(5)在Python的標準庫中,包含了大量充分測試后的模塊,這些模塊為大多數功能實現提供了極大的便利,在實際開發編程中得到了廣泛充分的運用。
2.2.2 Pygame模塊簡介
如果要使用Python進行游戲開發,那么Pygame模塊絕對是最佳選擇。Pygame模塊是利用SDL庫實現的,該庫是一套開放源代碼的跨平臺多媒體開發庫。其中提供了多種關于控制圖像,音頻、輸入輸出的方法[11]。Pygame的代碼是開源共享的。Pygame可以用來創建完全界面化的游戲和多媒體程序、而且使用Pygame編寫的軟件幾乎可以在所有平臺和系統中運行[12]。
Pygame主要包含以下功能:繪制圖型、顯示圖片、動畫效果、與鍵盤鼠標和手柄的外部設備的交互、聲音處理及播放、碰撞檢測。
2.2.3 Tkinter模塊簡介
Tkinter模塊是Python官方推薦使用的GUI工具包,而且Python的IDE窗口就是使用Tkinter進行編寫的。Tkinter主要的作用是用來編寫可視化界面,制造程序與用戶之間的良好交互。通過不斷添加標簽來實現各種功能,常用的標簽有Label、 Button、Checkbutton、Entry等多達二十多種。 每個標簽對象都設有豐富的參數用作調整,使之更加靈活,可以滿足絕大部分的用戶需求。
2.2.4腳本系統架構設計
因為腳本在游戲開發中起連接作用,所以首先需要我們解決的問題是腳本和宿主代碼,即怎樣效率高的便捷的管理和操作腳本代碼,讓它為游戲的邏輯開發和促進整個游戲的進行。需要解決腳本和主機代碼通常以事件為中心,以及他它們之間的聯系。游戲引擎是游戲中與腳本進行交互的設備,由此我們可以得到腳本語言的結構,也就是腳本語言和其他交互的接口,接口的實現是我們設計的主要部分,我們將腳本接口集成到游戲引擎的接口,目的是為了實現這些接口。有了引擎接口和游戲接口的結合,給Python腳本的擴充帶來了便利,同時也使Python更加豐富,提供Python腳本和游戲引擎之間的數據交互,以達到邏輯與具體實現分離的目的[9]。
它的幾個組成部分是腳本包裝器、消息處理器腳本、邏輯腳本、游戲世界接口、腳本對象管理器。
(1)游戲世界接口可以實現創建游戲對象、設置計時器、修改游戲中游戲對象的屬性、或打印調試日志和其他功能,同時這個接口也實現了管理功能。
(2)對于腳本文件的管理,我們使用引擎來實現此功能,所以,內部邏輯結構是調用腳本的關鍵,腳本包裝器可以實現腳本調用的功能,即通過邏輯的方式來調用。將一個腳本交給一個單個的模塊控制。消息處理器對象和邏輯腳本對象是腳本包裝器的兩個重要組成部分。消息處理器的作用是處理從消息到業務邏輯。
(3)消息處理器由映射關系表來穩定和修護,動態加載、修改和刪除腳本對象是引擎內核通過修改消息處理器對象維護的映射表來實現的。這個功能也實現了邏輯的熱更新。引擎與Python腳本的相互交互是通過一個抽象層的腳本接口模塊來設計實現的,這是一個抽象層。通過這個抽象層,Python腳本可以在Python和C基礎上在Python和C++之間進行交互。其中處理異常和轉換數據格式是主要部分[10]。
第三章 飛機大戰游戲模塊設計
3.1 需求分析
需求分析是軟件工程的一個重要階段,這個階段主要完成的工作是調研用戶需求,并和開發人員進行確認,將客戶的非技術性需求轉化為技術上可實現的技術性需求[13]。明確要實現哪些功能、完成哪些工作,產出規范性文檔《需求規格說明書》。在通過評審后,《需求規格說明書》主要有便于用戶、開發人員進行理解與交流、反映用戶的問題結構以用作軟件開發的工作依據、作為軟件測試和驗收的依據[14]。
游戲程序是高度精確的程序系統,它的精度要求極高,原因在于相當充分的程序利用率。最后工作的實際操作是運行所有的程序,例如鍵盤事件、繪圖事件以及極少的后臺頻率響應,很多重大的錯誤往往在于很小的差異導致的,嚴重的能導致程序崩潰。因此,設計思路應非常嚴格,設計中應考慮所有可能發生的事件和事故,以保證程序的運行成功率。
在“飛機大戰游戲”這個游戲中,游戲的玩法是,玩家控制飛機出現在游戲界面底端,敵方飛機則從頂端生成,發射子彈,并向底部移動。主要游戲內容為,玩家控制己方飛機進行移動,移動的同時躲避敵方飛機所發射子彈,并發射子彈命中殲滅敵方飛機,獲取積分。在本游戲中,玩家飛機的初始HP是50,敵方飛機的HP、攻擊力根據敵方飛機類型不同而不同。如果玩家HP減到零那么,玩家飛機損毀,游戲結束,將積分記錄至數據庫[15]。
當積分達到臨界值即可出現Boss,Boss死亡后,可進入更高難度的一關游戲,在游戲中,會適當發放補給包。補給包內容分為增加己方飛機HP、增加己方飛機三倍子彈存儲量,游戲主畫面是一個背景圖片及飛機與子彈對象,右側給出操作提示。玩家操作主要包括,己方飛機的移動、發射子彈、游戲暫停、退出游戲等。
本軟件是基于windows系統的開發的一款娛樂軟件,它包含普通玩家與游客兩種用戶。
注冊功能:進入程序后,點擊注冊按鈕,注冊成為新的用戶。
用戶登錄:用戶登錄就只有兩種類型:普通用戶和游客。普通用戶能夠經過登錄界面進行登錄,用戶名和密碼正確才會登錄成功。
積分排行:普通用戶登錄并進行游戲后可以將積分及玩家信息存入數據庫,排行前50的積分將顯示在積分排行頁面。
游戲設置:設置背景音樂開關及聲音大小。
游戲功能:實現飛機移動、發射子彈、多條生命、碰撞檢測、敵方飛機血量檢測、事件監聽、發放補給包等功能。
3.2 可行性分析
從而提出該項目是否值得投資和如何進行建設的咨詢意見,為項目決策提供依據的一種綜合性的系統分析方法。
通過對系統進行多方面的考量來提出系統投資價值,為決策者提供有力依據的綜合性分析方法。可行性分析包括技術可行性、經濟可行性、社會可行性等多方面考量因素。
從而避免投資的浪費,提高軟件生產的成功率。用小代價短時間來確定問題是否能夠解決是可行性研究的現實目的[16]。
下面對基于Python的飛機大戰游戲的開發進行判斷和考察,主要從技術、經濟、社會幾個方面來分析。
(1)技術可行性
主要分析技術要求的技術可能性可以完成開發任務,硬件和軟件可以滿足開發人員的需求。功能強大的JetBrains是該軟件中使用的開發工具。
PyCharm 2018.2.3 x64,強大的擴展能力是該軟件的特性,該軟件對于飛機大戰游戲的編寫及完善有良好的支持效果,也是眾多Pythoner的喜愛編譯器。隨著互聯網行業的迅猛發展,軟件開發平臺及硬件技術同時不斷更新進步。大容量、可靠性的提高、低價格也使得軟件開發是可行的。本游戲的編譯需求完全可以由Pycharm編譯器承擔。
綜合以上情況及考慮,本游戲的開發在技術上是完全可行的。
(2)經濟可行性
由于本游戲較為小型輕便,開發成本較低。此外,該軟件穩定、后期維護簡單、實用,一旦開發完成即可長期使用。當用戶有了新的需求時,只需要根據需求,在原有代碼基礎上進行更改,維護成本較低。
綜合以上情況及靠背,本游戲在經濟上是完全可接受的。
(3)社會可行性
法律因素:本游戲是本人處于興趣愛好,獨立完成開發的。游戲基于Python完成,同時借鑒市場上同類軟件的功能,收集并歸納用戶需求,制訂設計思路,結合實際中存在的游戲實體,進行創新及開發的。
用戶使用可行性:本游戲對用戶的要求,沒有復雜繁瑣的操作,簡單易用。使用軟件的管理員, 在了解了簡單的流程后就可以對后臺進行管理,沒有額外的學習使用環節,節約成本。
由以上分析可知,本游戲在社會可行性方面是完全可行的。
3.3 總體設計原則
總體設計原則的提出是為了確保系統建設成功,并為系統的可持續發展做出規劃。因此在系統設計時,我們遵守以下原則:
簡單性:實現游戲需求的前提下,盡可能的保證游戲簡單易操作。一方面,簡單的操作會使增進游戲體驗,另一方面操作過于復雜時,游戲實現更易引入問題及漏洞[17]。
針對性:本項目是選用Python作為編程語言的飛機大戰游戲,用明確項目需求為目標,具體需求具體實現,有很強的針對性。
實用性:飛機大戰是一款優秀的休閑娛樂軟件,從該系列游戲誕生以來就深受玩家的喜愛,具有娛樂身心、放松心情、減緩壓力。而且由于該游戲較為普及,大多數玩家都熟知游戲操作方式,更樂于使用這一游戲,因此該游戲具有很強的實用性。
一致性:本游戲的飛機采用的是同一種畫風的飛機,且多種飛機類是由飛機基類繼承得來的,具有較高的視覺一致性。主界面采用tkinter模塊進行編寫,主界面上的元素統一使用標簽插入,具有較高的功能一致性。
圖3- 1 總體設計原則
3.4數據庫設計
由于本游戲與數據庫交互較少,只設計了一個表用作數據存儲,其中包括四個字段:id(記錄的唯一標識)、username(用戶名)、password(密碼)、score(分數)
圖3- 2 用戶表ER圖
3.5系統流程圖
本游戲的主要流程如下:
首先在打開游戲之后,如果有賬號可以直接登陸游戲,如果沒有賬號可以注冊或者是選擇試玩。此時,初始化游戲,游戲開始。游戲開始后,敵方開始出現戰機,與之對抗,如果玩家血量為0,則游戲結束,某敵方飛機血量為0,則玩家獲得積分,當積分達到一定的設定時,游戲難度增加,敵方血量開始增加。此時進入下一關。當玩家選擇退出游戲,則游戲結束,如果積分高于積分榜,則此次游戲玩家可以上榜。具體流程圖如下所示:
圖3- 3 系統流程圖
3.6 系統模塊設計
3.6.1 主界面選項卡功能
在主頁面上放置5個按鈕,分別是“登陸”、“注冊”、“試玩”、“積分榜”、“設置”。
圖3- 4 主頁面流程圖
圖3- 5 主程序頁面設計圖
3.6.2 游戲難度的調整
隨著積分的增加,游戲難度會提高,具體方式為提高敵機血量。
以難度1提升到難度2為例,當玩家的血量大于0,且當前難度為1,如果玩家積分超過40即可進入到難度2,此時敵方飛機數量和血量開始增加,每次難度提升,敵方飛機的血量都會增加。
3.6.3 游戲界面繪畫功能
左側是游戲界面,背景以森林和河流為主,飛機大戰就是在這個背景下開展的。
右側是工具欄,其中包括操作說明,本游戲是以鍵盤的上下左右四個鍵操作的。空格鍵可以操縱飛機發射子彈。下面是提示部分:R/r代表重生,B/b功能是自爆,S/s是開啟/關閉,Q/q是暫停。
在右邊工具欄中,存在分數和血量,以及炮彈的管數。以及提示最高分。
3.6.4 游戲控制功能
玩家可以通過控制鍵盤、鼠標來進行游戲控制。鼠標控制主要是左鍵單擊界面內按鈕元素,或者特定區域來觸發綁定事件。
鍵盤控制共9個鍵,其中包括:來控制自方飛機的移動方向(上下左右四個鍵)、飛機子彈的發射(Space)、游戲暫停(Q/q)、飛機重生(R/r)、飛機自爆(B/b)、開啟及關閉三倍子彈(S/s)。
圖3- 6 操作按鈕設置
3.6.5 結束游戲功能
游戲結束的判定分為兩種:第一種是用戶單擊退出游戲按鈕,退出游戲會觸發綁定事件,調用積分模塊,進行積分存儲,然后程序會強制結束。第二種則是己方飛機受到攻擊直至HP為0時,游戲界面給出游戲結束提示,然后調用積分模塊,并提供重新開始與退出游戲。
3.7 游戲難點分析
(1)游戲程序是高度精確的程序系統,因為它們的代碼利用率很高。最后工作的實時操作是用上千行的所有程序進行的,事件發生在鍵盤上,事件發生在鍵盤上,在后臺響應頻率很高,細微的差別很容易立即導致程序出錯或死機后等待[19]。因此,邏輯設計應非常嚴格,設計中應考慮所有可能發生的事件和事故。
(2)為了美觀和適用性,需要找到較為合適的飛機素材包,但是目前只有基礎的飛機素材包。
(3)玩家的飛機操作可以通過鍵盤響應事件來控制,但敵方飛機的自動操作需要一定的智能;游戲并不那么容易,因為敵方飛機的飛機操作算法也需要設置。
(4)雙方飛機需要考慮是否碰撞,以避免重疊操作。它以缺乏許多物理可能性和現實主義而告終。每個頁面都會刷新,所有步驟都需要相關的沖突檢測。
(5)游戲地圖不能用繪圖來解決。否則,很難控制和處理太多的元素,以及太多的大照片,所以不能限制程序的大小,從而失去了計算機屏幕顯示的優勢。
(6)游戲的結束、開始和動態信息屏幕是程序的重要組成部分。良好的用戶界面是吸引用戶的一個指標,還必須考慮相關的藝術構成和人性化設置。
(7)繪圖美化。游戲優美清新的界面會給用戶帶來愉悅的心情和美感。所以在本游戲中, 借鑒現有的類似的游戲畫面設計,使畫面讓玩家看起來更舒適和美觀,給玩家帶來不一樣的游戲體驗。
(8)多線程技術的實現。游戲控制的基礎是線程機制。為了控制整個游戲,你需要刷線程幀,加載背景資源,并自動控制所有類型的滾動(敵方飛機或),這些功能的實現都要依賴于線程。
(9)碰撞問題的解決。例如,敵方飛機子彈和己方飛機,敵方飛機和己方飛機等等,綜合運用數學和物理知識來實現碰撞檢測,采用不同的檢測方法以應對游戲中各種可能的情況,達到精確檢測的目的。
第四章 主要功能具體實現
4.1 主界面選項卡實現
4.1.1主界面的實現
主頁面設計采用tkinter模塊的TK()方法進行創建窗口,并使用geometry()方法進行窗口屬性設置,插入Button和Entry對象來創建按鈕及輸入框,并設置了綁定變量來獲取輸入框輸入。
具體實現步驟為:
a.設置窗口屬性,設置window.title為“飛機大戰”。
b.設置三個標簽分別為“飛機大戰”、“賬號”、“密碼”,放置兩個輸入框,其中賬號可顯示默認賬號。
c.密碼的文本設置輸入密碼后顯示
號,具體實現為entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show=’
’)。
d.在主頁面上放置5個按鈕,分別是“登陸”、“注冊”、“試玩”、“積分榜”、“設置”。
圖4- 1 程序主界面
4.1.2注冊功能實現
玩家可進行賬號注冊,進行合法有效輸入后,不與數據庫內存在賬號重復即可注冊成功。
具體實現步驟為:
a.分別設置對應的標簽和按鈕。
b.使用cursor()方法獲取操作游標 cursor = db.cursor()。
c.使用execute方法執行SQL語句,并使用fetchone()方法獲取一條數據。
d.打開數據庫連接。
e.對數據的合法性進行校驗,校驗不通過則提示錯誤信息。
f.如果校驗通過,則執行sql語句,使用db.commit()函數將數據提交到數據庫。
g.關閉數據庫連接。
圖4- 2 注冊界面
4.1.3登錄功能實現
玩家可輸入賬號密碼進行登錄,在進行輸入校驗及與數據庫內數據匹配后,即可登錄成功。
具體實現步驟為:
a.使用get函數獲取玩家輸入的賬號和密碼,首先進行輸入校驗,查看兩者是否有空值,如果有提示用戶賬號或密碼不能為空。
b.使用cursor()方法獲取操作游標 cursor = db.cursor()。
設置列表變量用以存放SQL語句返回結果,然后執行SQL語句,從游標逐條獲取返回結果。然后賦值給列表變量,由主程序作進一步判斷或處理。
c.使用ececute()方法執行SQL語句。
d.查看用戶信息是否存在于數據庫,如果存在,則匹配其密碼,正確則登錄成功,錯誤則提示密碼錯誤。如果不存在,則提示賬號不存在。
e.關閉數據庫。
圖4- 3 登錄功能實現
4.1.4試玩功能實現
在充分考慮部分玩家不想擁有賬號的情況下,參考其他游戲,添加試玩功能。
實現邏輯:創建試玩賬號,玩家點擊試玩直接進行登錄,游戲結束后,試玩賬號的積分不記錄至數據庫。
4.1.5積分榜實現
積分榜:顯示前N名玩家的積分信息(N<=20,當庫內用戶數量大于20時,N=20)
具體實現步驟為:
a.分別設置對應的標簽和按鈕。
b.使用cursor()方法獲取操作游標 cursor = db.cursor()。
c.使用方法fetchall()并將返回值賦值給變量作為文本。
d.關閉數據庫連接即可。
f.對文本進行格式處理,然后添加Label標簽,把文本添加至積分榜頁面進行展示。
圖4- 4 積分榜
4.1.6游戲設置實現
游戲設置包含內容為音量設置。
a.創建滾動條對象scale1用以控制音量。
b.給確定按鈕綁定事件(使用scale1.get()方法獲取音量,并將該值賦給全局變量volum)。
c.將音量volum傳遞至游戲模塊,音量設置生效。
圖4- 5 音量設置
4.2 游戲功能實現
4.2.1游戲界面繪制
左側是游戲界面,背景以森林和河流為主,飛機大戰就是在這個背景下開展的。
右側是工具欄,其中包括按鍵操作提示,分數和血量,以及炮彈的管數。以及提示最高分重新開始及退出游戲。
實現邏輯:右側操作說明及游戲背景均使用圖片插入。
圖4- 6 游戲界面
4.2.2鍵盤及鼠標控制實現
按鍵控制包括 上下左右,space,R/r,B/b,S/s,Q/q共9個鍵。
對應關系如下:
移動(上下左右) 重生(R/r) 自爆(B/b) 開啟及關閉三倍子彈(S/s)暫停(Q/q)
a.在游戲循環中,首先使用pygame.event.get()獲取到用戶事件。
b.然后對獲取到的事件進行判斷。
c.如果是鍵盤事件,就進一步判斷按下的鍵是哪個,并觸發對應事件;
如果是鼠標事件,則判斷鼠標點擊的區域,不同區域對應不同事件。
圖4- 7 鍵盤控制實現(部分)
4.2.3飛機移動實現
(1)我方飛機移動
我方飛機移動分為單向移動與雙向移動,如果玩家同時按下兩個方向鍵就會同時朝綜合方向移動,實現方法是為我方飛機類設置了8個方向的移動方法,根據按鍵調用對應的移動方法。
(2)敵方飛機移動
敵方飛機從屏幕頂端出現,向下移動至窗口上部,左右移動射擊,射擊子彈數量達到一定值后,添加向下移動。
圖4- 8控制飛機移動代碼展示(部分)
4.2.4發射子彈模塊實現
子彈的實現依賴于飛機基類,飛機類中有兩個與子彈相關聯的屬性。分別是存儲發射子彈引用的列表和記錄發射子彈數量的變量。子彈的傷害值由全局變量列表規定,不同飛機的子彈傷害值不同。子彈的碰撞邏輯是根據子彈圖片與飛機圖片是否重疊來進行判斷的。敵機的子彈發射是隨機的,通過控制隨機函數的參數范圍來調控子彈發射的頻率。敵機設有子彈發射上限,小型飛機為10發,中型飛機為25發,BOSS飛機無上限。
當敵方飛機發射子彈達到上限后,就會向下移動,直到被友方飛機消滅,或者判定坐標超過了窗口上限,銷毀該敵機對象。
4.2.5擊中爆炸實現
判斷擊中的條件為子彈與飛機有重合部分,如果有重合部分,則清除子彈對象,如果飛機血量為0
則顯示爆炸圖片,并清除飛機對象。不同類型飛機的爆炸圖片數量也不同,小型飛機、我方飛機、中型飛機為4張,BOSS飛機為6張。爆炸效果是引用圖片,無論是敵方飛機還是己方飛機,在爆炸的時候,都是需要計數的,累計到一定數值才會爆炸(血量為0)
在設定爆炸的時候,有多個屬性。
(1)self.hitted = False 表示是否要爆炸
(2)self.bomb_picture_list = [] 用來存儲爆炸時需要的圖片
(3)self.bomb_picture_num = picture_num 飛機爆炸效果的圖片數量
(4)self.image_index = 0#用來記錄當前要顯示的爆炸效果的圖片的序號
以中型飛機爆炸第三張圖片為例,爆炸效果圖片如下所示:
圖4- 9中型飛機爆炸圖片
4.2.6展示血量和繪制血條
不同類型的敵方飛機擁有不同血量,我方戰機初始血量為50,隨著大戰的繼續,難度逐漸提高,敵方飛機的血條逐漸增加。由玩家當前積分決定敵方飛機的血量,積分越高,敵方飛機血量越長。對于玩家自身的血量,則體現在游戲界面的右側,玩家可以實時觀察自己的生命值。
血條是最直觀體現敵方飛機的血量的屬性,血條使用pygame.draw.line進行繪制,長度與敵方飛機血量有關,并根據敵方飛機血量實時進行變化。
圖4- 10血條展示
4.2.7積分模塊實現
(1)積分獲取
擊毀敵方飛機可以獲得積分,積分的數值由敵方飛機的血量決定,擊毀小型飛機可獲得HP
100%積分,擊毀中型飛機可獲得HP
50%的積分,擊毀BOSS飛機可獲得HP*25%的積分
(2)積分存儲
每個玩家在游戲結束時,如果積分大于該玩家在數據庫內的原有積分,則會對積分進行存儲。最高分可以寫入文件中,執行SQL 更新語句,將新的數據提交到數據庫執行,關閉數據庫。
a.首先進行判斷是否為試玩賬號,如果是則不進行存儲。
b.使用cursor()方法獲取操作游標
c.使用execute方法執行SQL語句
d.關閉數據庫連接。
e.循環輸出積分榜上信息
圖4- 11 積分存儲
第五章 系統測試
測試就是通過靜態審查或者運行程序從而找出軟件實現過程中是否與需求存在偏差。除此之外,測試還需要軟件質量進行度量,推進問題修復。測試的原則之一是測試應當盡早介入,即在軟件開發過程中,越早發現問題,該問題的修復成本就越低。在尋找錯誤的過程中,不斷完善系統,盡量的避免問題出現與系統投入使用過后,修復成本大幅度增加的情況。因此,進行全面的系統測試是不可或缺的[20]。
在實際的測試流程中,將在設計階段根據需求撰寫測試用例,并根據實現情況對用例進行補充及修改,驗證需求實現情況,提出問題并推進修復,最后給出軟件質量度量。
執行程序給定輸入,并校驗程序輸出是否符合預期結果是黑盒測試的標準流程。它不必關心程序的內部實現邏輯,不需要涉及代碼層面[21]。與之對應的是白盒測試,大多是通過靜態代碼審查的方式,不運行程序,憑借程序實現的邏輯結構,來檢查程序是否滿足需求,符合預期。
5.1 測試的定義及其重要性
5.1.1 測試的定義
軟件測試是直接影響軟件質量評價的重要部分,是用來衡量實際輸出和預期結果之間的審核比價過程。軟件測試不僅要注意戰略,還要及時,越早發現問題,修復成本就越小。測試的作用就是在衡量成本的條件下,盡可能的找出問題并推動問題修復,為軟件質量作出度量,避免問題出現在系統投入使用后,減少修復成本。
5.1.2 測試的重要性
隨著軟件行業的蓬勃發展,人們更加關注的是軟件質量的實現,因此軟件測試就愈發重要。在軟件工程中,這是必不可缺的一環。在操作和維護階段之前,應確保軟件的質量,然后在操作和維護階段向用戶提供軟件產品。越來越科學的測試理論、測試方法不斷涌現,普遍認為:軟件測試應該在項目之初就進行介入。雖然軟件測試的原則之一就是測試不可能發現所有BUG,軟件必定是存在BUG的。但是為了減少錯誤的引入,我們可以使用完備的開發過程、有效的開發方法和新的語言,但這些方法只是最大程度的降低了錯誤。通過測試來檢測這些誤差是很有必要的[22]。BUG具有集群性,符合“二八原則”。測試過程中,通過統計問題分布,可以推算哪些模塊需要繼續進行測試。
5.2 測試方法及過程
白盒測試是基于代碼的一種測試設計方法。測試人員通過審查代碼、明晰代碼實現邏輯后,以驗證程序邏輯為目標,構造測試用例及數據。與之對應的黑盒測試,則是將程序視作一個“黑盒子”,不關心程序內部的實現邏輯,只著眼于外部結構,設計輸入數據及預期結果[23]。運行程序、進行輸入,然后得到實際結果從而驗證軟件是否滿足需求。
探索性測試是一種測試思維與理念,在對系統有一定了解的情況下,不嚴格拘泥于先設計后執行的測試思路。探索性測試是設計與執行同時進行的,實踐表明,探索性測試往往能暴露出更多的問題。
在飛機大戰游戲中,綜合采用了兩種方法,還結合了探索性測試的思路,使測試過程可以暴露更多問題。
本次測試主要達到以下測試目的:
(1)功能檢查:根據需求與實現產品,驗證功能需求實現情況,檢查功能實現是否有遺漏偏差。
(2)數據檢查:主要對用戶、積分信息進行檢查,檢查數據庫與程序之間的交互部分。
(3)性能檢查:針對于本次的飛機大戰游戲,該項主要是檢查游戲幀率,是否存在卡頓現象
(4)穩定性檢查:由于事件讀取是從鼠標鍵盤上獲取的,而導致后臺響應頻率較高,所以要檢查程序是否出現運行終止、重啟等現象。
5.3 測試結果
5.3.1評價
軟件評價是指軟件正式運行后,根據需求對軟件的功能、性能、結構、界面友好性等內容做出客觀表述[24]。
功能評價
本軟件可流暢運行、界面風格簡單友好,實現功能可以滿足玩家需求。
(2)數據評價
數據庫設計合理完全可以滿足使用需求,且程序與數據庫交互良好,維護成本低。
性能評價
游戲主內容性能良好,游戲對玩家的可交互性良好,但程序打開與開始游戲時,停頓時間較長。
穩定性評價
程序運行過程中未發生程序終止、重啟等異常現象。
5.3.2 BUG修復進度
幾乎所有的計算機程序都有缺點,而且還有一些明顯不受保護的軟件沒有經過仔細維護。即使是Windows也存在許多類型的錯誤和漏洞[25]。 在選本游戲作為課設的時候,剛開始感覺邏輯復雜,難以控制,因此產生了大量BUG,現在BUG已完全解決,重要程度為高的BUG如下:
(1)注冊頁面,注冊時 兩次密碼不一致時,提示信息彈出,關閉后,直接跳到主頁面,原來注冊頁面被隱藏。
(2)主界面多次點擊注冊 會出現多個注冊界面(積分榜界面、設置界面同樣存在該問題)。
(3)游戲中飛機死亡后可以繼續進行射擊。
(4)窗口位置應設置在顯示屏頂端 及窗口長度過長。
(5)注冊時,用戶名不能含有英文字符,目前只能注冊純數字組合的用戶名(SQL語句中缺少‘’導致)。
(6)小型飛機的碰撞檢測過小。
由于水平關系,代碼變量太多,游戲運行效率低下。有很多重復結構。希望在以后編程水平提高時再優化整個程序。
第六章 總結與展望
本次課題研究是基于興趣愛好的一次實踐,興趣愛好給予了我很大的動力,這也使我在遇到各種問題時,總能通過多種渠道找到解決方案。雖然是第一次使用Python開發游戲,在一邊進行學習,一邊進行游戲開發和設計過程中,遇到了很多問題,也走了不少彎路,但鍛煉了自我解決問題的能力。這次課題研究不僅讓我對Python有了進一步的了解,而且還大大提高了編程能力,鍛煉了自己的邏輯思維和整體設計的能力,收獲頗多。通過這次課題研究,我意識到完整的軟件開發思路是非常重要的,它關系到我們開發過程能否順利實現。在項目開始之前,必須有軟件工程的系統化的知識體系,不僅如此,還應包括軟件結構位置、代碼編寫和模塊劃分和整體布局,只有做完這些步驟,才能逐步開發出想要實現的功能。這樣定能達到事半功倍的效果。
整個軟件按照計劃大致實現了游戲的具體功能,雖然游戲能正常運行,不過因所學知識及開發周期有限,還有很多需要改進的地方,有待于日后進一步的改進和完善。
經過匯總測試人員的建議,本游戲應該完善的功能如下:
(1)游戲未繼續美化,主界面過于簡潔,部分飛機圖片不包含擊中與擊毀圖片,只能使用較為簡單的飛機模型。
(2)BOSS未設置過多技能,沒有設置過關動畫。
希望日后,我能夠有能力對這個游戲進行改進,以優化系統,完善玩家體驗、使游戲更加流暢美觀。
參考文獻
[1] [美]Wesley J. Chun著 宋吉廣譯 《Python核心編程》(第二版) 人民郵電出版社
[2] 小甲魚著 《零基礎入門學習Python》 清華大學出版社
[3] [英] Ben Forta 著 劉曉霞/鐘鳴 譯《MySQL必知必會》 人民郵電出版社
[4] 李瑞祥,劉偉.MYSQL數據查詢技巧[J].網絡安全和信息化,2019(05):70-71.
[5] Jason Briggs 著 尹哲譯 《趣學Python編程》 人民郵電出版社
[6][美]Bill Lubanovic著 丁家瑞 譯 《Introducing Python》 人民郵電出版社
[7][挪威] Magnus Lie Hetland著 凌杰 陸禹淳 顧俊 譯 《Python算法教程》 人民郵電出版社
[8] [美]Jonathan S.harbour 著 李強譯 《Python游戲編程入門》 人民郵電出版社
[8] [瑞典] Jan Erik Solem 朱文濤/袁勇 譯《Python計算機視覺編程》 人民郵電出版社
[9] [美] Al Sweigart著 李強譯《Python游戲編程快速上手》 人民郵電出版社
[10] [美]James Payne著 張春暉 譯《Python游戲編程入門》 清華大學出版社
[11] [美]Eric Matthes 著 袁國忠 譯《Python編程:從入門到實踐》 人民郵電出版社
[12] 張子良,陳俊豪,申明華.基于Python的數據處理及圖形化分析平臺的設計開發[J].汽車實用技術,2019(06):71-73.
胡崇剛.軟件工程的標準化[J/OL].電子技術與軟件工程,2019(10):48[2019-05-31].http://kns.cnki.net/kcms/detail/10.1108.TP.20190524.1656.082.html.
沈鑫,陳華山.關于軟件需求分析的理解[J].現代信息科技,2018,2(11):13-14+17.
瞿蘇.基于Python的飛機大戰游戲設計[J].揚州職業大學學報,2019,23(01):35-39.
鄭憲秋.軟件工程技術在數據庫設計中的重要性及應用[J].電子技術與軟件工程,2019(07):158.
吳璣震,戴天嘯,馬春江,汪嬋.飛機大戰游戲軟件中的數據結構和策略分析[J].信息與電腦(理論版),2016(13):145+154.
梁孔科,李芳瑩.基于Python腳本語言的Web開發應用研究[J].信息與電腦(理論版),2019(06):72-73.
吳文慶.軟件開發中測試驅動開發的運用[J/OL].科技資訊:1-2[2019-05-31].https://doi.org/10.16661/j.cnki.1672-3791.2019.11.01
孫佳美.基于Java飛機大戰的設計與實現[J].無線互聯科技,2016(01):54-55
. ScaleGrid; MySQL Hosting on Azure, Fully Managed Cloud Database Service Launches at ScaleGrid[J]. Computers, Networks & Communications,2018.
孔韜,王俊江.軟件需求管理的工程應用[J].電子質量,2018(10):60-62.
項楠.軟件測試策略和測試方法的應用分析[J].科學技術創新,2019(11):64-6
陳豪文,周璐雨,寧志豪.認識軟件測試[J].科技風,2019(14):69.
闞青.對軟件測試過程中的質量管理及風險應對分析[J].電子技術與軟件工程,2019(03):40.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
