函數是各種編程語言的重要部分,C++編程也不例外。最簡單的函數不帶參數,返回void(表示不返回任何東西),其它函數可能帶一個或幾個參數並可能返回一個值。函數名規則與變數名相同。圖1.5顯示了函數的構成部分。新術語 參數(parameter)是傳遞給函數的值,用於改變操作或指示操作程度。
函數的構成部分使用函數前,要先進行聲明。函數聲明或原型(prototype)告訴編譯器函數所取的參數個數、每個參數的數據類型和函數返回值的數據類型。清單1.4列示了這個概念。新術語 原型(prototype)是函數外觀的聲明或其定義的說明。
㈡ C#網路游戲編程
用winform做游戲的書開發應該比較少見吧。
如果你技術上沒問題,那看書應該效果不大,因為書是給不會技術的人看的,至於技術學會了如何去實現理論,那永遠得自己想。
我是這樣想的,
網路上:
網路游戲一般都用UDP進行信息交流,這樣可以實現一對多傳輸,且無需像TCP那樣一一建立連接。用UdoClient或直接Socket類進行互交就可以了。
至於傳輸的內容,是各種游戲中的消息,最好在前幾個位元組設定消息類型。比如消息類型是出牌,後面的位元組就是具體哪張牌。消息類型是指令,後面的位元組就是對方是否贏了或者認輸等。
游戲界面上:(我覺得這個是難點,網路還是比較容易的)
你需要有一個明了的規劃。
數據上:比如每張牌用int還是枚舉,每張牌對應的圖像存成內置資源還是外部圖像。
界面上:2D的話GDI或GDI+就夠了,3D要另外調用DirectX API。
處理上:對接受的消息的應對,界面上有什麼調整,數據上有什麼調整。
㈢ 游戲編程
編程
這是每個游戲編程FAQ里都有的問題。這個問題每星期都會在游戲開發論壇上被問上好幾次。這是個很好的問題,但是,沒人能給出簡單的答案。在某些應用程序中,總有一些計算機語言優於其他語言。下面是幾種用於編寫游戲的主要編程語言的介紹及其優缺點。希望這篇文章能幫助你做出決定。
1、C語言
如果說FORTRAN和COBOL是第一代高級編譯語言,那麼C語言就是它們的孫子輩。C語言是Dennis Ritchie在七十年代創建的,它功能更強大且與ALGOL保持更連續的繼承性,而ALGOL則是COBOL和FORTRAN的結構化繼承者。C語言被設計成一個比它的前輩更精巧、更簡單的版本,它適於編寫系統級的程序,比如操作系統。在此之前,操作系統是使用匯編語言編寫的,而且不可移植。C語言是第一個使得系統級代碼移植成為可能的編程語言。
C語言支持結構化編程,也就是說C的程序被編寫成一些分離的函數呼叫(調用)的集合,這些呼叫是自上而下運行,而不像一個單獨的集成塊的代碼使用GOTO語句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的「空心粉式代碼」代碼要簡單得多。事實上,C仍然具有GOTO語句,不過它的功能被限制了,僅當結構化方案非常復雜時才建議使用。
正由於它的系統編程根源,將C和匯編語言進行結合是相當容易的。函數調用介面非常簡單,而且匯編語言指令還能內嵌到C代碼中,所以,不需要連接獨立的匯編模塊。
優點:有益於編寫小而快的程序。很容易與匯編語言結合。具有很高的標准化,因此其他平台上的各版本非常相似。
缺點:不容易支持面向對象技術。語法有時會非常難以理解,並造成濫用。
移植性:C語言的核心以及ANSI函數調用都具有移植性,但僅限於流程式控制制、內存管理和簡單的文件處理。其他的東西都跟平台有關。比如說,為Windows和Mac開發可移植的程序,用戶界面部分就需要用到與系統相關的函數調用。這一般意味著你必須寫兩次用戶界面代碼,不過還好有一些庫可以減輕工作量。
用C語言編寫的游戲:非常非常多。
資料:C語言的經典著作是《The C Programming Language》,它經過多次修改,已經擴展到最初的三倍大,但它仍然是介紹C的優秀書本。一本極好的教程是《The Waite Group's C Primer Plus》。
2、C++
C++語言是具有面向對象特性的C語言的繼承者。面向對象編程,或稱OOP是結構化編程的下一步。OO程序由對象組成,其中的對象是數據和函數離散集合。有許多可用的對象庫存在,這使得編程簡單得只需要將一些程序「建築材料」堆在一起(至少理論上是這樣)。比如說,有很多的GUI和資料庫的庫實現為對象的集合。
C++總是辯論的主題,尤其是在游戲開發論壇里。有幾項C++的功能,比如虛擬函數,為函數呼叫的決策制定增加了一個額外層次,批評家很快指出C++程序將變得比相同功能的C程序來得大和慢。C++的擁護者則認為,用C寫出與虛擬函數等價的代碼同樣會增加開支。這將是一個還在進行,而且不可能很快得出結論的爭論。
我認為,C++的額外開支只是使用更好的語言的小付出。同樣的爭論發生在六十年代高級程序語言如COBOL和FORTRAN開始取代匯編成為語言所選的時候。批評家正確的指出使用高級語言編寫的程序天生就比手寫的匯編語言來得慢,而且必然如此。而高級語言支持者認為這么點小小的性能損失是值得的,因為COBOL和FORTRAN程序更容易編寫和維護。
優點:組織大型程序時比C語言好得多。很好的支持面向對象機制。通用數據結構,如鏈表和可增長的陣列組成的庫減輕了由於處理低層細節的負擔。
缺點:非常大而復雜。與C語言一樣存在語法濫用問題。比C慢。大多數編譯器沒有把整個語言正確的實現。
移植性:比C語言好多了,但依然不是很樂觀。因為它具有與C語言相同的缺點,大多數可移植性用戶界面庫都使用C++對象實現。
使用C++編寫的游戲:非常非常多。大多數的商業游戲是使用C或C++編寫的。
資料:最新版的《The C++ Programming Language》非常好。作為教程,有兩個陣營,一個假定你知道C,另外一個假定你不知道。到目前為止,最好的C++教程是《Who's Afraid of C++》,如果你已經熟知C,那麼試一下《Teach Yourself C++》。
3、我該學習C++或是該從C開始
我不喜歡這種說法,但它是繼「我該使用哪門語言」之後最經常被問及的問題。很不幸,不存在標准答案。你可以自學C並使用它來寫程序,從而節省一大堆的時間,不過使用這種方法有兩個弊端:
你將錯過那些面向對象的知識,因為它可能在你的游戲中使得數據建模更有效率的東西。
最大的商業游戲,包括第一人稱射擊游戲很多並沒有使用C++。但是,這些程序的作者即使使用老的C的格式,他們通常堅持使用面向對象編程技術。如果你只想學C,至少要自學OO(面向對象)編程技術。OO是模擬(游戲)的完美方法,如果你不學習OO,你將不得不「辛苦」的工作。
4、匯編語言
顯然,匯編是第一個計算機語言。匯編語言實際上是你計算機處理器實際運行的指令的命令形式表示法。這意味著你將與處理器的底層打交道,比如寄存器和堆棧。如果你要找的是類英語且有相關的自我說明的語言,這不是你想要的。
確切的說,任何你能在其他語言里做到的事情,匯編都能做,只是不那麼簡單 — 這是當然,就像說你既可以開車到某個地方,也可以走路去,只是難易之分。話雖不錯,但是新技術讓東西變得更易於使用。
總的來說,匯編語言不會在游戲中單獨應用。游戲使用匯編主要是使用它那些能提高性能的零零碎碎的部分。比如說,毀滅戰士整體使用C來編寫,有幾段繪圖程序使用匯編。這些程序每秒鍾要調用數千次,因此,盡可能的簡潔將有助於提高游戲的性能。而從C里調用匯編寫的函數是相當簡單的,因此同時使用兩種語言不成問題。
特別注意:語言的名字叫「匯編」。把匯編語言翻譯成真實的機器碼的工具叫「匯編程序」。把這門語言叫做「匯編程序」這種用詞不當相當普遍,因此,請從這門語言的正確稱呼作為起點出發。
優點:最小、最快的語言。匯編高手能編寫出比任何其他語言能實現的快得多的程序。你將是利用處理器最新功能的第一人,因為你能直接使用它們。
缺點:難學、語法晦澀、堅持效率,造成大量額外代碼 — 不適於心臟虛弱者。
移植性:接近零。因為這門語言是為一種單獨的處理器設計的,根本沒移植性可言。如果使用了某個特殊處理器的擴展功能,你的代碼甚至無法移植到其他同類型的處理器上(比如,AMD的3DNow指令是無法移植到其它奔騰系列的處理器上的)。
使用匯編編寫的游戲:我不知道有什麼商業游戲是完全用匯編開發的。不過有些游戲使用匯編完成多數對時間要求苛刻的部分。
資料:如果你正在找一門匯編語言的文檔,你主要要找晶元的文檔。網路上如Intel、AMD、Motorola等有一些關於它們的處理器的資料。對於書籍而言,《Assembly Language: Step-By-Step》是很值得學習的。
5、Pascal語言
Pascal語言是由Nicolas Wirth在七十年代早期設計的,因為他對於FORTRAN和COBOL沒有強制訓練學生的結構化編程感到很失望,「空心粉式代碼」變成了規范,而當時的語言又不反對它。Pascal被設計來強行使用結構化編程。最初的Pascal被嚴格設計成教學之用,最終,大量的擁護者促使它闖入了商業編程中。當Borland發布IBM PC上的 Turbo Pascal時,Pascal輝煌一時。集成的編輯器,閃電般的編譯器加上低廉的價格使之變得不可抵抗,Pascal編程了為MS-DOS編寫小程序的首選語言。
然而時日不久,C編譯器變得更快,並具有優秀的內置編輯器和調試器。Pascal在1990年Windows開始流行時走到了盡頭,Borland放棄了Pascal而把目光轉向了為Windows 編寫程序的C++。Turbo Pascal很快被人遺忘。
最後,在1996年,Borland發布了它的「Visual Basic殺手」— Delphi。它是一種快速的帶華麗用戶界面的 Pascal編譯器。由於不懈努力,它很快贏得了一大群愛好者。
基本上,Pascal比C簡單。雖然語法類似,它缺乏很多C有的簡潔操作符。這既是好事又是壞事。雖然很難寫出難以理解的「聰明」代碼,它同時也使得一些低級操作,如位操作變得困難起來。
優點:易學、平台相關的運行(Delphi)非常好。
缺點:「世界潮流」面向對象的Pascal繼承者(Mola、Oberon)尚未成功。語言標准不被編譯器開發者認同。專利權。
移植性:很差。語言的功能由於平台的轉變而轉變,沒有移植性工具包來處理平台相關的功能。
使用Pascal編寫的游戲:幾個。DirectX的Delphi組件使得游戲場所變大了。
資料:查找跟Delphi有關的資料,請訪問:Inprise Delphi page。
6、Visual Basic
哈,BASIC。回到八十年代的石器時代,它是程序初學者的第一個語言。最初的BASIC形式,雖然易於學習,卻是可怕的無組織化,它義無反顧的使用了GOTO充斥的「空心粉式代碼」。當回憶起BASIC的行號和GOSUB命令,沒有幾個人能止住眼角的淚水。
快速前進到九十年代早期,雖然不是蘋果公司所希望的巨人,HyperCard仍然是一個在Windows下無法比擬的吸引人的小型編程環境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂貴。為了與HyperCard一決高下,微軟取得了一個小巧的名為Thunder編程環境的許可權,並把它作為Visual Basci 1.0發布,其用戶界面在當時非常具有新意。這門語言雖然還叫做Basic(不再是全部大寫),但更加結構化了,行號也被去除。實際上,這門語言與那些內置於TRS-80、Apple II及Atari里的舊的ROM BASIC相比,更像是帶Basic風格動詞的Pascal。
經過六個版本,Visual Basic變得非常漂亮。用戶界面發生了許多變化,但依然保留著「把代碼關聯到用戶界面」的主旨。這使得它在與即時編譯結合時變成了一個快速原型的優異環境。
優點:整潔的編輯環境。易學、即時編譯導致簡單、迅速的原型。大量可用的插件。雖然有第三方的DirectX插件,DirectX 7已准備提供Visual Basic的支持。
缺點:程序很大,而且運行時需要幾個巨大的運行時動態連接庫。雖然表單型和對話框型的程序很容易完成,要編寫好的圖形程序卻比較難。調用Windows的API程序非常笨拙,因為VB的數據結構沒能很好的映射到C中。有OO功能,但卻不是完全的面向對象。專利權。
移植性:非常差。因為Visual Basic是微軟的產品,你自然就被局限在他們實現它的平台上。也就是說,你能得到的選擇是:Windows,Windows或Widnows。當然,有一些工具能將VB程序轉變成Java。
使用Visual Basic編寫的游戲:一些。有很多使用VB編寫的共享游戲,還有一些是商業性的。
資料:微軟的VB頁面有一些信息。
7、Java
Java是由Sun最初設計用於嵌入程序的可移植性「小C++」。在網頁上運行小程序的想法著實吸引了不少人的目光,於是,這門語言迅速崛起。事實證明,Java不僅僅適於在網頁上內嵌動畫 — 它是一門極好的完全的軟體編程的小語言。「虛擬機」機制、垃圾回收以及沒有指針等使它很容易實現不易崩潰且不會泄漏資源的可靠程序。
雖然不是C++的正式續篇,Java從C++ 中借用了大量的語法。它丟棄了很多C++的復雜功能,從而形成一門緊湊而易學的語言。不像C++,Java強制面向對象編程,要在Java里寫非面向對象的程序就像要在Pascal里寫「空心粉式代碼」一樣困難。
優點:二進制碼可移植到其他平台。程序可以在網頁中運行。內含的類庫非常標准且極其健壯。自動分配合垃圾回收避免程序中資源泄漏。網上數量巨大的代碼常式。
缺點:使用一個「虛擬機」來運行可移植的位元組碼而非本地機器碼,程序將比真正編譯器慢。有很多技術(例如「即時」編譯器)很大的提高了Java的速度,不過速度永遠比不過機器碼方案。早期的功能,如AWT沒經過慎重考慮,雖然被正式廢除,但為了保持向後兼容不得不保留。越高級的技術,造成處理低級的機器功能越困難,Sun為這門語言增加新的「受祝福」功能的速度實在太慢。
移植性:最好的,但仍未達到它本應達到的水平。低級代碼具有非常高的可移植性,但是,很多UI及新功能在某些平台上不穩定。
使用Java編寫的游戲:網頁上有大量小的Applet,但僅有一些是商業性的。有幾個商業游戲使用Java作為內部腳本語言。
資料:Sun的官方Java頁面有一些好的信息。IBM也有一個非常好的Java頁面。JavaLobby是一個關於Java新聞的最好去處。
8、創作工具
上面所提及的編程語言涵蓋了大多數的商業游戲。但是也有一個例外,這個大游戲由於它的缺席而變得突出。
「神秘島」。沒錯,賣得最好的商業游戲不是使用以上任何一門語言編的,雖然有人說「神秘島」99%是使用 3D建模工具製作的,其根本的編程邏輯是在HyperCard里完成的。
多數創作工具有點像Visual Basic,只是它們工作在更高的層次上。大多數工具使用一些拖拉式的流程圖來模擬流程式控制制。很多內置解釋的程序語言,但是這些語言都無法像上面所說的單獨的語言那樣健壯。
優點:快速原型 — 如果你的游戲符合工具製作的主旨,你或許能使你的游戲跑得比使用其他語言快。在很多情況下,你可以創造一個不需要任何代碼的簡單游戲。使用插件程序,如Shockware及IconAuthor播放器,你可以在網頁上發布很多創作工具生成的程序。
缺點:專利權,至於將增加什麼功能,你將受到工具製造者的支配。你必須考慮這些工具是否能滿足你游戲的需要,因為有很多事情是那些創作工具無法完成的。某些工具會產生臃腫得可怕的程序。
移植性:因為創作工具是具有專利權的,你的移植性以他們提供的功能息息相關。有些系統,如Director可以在幾種平台上創作和運行,有些工具則在某一平台上創作,在多種平台上運行,還有的是僅能在單一平台上創作和運行。
使用創作工具編寫的游戲:「神秘島」和其他一些同類型的探險游戲。所有的Shockwave游戲都在網路上。
資料:Director、HyperCard、SuperCard、IconAuthor、Authorware。
9、易語言
★全中文支持,無需跨越英語門檻。★全可視化編程,支持所見即所得程序界面設計和程序流程編碼。★中文語句快速錄入。提供多種內嵌專用輸入法,徹底解決中文語句輸入速度慢的問題。★代碼即文檔。自動規范強制代碼格式轉換,任何人編寫的任何程序源代碼格式均統一。★參數引導技術,方便程序語句參數錄入。★無定義類關鍵字。所有程序定義部分均採用表格填表方式,用戶無需記憶此類關鍵字及其使用格式。★命令格式統一。所有程序語句調用格式完全一致。★語法格式自動檢查。自動檢查並提示所輸入語句的語法格式是否正確,且可自動添加各類名稱。★全程提示與幫助。滑鼠停留立即顯示相關項目提示。編程時提示語法格式,調試時提示變數當前內容,隨時按下F1鍵可得到與當前主題相關詳細幫助等。★名稱自動管理。用戶修改任一名稱定義,其它所有包含該名稱的程序代碼均自動修正。★集成化開發環境。集界面設計、代碼編寫、調試分析、編譯打包等於一體。★學習資源豐富。詳細的幫助文件、數十兆的知識庫、數萬用戶的網上論壇、教材已出版發行……
10、結論
你可能希望得到一個關於「我該使用哪種語言」這個問題的更標準的結論。非常不幸,沒有一個對所有應用程序都最佳的解決方案。C適於快而小的程序,但不支持面向對象的編程。C++完全支持面向對象,但是非常復雜。Visual Basic與Delphi易學,但不可移植且有專利權。Java有很多簡潔的功能,但是慢。創作工具可以以最快的速度產生你的程序,但是僅對某一些類型的程序起作用。最好的方法是決定你要寫什麼樣的游戲,並選擇對你的游戲支持最好的語言。「試用三十天」的做法成為工業標準是件好事情。
㈣ 游戲編程應如何入門
這是windows的經典開發模式,推薦參看《windows程序設計》,北京大學出版社的,最最最最經典的windows編程模式。
㈤ 一般游戲編程用什麼語言和軟體
下面是游戲開發十大編程語言的列表。
1、C類#
C語言現在被廣泛應用於許多游戲引擎中,是最流行的游戲開發語言之一。它有一個XNA框架、一套微軟工具和運行時環境,使它特別適合Xbox或windows上的游戲。如果你想使用monogame在幾乎任何平台上發布游戲,這是一種很好的語言。
2、C類++
C++是一種面向對象的語言,被認為是最難學習的語言之一,但它是游戲開發人員的重要語言。它允許對硬體和圖形進程進行更直接的控制,這對行業很重要,是一些流行游戲引擎的流行語言。它還提供了對參數和內存管理的大量控制,從而提高了游戲的性能和用戶體驗。
3、Java
Java使用與C++相同的面向對象原則,但提供了更廣泛的系統。Java代碼通常在Java虛擬機(JVM)上運行,並轉換為可在任何系統上執行的通用位元組碼。因此,Java是為數不多的能夠讓開發人員為任何給定系統開發游戲的游戲編程語言之一。它是最好的游戲編程語言之一。
4、JavaScript
JavaScript是最流行的游戲編程語言之一,尤其是作為一種在線交互語言。使用JavaScript,可以更容易地將代碼與傳統的網路技術(如HTML和CSS)集成,從而導致越來越多的跨平台移動游戲。
5、HTML5
HTML5已經成為互聯網上最常見的游戲編程語言之一。你今天玩的大多數手機游戲都使用這種標記語言。使用JavaScript很容易創建復雜的基於web的游戲。該語言簡單易學,不一定需要學習復雜的演算法編程知識,因此成為游戲開發者的熱門選擇。
6、SQL語言
SQL被玩家用來訪問後端帳戶並在伺服器上執行其他操作。有新的語言,庫,框架,特別是AR,VR,圖形,物理和游戲。
7、Python
Python是另一種提供OOP方法的語言,是游戲開發人員使用的最易於使用的通用編程語言之一。它有一個pyGame框架,允許程序員快速開發游戲原型。
8、Rust
鐵銹被吹捧為C的繼承者之一。它主要被Mozilla基金會用作系統編程語言。它具有面向對象到面向數據的方法,有助於游戲開發。
9、UnrealScript
Unrealscript是unreal引擎的本機腳本語言。它結合了面向對象、多重繼承和功能豐富的游戲等復雜功能。該語言支持所有主要的游戲平台,如微軟Windows、MacOS、Linux、steamos、Android和PlaystationVR。
10、Lua
由於語言結構和語法簡單,Lua正成為游戲界最流行的語言之一。它是一種多平台腳本語言,許多現代游戲引擎都使用Lua作為主要的游戲設計編程語言。
㈥ 有哪位做游戲編程的請幫忙解釋一下這段代碼
mode=life 模式=按照具體參數來設定特效持續時間 這里也可以寫loop(循環)waitalldead(等待所有特效消失後特效才能消失)一般用於第一行的mode
model=.../data.........tx_074——s03_2_01.x 特效路徑 可以更改路徑來做到更改出現的特效
life=2000 這一段 如果上面的是mode=life 下面的life才會起效 「=」後面的數字2000單位是毫秒 1秒=2000 life=2000代表特效持續2秒後消失 [如果上面的mode=loop 這里吧life=2000改成「loop=(你想要這個特效循環的次數)」即可 如果上面mode=waitalldead 下面的life=2000就可以直接刪掉了]
num=1 前面的num是特效數量 後面的1 是數量的參數 想在後面增加特效 就在這個num=的原本數量後面+上想加的特效數量 比如要寫1個特效進去 原本裡面就有一個 那麼這里就要填2
delay=0 這個是特效消失時間 一般在這里不需要改 下面的都不要動
往下找到[Instance] 這個代表特效的編號 後面什麼都不加 代表第一個特效 後面有個1 代表第二個特效 以此類推
Sound=..\Data\Audio\Skill\yueyetu\paopaotang_start.ogg 這個代表特效附帶的音效文件目錄 刪掉這行特效音效就會消失 改變音效目錄特效音效也會跟著改變 沒什麼好說的
Mode=life 最先需要明白的一點是:這里的mode 優先順序低於最上面的mode 如果上面寫的mode等於life 且life=xxx 上面的mode=life里已經設定好了特效時間 那麼下面不管寫什麼都沒意義 如果上面寫的是mofe=waitalldead 下面的mode=life或loop才會成功 寫這個mode的方法跟上面說的一樣
Loop=life 這個基本上不需要改 除非上面的mode=loop 下面的loop才需要改成1 2 3 4這樣的明確數值
Scale=1.1f代表特效大小 後面的參數可以隨意調整
DeadRenderTime=300 代表特效消失的時候 消失漸變所需要的時間
Bind =Lefthand //左手
=Righthand //右手
=body //身體
=foot //滑鼠點擊的地面
Action=Spray //特效在原地
=Follow //特效在身上
ActionTime=0 這個代表特效的出現時間 單位也是毫秒 1s=1000
TrackType=Line 比如你放出一個模型來特效不會跟著你轉身而轉身 那麼用了這個代碼之後 特效會跟著你的角度一起轉
ParaHeight=0.0f 這個代表特效的轉動角度 後面的參數同樣可以用來設置需要轉動角度的數值
㈦ 如何正確的使用UNITY3D製作FPS游戲
第一部分:簡介
這個教程中,我們詳細了解下如何製作一個簡單的第一人稱射擊游戲(FPS)。其中將介紹一些基本的3D游戲編程的概念和一些關於怎樣如游戲程序員般思考的技巧。
前提
這個教程假定你已經熟悉軟體Unity基本操作,掌握了基本的腳本概念。
創建新工程
下載FPS_Tutorial.zip壓縮文件,解壓,在Unity中打開工程文件。
從Unity安裝目錄導入Standard Assets資源包。
導入工程後,你會在Unity工程面板中的「Standard Assets」文件夾下看見這些資源內容。當我們導入新資源時,最好安裝按照資源功能對其分組,例如:火箭、爆炸、音頻等。
設置游戲環境
導入資源後,你會注意到在工程面板中有許多文件夾。
工程面板中,從文件夾「Object/mainLevelMesh」中選擇「mainLevelMesh」。
在參數面板,FBXImporter選項中,你會發現「Generate Colliders」選項,勾選此選項。如果不做這一步,游戲中玩家會穿越地面直接掉下深淵(實際是開啟「碰撞」,產生交互)
把「mainLevelMesh」拖放到場景中。
場景中不需要添加燈光,這關全部場景已經全部應用了燈光貼圖。整個場景對所有燈光進行了燈光貼圖渲染,使用了「預烘焙陰影」。燈光貼圖對顯示效果有很大幫助,特別是復雜燈光環境。
下面可以在場景中添加一個角色了。
添加主要角色
下面在場景中增加一個可以操控的角色物體。Unity針對第一人稱射擊游戲預置了許多內置的控制器,在工程面板Standard Assets->;Prefabs下。
添加第一人稱控制器,點擊工程面板Standard Assets旁邊的小三角,彈出資源列表。找到Prefabs文件夾,點擊小三角形,彈出資源列表。把「First person controller」拖到場景里。
這時場景中會出現一個代表玩家的圓柱體,三個大箭頭代表物體在3D空間中的位置(如果沒有看見箭頭,選擇物體,按「W」鍵),白色面代表物體當前視角。現在FPS控制器處於默認視角位置,通過移動它可以改變游戲視野。把角色移動到游戲環境關卡地面上面的位置。
Main Camera現在已經沒有用處了,可以刪掉了。
點擊「Play」鍵,現在應該可以通過使用滑鼠和鍵盤在本關卡地形中四處移動了(游標或者「W,A,S,D」)
現在我們創建了一個非常簡單的FSP,下面我們給角色添加武器。
增加武器
下面我們將給游戲角色一個類似榴彈的物體,可以在游戲中發射。要實現這個功能,需要創建一些腳本語言來在Unity中告知這個武器如何動作。
那麼我們具體要實現什麼呢?我們要使游戲角色能在攝像機的任意位置開火。但是,我們還是首先來思考一下游戲角色和武器。游戲角色游戲中是第一人稱的視角,所以攝像機的位置與眼睛平行。如果玩家使用武器射擊,武器應該是在角色的手部位置開火而不是眼睛的位置。這樣我們就要增加一個「game object」(游戲物體)來代表榴彈發射器,同時把它放置在游戲角色手持武器時武器所處的位置。這樣就保證了開火的位置沒有問題。
創建武器發射器
首先,創建一個「game object」代表榴彈發射器。游戲物體是3D世界中的任一物體(角色、關卡、聲音),零件就是游戲物體的屬性。因此我們還需要對游戲物體添加零件:
從主菜單欄選擇GameObject>Great Empty,並在層級面板中(Hierarchy)命名為「Launcher」。注意,空物體在場景中是看不見的,只是用它來作放置飛彈發射器。
現在在場景中把視野推近到FPS控制器,便於我們放置武器發射器。
層級面板中選擇FPS控制器,確保滑鼠處於場景視圖中,按「F」鍵。使窗口以當前選擇的物體為中心。
層級面板中選擇發射器,主菜單欄選擇Game Object>Move to view。注意發射器如何移動到FPS控制器附近的。然後使用手柄,把發射器移動到大概角色手部的位置。
注意:可以通過設置這個物體的位置來設定游戲角色是左撇子還是右撇子,不需要寫代碼。
使Unity窗口模式是「2by3」模式(window>Layouts>2by3),點擊播放鍵(play)。確保層級面板中點選了發射器,四處移動角色,同時觀察場景窗口。你將發現發射器並沒有隨著角色一起運動(現在再次點擊播放鍵停止運行游戲)
下面來解決這個問題,層級面板中,把發射器拖放到FPS控制器下面的主攝像機上。彈出的對話框點擊「是」。再次運行游戲,觀察場景窗口,發射器已經和角色運動一致了。這樣我們就把發射器與攝像機關聯起來了。
創建飛彈
下面我們來創建在玩家點擊開火鍵時能夠發射出來的飛彈。
我們先用一個簡單物體-球體-代替飛彈。Unity主菜單欄點擊Assets>Creat>;Prefab創建一個預制(Prefab)物體,命名為「Missile」
創建一個球體(GameObject>Create Object>Sphere)
層級面板中,拖放球體到飛彈預制物體上(Missile),這時預制物體圖標會變化。你可以從層級面板中刪除球體。
技巧:游戲運行中產生的任何游戲物體都應該是預制物體(Prefab)。
編寫飛彈發射器腳本
FPS控制器是一個包含了幾個游戲物體和部件的預制物體。FPS控制器本身是一個只能沿Y軸旋轉的圓柱體,因此,如果我們直接把發射器腳本賦予FPS控制器的話,是實現不了上下開火的。所以我們把腳本賦予控制器中的能夠四周轉動的主攝像機。
下面我們來編寫第一個描述發射器行為的JavaScript代碼。
點擊Assets>Greate>JavaScript,創建一個空的JavaScript文檔。一個名為「NewBehaviourScript」資源將會出現在工程面板中,把它更名為「MissileLauncher」
技巧:通過Unity>;Preferences點擊External Script Editor,可以自定義外部腳本編輯器。
工程面板中創建一個「WeaponScripts」文件夾,放置我們所有的武器腳本。把MissileLauncher腳本和飛彈預制物體(Missile Prefab)拖到這個文件中。
我們來看看飛彈發射器的完整JavaScript腳本。
進一步思考一下,我們到底想實現什麼效果?我們要檢測玩家是否按了開火鍵,然後產生一枚飛彈,然後把它沿著玩家朝向的方向按照一定的速度發射出去。我們仔細的解剖一下腳本:
var projectile: Rigibody;
var speed=20;
function Update( )
{
這是腳本的開頭部分,定義了一些屬性,開啟了「Update」的功能
if(Input.GetButtonDown(「Fire1」))
首先我們要檢測玩家是否按了開火鍵,「開火1」映射的是滑鼠左鍵和當前配置的鍵盤上的按鍵(可以通過主菜單欄的Editor>;Project Settings>Input設定)
{
var instantiatedProjectile: Rigidbody=Instantiate(
projectile, transform.position,transform.rotation);
我們用變數來定義產生的物體。變數的類型是Rigibody(剛體),因為飛彈是具有物理屬性的。
Unity中產生新物體使用的函數是Instantiate,它有三個參數,分別是:產生的物體、產生物體的3D空間位置、物體的旋轉。它還有另一個語法結構,參照API手冊,這里我們只使用這種結構。
第一個參數,projectile,代表我們想創建的物體。那麼到底發射什麼物體?具體產生的物體是可以手動設定的。實現方法:把Projectile定義為函數的外部變數,這樣就可以在參數面板中顯示出來。發射的物體也可以通過代碼來創建,但如果你想使一個變數可調的話,還是用上面的方法。
第二個參數,transform.position,使產生的物體與發射器的空間位置一致。為什麼就是發射器呢?因為如果要使飛彈產生的位置沒有問題,腳本就要關聯給發射器。(transform讀取的transform數據就是被賦予腳本的游戲物體transform數據)
第三個參數transform.rotation,與第二個類似,只是它的值與發射器的旋轉值是一樣的。
代碼的下一部分使飛彈產生運動。為了實現運動,我們要賦予飛彈一個速度,但是在哪個方向上(X,Y,Z)產生速度呢?在場景中,點擊FPS控制器,出現運動箭頭(如果沒有出現,按「W」鍵),其中一個箭頭是紅色、一個是綠色、一個是藍色。紅色代表X軸,綠色代表Y軸,藍色代表Z軸。因為藍色指向的方向,與玩家面朝的方向一致,所以我們要在Z軸上給飛彈一個速度。
(Velocity)速度是instantiatedProjectile的一個屬性。我們怎麼知道的呢?因為instantiatedProjectile是剛體的一種,如果我們看看API手冊,我們就會知道速度是剛體的屬性中的一種。同時也看看剛體的其它屬性。要設置速度,我們就必須在各個軸向上設定數值。但還有個小問題。3D空間中的物體一般使用兩種坐標模型:本地坐標系和世界坐標系。在本地坐標系中,物體的軸向只與物體本身有關。在世界坐標系中,軸向是絕對的,例如:向上,對所有物體來講向上的方向都是一樣的。
Rigidbody.Vellocity剛體物體速度必須使用世界坐標系。因此,定義速度時,需要把本地坐標系中的Z軸(朝前的方向)向轉換成世界坐標系中的相應方向。可以用函數transform.TransformDirection,它有三個向量作為自變數。變數speed也應該定義成外部變數,便於後面在編輯器中直接調節數值。
最後,我們要關閉飛彈與游戲角色之間的碰撞。如果不這樣做的話,飛彈產生的時候就可能與角色發生碰撞。可以在API手冊IgnoreCollision下查詢詳細信息。
MissileLauncher.js全部完整代碼如下:
把腳本MissileLauncher賦予FPS控制器中的發射器。在層級面板中點擊發射器,檢查一下參數面板下面是否顯示了MissileLauncher script。
先前創建的飛彈的預制物體還沒有與腳本中的變數projectile創建關聯,我們需要在編輯器中創建一下。變數projectile只能與剛體關聯,因此,首先我們要賦予飛彈一個Rigidbody。
工程面板中點擊飛彈,然後從主菜單欄選擇Components>;Physics>Rigidbody。這樣將會給我們想開火發射的飛彈一個剛體屬性。我們必須確保想在游戲中發射的物體類型與腳本中外部變數要求的物體類型是同一類型的物體。
創建飛彈與腳本中變數projectile的鏈接。首先在層級面板中點擊發射器,然後把飛彈的預制物體從工程面板中拖拽放置在發射器參數面板中MissileLauncher script部分上。
運行游戲的話,你會發現點擊開火鍵可以發出一個受重力影響的小球了。
飛彈爆炸
下面,當飛彈與其他物體發生碰撞時,增加一個爆炸效果。要實現這個效果,我們要編寫一段新腳本賦予飛彈。
創建一個新腳本,命名為Projectile。拖放到工程面板的WeaponScripts文件夾下。
那麼我們想要腳本Projectile實現什麼樣的效果呢?我們要檢測飛彈是否發生碰撞,然後在碰撞點產生一個爆炸效果。代碼如下:
函數OnCollisionEnter內的程序代碼的作用是計算被賦予腳本的物體是否與其他物體發生碰撞。
在函數OnCollisionEnter中我們主要是要實現在3D空間中飛彈發生碰撞的點產生一個新爆炸。那麼在何處了碰撞的呢?函數OnCollisionEnter就有個記錄這個信息的功能。碰撞發生的點的信息儲存在變數ContactPoint中。
這里我們使用函數Instantiate來創建一個爆炸。我們已經知道函數instatiate有三個參數:(1)產生的物體(2)物體的3D空間位置
(3)物體的旋轉。
第一個參數,後面我們將會賦給一個帶粒子系統的游戲物體。同時我們還想通過編輯器來實現這個功能,所以我們把變數設置為外部變數。
第二個參數,爆炸產生的點的位置,就是碰撞發生的位置。
第三個參數,爆炸旋轉的設置,需要解釋一下。我們需要爆炸體的Y軸方向與飛彈和其他物體發生碰撞的那個表面的法線方向一致。這就是說如果是牆面那麼爆炸就面向外,如果是地板就朝上。那麼實際上我們就是要使爆炸體在本地坐標系的Y軸與飛彈與之碰撞的物體的表面法線方向(世界坐標系)一致。
最後,我們要讓飛彈碰撞後就從游戲中消失,通過函數Destroy()實現,它的參數是gameObject(gameObject代表被賦予這個腳本的物體)。
Projectile.js全部代碼如下:
把腳本賦予飛彈預制物體(Missile prefab)。
下面我們要創建飛彈發生碰撞時所產生爆炸的爆炸效果物體。
首先,創建一個新的預制物體(命名為Explosion)用來存放爆炸效果資源。
標准資源包中(standard asset)有個不錯的爆炸預制物體,粒子系統和燈光都設置好了。把這個爆炸預制物體(在Standard Assets/Particles/explosion中)拖放到層級面板。
調節這個爆炸效果的各個參數直到你覺得滿意,然後把它從層級面板中拖放到工程面板中的爆炸預制物體(Explosion Prefab)中。
現在把爆炸配置給飛彈:
點選飛彈預制物體(Missile Prefab),在參數面板Explosion變數欄,拖放工程面板中的爆炸到上面。
定義爆炸的行為
下面我們要再創建一個腳本來定義爆炸自身的特性。
創建一個新的腳本-Explosion,放在Weapons文件夾中,雙擊腳本進行編輯。
腳本中另一個常用函數稱為Start()。當它配置給的物體是在游戲中產生的時候,函數Start()中的代碼只被執行一次。我們要實現的效果就是在一定時間後,在游戲中刪除爆炸。我們通過函數Destroy()的第二個參數實現,它的作用是定義執行刪除前的時間長度。
變數explosionTime設置成外部變數,方便調節。
新建腳本插入以上代碼時,要刪除函數Update()。
把腳本Explosion賦予給爆炸預制物體。
音效
目前的游戲世界太安靜了,讓我們給爆炸效果增加點音效。
首先,給爆炸預制(Prefab)添加一段音頻。
給爆炸添加音效前,我們首先要添加一個音源部件(Audio Source),在主菜單點擊Component—Audio—Audio Source。你會發現音源部件有一個Audio Clip的屬性。
把「RocketLauncherImpact」音效添加給爆炸預制體的AudioClip外部變數。Unity支持多種音頻格式。
運行游戲,發射飛彈的時候就有聲音了!
添加圖形界面
下面我們來添加GUI,有點像頭部顯示設備(HUD)。我們要做的GUI非常簡單,就一個準星。
添加一個準星:
工程欄中創建一個GUI的文件夾。
創建一個新腳本,命名為「準星」(Crosshair),拖到GUI文件夾。
Crosshair中寫入下面的腳本:
首先我們設定了兩個變數。第一個變數是定義我們將要用可選的方式來選擇圖形紋理。第二個變數定義了一個方形區間,它是圖形紋理在屏幕上的位置范圍。
在start( ) 中函數用來設定圖形紋理在屏幕上的位置。函數中,有四個參數,用來定義方形區域的大小和位置。第一個參數定義了方形區域的左邊框,第二個是底邊框,第三和第四個參數定義了寬和高。
OnGUI( )函數中,使用GUI類程序來讓圖形顯示在屏幕上。DrawTexture( )函數的參數position和crosshairTexture將使準星顯示在屏幕的中央位置。
保存腳本。
創建一個新的空物體,命名為「GUI」。
把腳本「Crosshair」賦予給GUI物體。
點選GUI物體,把在文件夾Texturelaim下的欲使用的圖形拖放到參數面板變數Crosshair Texture中。
運行游戲,屏幕中就會有準星顯示了。
物理特效:
現在,我們想要游戲中的物體效果越真實越好,這是通過添加物理特效實現的。在這一節中,我們將在環境中添加一些物體,他們能被飛彈擊中後有相應的反應。首先有幾個新概念要解釋下。
校正(Update)
先前,我們在函數Update()中寫入代碼,這樣可以在每一幀都執行其中的代碼。其中有個例子是檢測玩家點擊開火鍵。幀速並不是一個固定值,它是根據場景復雜度等因素來定的。各幀之間的時間差會導致不穩定的物體反應。因此,如果想在場景中添加有物理反應的物體(剛體等),代碼就應該寫在函數FixedUpdate()中。Unity中deltaTime的值用來測定渲染兩個連續幀的所用時間。
一般而言,函數Update與FixedUpdate之間的區別如下:
Update()-其中的代碼通常用於角色行為、游戲邏輯等。這個函數中的deltaTime值並不是固定的。
FixedUpdate()-其中的代碼通常用於剛體物體(物理屬性的行為)。函數中deltaTime的值通常是固定的。
FixedUpdate函數被調用的頻率是主菜單中Edit-Project Settings-Time的FixedTimestep屬性確定的,當然也是可以更改的。第二個屬性Time Scale是讀取每秒的幀速和相應的倒數值。
技巧:定義FixedTimestep值時,要注意把握好一個平衡:值越小,物理效果越真實越好,但影響游戲運行速度。應該同時確保游戲運行速度和物理效果的真實性。
最後說一下yield,它相當於暫停當前正在執行的函數。
回到游戲,我們想實現的效果:
使玩家可以發射飛彈(已經實現了)。
如果飛彈與其它剛體物體發生碰撞,檢測其范圍類是否有其它被賦予剛體屬性的物體。
對爆炸沖擊力范圍內的每個剛體物體,均給予一個upwards方向上的力,使它們對飛彈產生反應。
讓我們看看修改後的爆炸腳本(Explosion Javascript)
首先檢測下飛彈落點周圍是否有帶碰撞器的物體。函數Physics.OverlapSphere()有兩個參數:3D位置和半徑值,然後返回一組檢測到的在半徑內的碰撞器的數組。
一旦得到這些數組後,就會對每個對應碰撞器的剛體物體一個在特定方向上的力。
然後我們在飛彈的炸點處,向上的方向增加一個力(ExplosionPower)。但是,爆炸效果是隨著距離而遞減的,作用力大小不能在整個半徑內都一樣。圓周位置的剛體物體受到的作用力應該比炸點中心處小。函數把這種效果也考慮在內的。通過調節外部變數explosionPower和explosionRadius的值,可以較容易的得到想要的效果。
㈧ 編寫游戲程序
做網路游戲 視頻教材基本上都是國外的,你能不能看懂英語很重要
我給你的建議:
先學編程(VC或者C) 然後學習圖形圖象 其中有opengl 和dx 看你的方向如何.其中會有很多演算法需要學習,所以數學很重要,這個時候你能做成一些場景了 然後學習腳本編程... 當然網路編程要會哦
很漫長的過程,數學,物理,藝術,都會涉及到哦..
OPENGL寶典 vc++ 游戲編程 XX游戲腳本編程 關卡設計............
------------------------
我以前的回答。單機游戲和網路游戲的基礎都是編程
先學語言。只是你初中生數學不夠。。。
㈨ 一種C語言小游戲程序設計(程序已經附上)
"掃雷"小游戲C代碼
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循環變數*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*標記*/
int m,n,lei; /*計數*/
int u,v; /*輸入*/
int hang,lie,ge,mo; /*自定義變數*/
srand((int)time(NULL)); /*啟動隨機數發生器*/
leb1: /*選擇模式*/
printf("
請選擇模式:
1.標准 2.自定義
");
scanf("%d",&mo);
if(mo==2) /*若選擇自定義模式,要輸入三個參數*/
{do
{t=0; printf("請輸入
行數 列數 雷的個數
");
scanf("%d%d%d",&hang,&lie,&ge);
if(hang<2){printf("行數太少
"); t=1;}
if(hang>100){printf("行數太多
");t=1;}
if(lie<2){printf("列數太少
");t=1;}
if(lie>100){printf("列數太多
");t=1;}
if(ge<1){printf("至少要有一個雷
");t=1;}
if(ge>=(hang*lie)){printf("雷太多了
");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否則就是選擇了標准模式(默認參數)*/
for(i=1;i<=ge;i=i+1) /*確定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i<=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i<=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i<=hang;i=i+1) /*計算b中數字*/
{for(j=1;j<=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i<=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}
lei=ge; /*以下是游戲設計*/
do
{leb2: /*輸出*/
system("cls");printf("
");
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei);
printf("
|");
for(j=1;j<=lie;j=j+1){printf("---|");}
printf("
");
}
scanf("%d%c%d",&u,&w,&v); /*輸入*/
u=u+1,v=v+1;
if(w!='#'&&a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打開0區*/
t=0;
if(a[u][v]=='0')
{for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1) /*檢測0區*/
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*檢查結束*/
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge));
for(i=1;i<=ge;i=i+1) /*游戲結束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei); printf("
|");
for(j=1;j<=lie;j=j+1) {printf("---|");}
printf("
");
}
if(n==(hang*lie-ge)) printf("你成功了!
");
else printf(" 游戲結束!
");
printf(" 重玩請輸入1
");
t=0;
scanf("%d",&t);
if(t==1)goto leb1;
}
/*註:在DEV c++上運行通過。行號和列號都從0開始,比如要確定第0行第9列不是「雷」,就在0和9中間加入一個字母,可以輸入【0a9】三個字元再按回車鍵。3行7列不是雷,則輸入【3a7】回車;第8行第5列是雷,就輸入【8#5】回車,9行0列是雷則輸入【9#0】並回車*/
㈩ C++游戲編程的目錄
第1章 概觀程序設計 1
1.1 程序設計發展歷程 1
1.1.1 什麼是計算機程序 1
1.1.2 計算機程序語言的發展歷史 2
1.2 程序設計思想 4
1.2.1 結構化程序設計思想 4
1.2.2 面向對象程序設計思想 5
本章小結 8
第2章 開發環境簡介 9
2.1 Visual Studio .NET集成開發環境 9
2.1.1 創建項目 10
2.1.2 創建文件 12
2.1.3 項目屬性設置 12
2.1.4 編譯和運行 13
2.1.5 調試 14
2.1.6 輔助工具 14
2.1.7 解決方案資源管理器 18
2.1.8 類視圖 19
2.1.9 文件視圖 20
2.1.10 資源視圖 20
2.1.11 幫助文檔的使用 28
2.2 Linux下的開發環境 28
2.2.1 Vi編輯器的基本使用 29
2.2.2 Vi編輯器的命令 29
2.2.3 Vi編輯器環境設置 32
2.2.4 g++編譯程序的方法 33
2.2.5 g++編譯程序的選項 33
2.2.6 運行應用程序 38
2.2.7 幫助文檔的使用 38
2.3 CodeBlocks集成開發工具介紹 38
2.3.1 創建工程 39
2.3.2 創建文件 39
2.3.3 項目屬性設置 39
2.3.4 編譯及運行 40
2.4 繪圖函數庫的使用 41
本章小結 41
第3章 基本數據類型 42
3.1 基本程序組成結構 42
3.1.1 一個基本的C++程序 42
3.1.2 基本輸入輸出 43
3.2 字元集和關鍵字 47
3.3 C++的數據類型概述 49
3.4 基本數據類型 51
3.4.1 整型數據 51
3.4.2 浮點型數據 52
3.4.3 字元型數據 53
3.4.4 bool類型 56
3.4.5 void類型 58
3.4.6 常量與變數 58
3.5 類型轉換 61
3.5.1 隱式類型轉換 62
3.5.2 強制類型轉換 64
本章小結 64
第4章 運算符與表達式 66
4.1 概述 66
4.2 運算符和表達式 66
4.2.1 運算符和表達式的種類 66
4.2.2 左值和右值 67
4.3 算術運算符和算術表達式 68
4.4 自增和自減運算符 69
4.5 賦值運算符和賦值表達式 71
4.5.1 賦值運算符與賦值運算 71
4.5.2 復合賦值運算符 72
4.5.3 賦值表達式 72
4.6 關系運算符和關系表達式 73
4.7 邏輯運算符和邏輯表達式 75
4.7.1 邏輯運算符 75
4.7.2 邏輯表達式 76
4.8 sizeof運算符 76
4.9 條件運算符和條件表達式 77
4.10 逗號運算符和逗號表達式 78
4.11 優先性和結合性 79
本章小結 80
習題 80
第5章 程序的結構 81
5.1 順序結構 81
5.2 分支結構程序設計 82
5.2.1 if…else…結構 82
5.2.2 switch語句 86
5.2.3 goto語句 89
5.3 循環結構程序設計 90
5.3.1 for語句 90
5.3.2 while語句 94
5.3.3 do-while語句 96
5.3.4 循環的嵌套 97
5.4 break、continue語句 98
5.4.1 break語句 98
5.4.2 continue語句 100
本章小結 101
習題 101
第6章 宏和編譯預處理 102
6.1 宏定義 103
6.2 頭文件包含 108
6.3 條件編譯 110
6.4 其他預處理指令 115
本章小結 119
習題 119
第7章 數組 120
7.1 為何需要數組 120
7.2 聲明數組 121
7.3 訪問數組元素 122
7.4 數組的初始化 124
7.5 數組應用舉例 125
7.5.1 選擇排序 125
7.5.2 冒泡排序 127
7.5.3 更多排序演算法 129
7.6 字元串與字元數組 131
7.7 數組作為函數參數 133
7.8 二維數組 134
7.8.1 二維數組的定義 134
7.8.2 二維數組中元素的引用 135
7.8.3 二維數組的初始化 135
7.8.4 二維數組程序舉例 136
7.9 多維數組 138
7.9.1 多維數組的定義 139
7.9.2 多維數組的引用 139
本章小結 141
習題 141
第8章 函數與程序結構 142
8.1 函數的概念 142
8.2 函數定義 143
8.3 函數聲明 145
8.4 函數調用 147
8.5 變數的作用域類型 149
8.5.1 局部變數 149
8.5.2 全局變數 151
8.6 變數的存儲類型 152
8.6.1 動態存儲變數 152
8.6.2 靜態存儲變數 153
8.7 函數返回值 153
8.8 默認函數參數 155
8.9 內聯函數 158
8.10 函數重載 160
8.11 作用域 163
8.11.1 局部作用域 163
8.11.2 函數作用域 164
8.11.3 函數原型作用域 165
8.12 可見性與生命期 165
8.12.1 可見性 165
8.12.2 生命期 167
8.12.3 補充說明 168
8.13 綜合應用舉例 168
8.14 遞歸函數 170
8.14.1 遞歸函數舉例 170
8.14.2 遞歸調用過程分析 171
8.14.3 遞歸程序設計方法 172
8.15 程序文件結構 174
8.15.1 頭文件 174
8.15.2 文件作用域 176
8.15.3 多文件結構 176
8.15.4 外部存儲類型 177
本章小結 179
習題 179
第9章 指針和引用 180
9.1 指針的概念 180
9.2 指針聲明和賦值 182
9.3 通過指針訪問數據 185
9.4 指針運算 187
9.5 動態內存分配 190
9.5.1 malloc()和free()函數 191
9.5.2 new和delete運算符 193
9.5.3 指針與數組 194
9.6 動態內存分配的應用 198
9.6.1 應用舉例1 198
9.6.2 應用舉例2 199
9.7 const指針 204
9.8 指針作為函數參數 208
9.9 指針函數 213
9.10 函數指針 215
9.11 指針數組 219
9.12 指向指針的指針 223
9.13 常見的內存錯誤及其對策 226
9.14 引用的定義 227
9.15 使用引用訪問數據 232
9.16 引用與指針對比 235
9.17 引用做函數的參數 236
9.18 應用舉例3 239
9.19 返回引用 240
9.20 函數調用作為左值 244
9.21 const限定的引用 246
9.22 返回堆中變數的引用 248
本章小結 250
習題 250
第10章 結構、聯合、枚舉 252
10.1 自定義數據類型概述 252
10.2 結構的定義 253
10.3 結構初始化 255
10.4 訪問結構成員 257
10.5 結構與數組 258
10.6 結構與指針 264
10.7 結構與引用 266
10.8 在函數中使用結構 267
10.9 結構的復雜形式 273
10.10 鏈表 275
10.11 聯合 279
10.12 枚舉 285
本章小結 294
習題 294
第11章 類與對象 296
11.1 抽象概述 296
11.2 類的概念 297
11.3 類的定義 298
11.3.1 類與結構 298
11.3.2 類的聲明 299
11.3.3 類成員的訪問控制 300
11.3.4 數據成員 303
11.3.5 成員函數 304
11.3.6 重載成員函數 306
11.3.7 類定義的注意事項 307
11.3.8 類聲明和類定義 308
11.4 對象 309
11.4.1 類與對象的區別和聯系 309
11.4.2 對象的聲明 309
11.4.3 訪問數據成員 310
11.4.4 調用成員函數 310
11.5 綜合應用 313
11.6 構造函數 314
11.6.1 為何需要構造函數 314
11.6.2 構造函數的定義 316
11.6.3 帶參數構造函數 317
11.6.4 默認構造函數 318
11.6.5 重載構造函數 319
11.7 類對象成員的初始化 320
11.8 析構函數 323
11.8.1 為何需要析構函數 323
11.8.2 析構函數的定義 324
11.8.3 何時需要使用析構函數 325
11.9 堆棧和內存分配 325
11.9.1 內存管理概述 325
11.9.2 變數與對象的空間分配時機與初始化327
11.9.3 為什麼使用new/delete操作符 328
11.10 拷貝構造函數 329
11.10.1 程序出錯的原因分析 329
11.10.2 拷貝構造函數 332
11.10.3 默認拷貝構造函數 334
11.10.4 淺拷貝與深拷貝 334
11.11 臨時對象和無名對象 337
11.11.1 臨時對象 337
11.11.2 無名對象 338
11.12 const成員 339
本章小結 340
習題 341
第12章 靜態成員與友元 342
12.1 靜態成員 342
12.1.1 為何需要靜態成員 342
12.1.2 靜態成員變數 343
12.1.3 靜態成員函數 345
12.2 友元 346
12.2.1 為何需要友元 346
12.2.2 友元函數 347
12.2.3 友元類 348
第13章 繼承與多態 351
13.1 繼承與派生的概念 352
13.2 繼承的實現方式 354
13.3 繼承類的構造與析構 355
13.3.1 繼承類的構造 355
13.3.2 構造函數的參數傳遞 357
13.4 基類訪問控制 360
13.5 多態與虛函數 362
13.5.1 為什麼使用虛函數 363
13.5.2 虛函數 364
13.5.3 重載、隱藏與覆蓋 365
13.5.4 虛函數的限制 368
13.6 多繼承 370
13.6.1 多繼承的實現 371
13.6.2 多繼承的二義性 371
13.6.3 多繼承的構造順序 373
13.7 虛基類 374
13.7.1 虛基類的定義 375
13.7.2 虛基類的構造函數和初始化376
本章小結 376
習題 377
第14章 運算符重載 378
14.1 為何要重載運算符 378
14.2 運算符重載的實現 379
14.2.1 成員函數運算符重載 380
14.2.2 友元函數運算符重載 382
14.3 單目運算符和雙目運算符 383
14.4 引用返回和值返回 386
14.5 常見的運算符重載 391
14.5.1 賦值與比較運算符 391
14.5.2 遞增與遞減運算符 392
14.5.3 數組存取標識符 393
本章小結 395
習題 395
第15章 模板 396
15.1 為何需要模板 396
15.2 函數模板 397
15.2.1 函數模板的概念 397
15.2.2 函數模板的定義 398
15.2.3 函數模板的實例化 399
15.2.4 重載模板函數 399
15.3 類模板 401
15.3.1 類模板的定義 401
15.3.2 使用類模板 403
15.4 綜合應用 404
本章小結 406
第16章 標准模板庫 407
16.1 標准模板庫的基本組成 407
16.2 標准命名空間 408
16.3 容器 409
16.3.1 順序容器 409
16.3.2 關系式容器 411
16.4 迭代器 413
16.5 演算法 415
本章小結 418
第17章 I/O流 419
17.1 流的概念 419
17.2 I/O標准流類 421
17.2.1 標准流的設備名 421
17.2.2 原理 421
17.3 輸入輸出的格式控制 423
17.3.1 用ios類的成員函數進行格式控制 423
17.3.2 使用格式控制符進行格式控制 427
17.4 輸入輸出運算符的重載 429
17.4.1 重載輸出運算符 429
17.4.2 重載輸入運算符 430
17.5 文件流 431
17.5.1 打開文件 432
17.5.2 關閉文件 434
17.5.3 寫入文件 435
17.5.4 讀取文件 435
17.5.5 常用操作和狀態檢測 436
17.5.6 讀寫隨機文件 438
17.5.7 二進制文件的處理 440
本章小結 442
習題 442
第18章 異常處理 443
18.1 傳統的錯誤處理方式 443
18.2 異常處理的思想 445
18.3 異常處理的實現方式 447
18.4 構造和析構中的異常拋出 448
18.5 異常規格說明 449
18.6 標准異常 451
本章小結 452
附錄A 程序的寫作風格 453