
一、...用什么語言編寫是不是需要你所玩游戲的代碼
如果還不會任何編程語言,建議從Python開始。
它設(shè)計清晰,文檔齊全,合適初學(xué)者入門。它是一門很好的入門語言,并且不僅僅只是個玩具;它非常強(qiáng)大、靈活,也適合做大型項目。好的教程可以在Python網(wǎng)站得到。
Java也是好的入門語言。它比Python難得多,但是生成的代碼速度也快得多。它同時也是一種優(yōu)秀的計算機(jī)語言,不止是用來入門。
但是注意,如果只會一兩門語言,將不會達(dá)到一個高水平的程序員的水平——需要學(xué)會如何以抽象的方式思考編程問題,獨立于任何語言。需要學(xué)會在幾天內(nèi)通過一些手冊,結(jié)合現(xiàn)在所知,迅速掌握一門新語言。這意味著應(yīng)該學(xué)會幾種截然不同的語言。
如果要做一些重要的編程工作,不得不學(xué)習(xí)C語言,Unix的核心語言。 C++與C非常其他類似;如果了解其中一種,學(xué)習(xí)另一種應(yīng)該不難。但這兩種都不適合編程入門者學(xué)習(xí)。越避免用C編程,工作效率會越高。
C非常有效率,節(jié)約機(jī)器資源。C的高效是通過手動做很多底層的管理(如內(nèi)存)來達(dá)到的。底層代碼都是復(fù)雜極易出現(xiàn)bug的,會花極多的時間調(diào)試。
如今的機(jī)器速度如此之快,這通常是得不償失——比較明智的做法是使用一種運行較慢、較低效率,但大幅節(jié)省時間的語言。選擇Python。
其他比較重要的語言包括 Perl和 LISP。 Perl實用,值得一學(xué);它被廣泛用于動態(tài)網(wǎng)頁和系統(tǒng)管理,因此即便你從不用Perl寫程序,至少也應(yīng)該學(xué)會看。許多人使用Perl的理由和建議使用Python的理由一樣,都是為了避免用C完成那些不需要C高效率的工作。
LISP值得學(xué)習(xí)的理由不同——最終掌握了它時會得到豐富的啟迪和經(jīng)驗。這些經(jīng)驗會在以后的日子里成為一個更好的程序員,即使實際上很少使用LISP本身。
實際上最好五種都會(Python,Java,C/C++,Perl和LISP)。它們代表了截然不同的編程思路和方法,每種都會受益匪淺。
轉(zhuǎn)自CSDN博主「東邊有頭牛」的原創(chuàng)文章。
擴(kuò)展資料:
應(yīng)用
(1):作為批次處理語言或工作控制語言。許多腳本語言用來執(zhí)行一次性任務(wù),尤其是系統(tǒng)管理方面。DOS,Windows的批處理文件和Unix的shell腳本都屬于這種應(yīng)用;
(2):作為通用的編程語言存在,如Perl、Python、Ruby等。由于“解釋執(zhí)行,內(nèi)存管理,動態(tài)”等特性,它們?nèi)员环Q為腳本語言。但它們已經(jīng)用于應(yīng)用程序編寫,用戶也不把它們看作腳本語言;
(3):許多大型的應(yīng)用程序都包括根據(jù)用戶需求而定制的慣用腳本語言。同樣地,許多電腦游戲系統(tǒng)使用一種自定義腳本語言來表現(xiàn)NPC(Non-Player Character,Non-Playable Character,Non-Player Class)和游戲環(huán)境的預(yù)編程動作。
此類語言通常是為一個單獨的應(yīng)用程序所設(shè)計,雖然它們貌似一些通用語言(如Quake C,Modeled After C),但它們有自定義的功能;
(4):網(wǎng)頁中的嵌入式腳本語言。熟知的HTML(Hyper Text Mark-up Language)即超文本標(biāo)記語言,就是一種腳本語言,它的解釋器就是瀏覽器。
JavaScript直到現(xiàn)在仍然是網(wǎng)頁瀏覽器內(nèi)的主要編程語言,它的ECMAScript標(biāo)準(zhǔn)化保證了它成為流行的通用嵌入式腳本語言。隨著動態(tài)網(wǎng)頁技術(shù)發(fā)展,ASP、JSP、PHP等嵌入網(wǎng)頁的腳本語言正被廣泛使用,不過這些腳本要通過Web Server解釋,而Html則被瀏覽器執(zhí)行;
(5):腳本語言在系統(tǒng)應(yīng)用程序中嵌入使用,作為用戶與系統(tǒng)的接口方式。在工業(yè)控制領(lǐng)域,PLC編程、組態(tài)軟件的腳本語言是擴(kuò)充組態(tài)系統(tǒng)功能的重要手段;
在通信平臺領(lǐng)域,IVR(自動語音應(yīng)答)流程編程;
Office辦公軟件,提供的宏和VBA;其他應(yīng)用軟件如ER Studio提供的Basic MacroEditor,用戶可以編寫Sax Basic腳本操作ER圖,生成Access庫、導(dǎo)出Word文檔等擴(kuò)展功能。
二、C++的成員函數(shù)和普通函數(shù)
首先要知道類存在的理由,為何要面向?qū)ο蟆?/p>
C中的結(jié)構(gòu)體就是定義一種數(shù)據(jù)格式,可以存儲若干數(shù)據(jù)元素,并且它們的內(nèi)存是連續(xù)的。
結(jié)構(gòu)體的作用是封裝一組有關(guān)聯(lián)的屬性,它們共同維護(hù)某種概念實體的狀態(tài)。
在早期經(jīng)典純C工程當(dāng)中,有經(jīng)驗的開發(fā)者早就開始利用結(jié)構(gòu)體與函數(shù)指針實現(xiàn)簡單的面向?qū)ο蟆?/p>
但是用結(jié)構(gòu)體+函數(shù)指針使用不方便不靈活,所以C++最大的使命,面向?qū)ο缶驼Q生了。
要注意的是C++與C的區(qū)別除了類之外,還有函數(shù)多態(tài)的特性、命名空間、STL等等特性。
類相比于結(jié)構(gòu)體+函數(shù)指針最大的優(yōu)勢就是兩個字:繼承
撤了一大堆廢話,針對LZ的問題可以歸結(jié)為,在沒有屬性的時候,只有函數(shù),使用類好不好,或者說何時可以如此使用。
如果LZ學(xué)習(xí)過設(shè)計模式,那么這個問題就頗為清晰,類的存在是為了更靈活地描述某種概念實體以及對它的操作。
一個只有函數(shù)而沒有屬性的類,其描述的實體可以認(rèn)為是一種抽象的動作實體。
用通俗的話來講,一個繼承Animal的Cat類描述一個貓,貓有屬性(形態(tài),叫聲,年齡等),也有動作(吃喝拉撒睡),這就是最經(jīng)典LZ也熟知的一種類。
而抽象的動作類,就有比如一個繼承File的DiskFile或者FtpFile等,它主要描述的是一組動作(讀與寫),它也許有狀態(tài)(屬性),也許沒有。
這種抽象的動作類為何而存在?經(jīng)典的策略設(shè)計模式就會大量地使用這種寫法。
比如你要做視頻處理軟件,視頻需要解碼與加碼如果只是用純函數(shù)的化你的代碼就會如下丑陋:
if(0==strcmp(fileType,AVI)){
decode_AVI(file);
}elseif(0==strcmp(fileType,MP4)){
decode_MP4(file);
}
.....
if(0==strcmp(fileType,AVI)){
encode_AVI(file);
}elseif(0==strcmp(fileType,MP4)){
encode_MP4(file);
}但是如果你有一個類AVType,只有兩個函數(shù):encode、decode,然后有AVIType、MP4Type繼承它,那么你的代碼大致就是:
AVType*type=newAVIType();//orMP4Type
type->decode(file);
....
type->encode(file);當(dāng)你的同類方法多起來(如rmvb、wmv、flv解碼器等等),你就會發(fā)現(xiàn)后者有多優(yōu)秀。
最后總結(jié)對LZ的問題的回答就是:
如果沒有繼承也不會存在潛在繼承的可能,也就是說用不到C++的多態(tài)特新,那么沒有屬性的類就沒有存在的必要。
今天閑的無聊,說了一堆廢話,LZ跳著看就行了O(∩_∩)O~
三、如何用C++寫掃雷
用VC++編寫掃雷游戲
用VC++編寫掃雷游戲
王洪亞
本文從分析windows掃雷游戲的功能特點開始,應(yīng)用面向?qū)ο蟮目梢暬幊陶Z言visual c++給出了個功能模塊的具體實現(xiàn)方法,并提供了編寫小游戲程序的一般方法和visual c++的一些使用技巧。
首先分析掃雷的最基本功能。
點擊鼠標(biāo)左鍵于未知區(qū)域,如果未知區(qū)域有雷,游戲停止,顯示所有的地雷。如果沒雷,則顯示周圍雷數(shù),如果周圍沒雷,則再查看周圍八個區(qū)域是否有雷直到有雷為止并顯示,這其實是一個遞歸過程。
點擊鼠標(biāo)右鍵于未知區(qū)域,則將其置為有雷而不管是否真的有雷。可選擇初、中、高三級并可自定義雷數(shù)和區(qū)域大小。
雷區(qū)上部左側(cè)顯示總雷數(shù)減被標(biāo)明有雷區(qū)域的數(shù)目。
雷區(qū)上部中間位置顯示一按鈕用于開局和顯示鼠標(biāo)動作的結(jié)果。
雷區(qū)上部右側(cè)顯示掃雷的時間。
將雷全部掃清后,則顯示一對話框?qū)⒛愕男彰浫肱判邪瘛R詴r間排序。
為完成上述功能,應(yīng)用visual c++的具體技術(shù)細(xì)節(jié)如下:
1.應(yīng)用appwizard創(chuàng)建基于sdi的應(yīng)用程序cbombapp,去除打印和狀態(tài)條支持,在資源編輯器中修改菜單和相應(yīng)的加速鍵,使其與windows掃雷游戲一致。具體為開局(id-game-begin)、初級(id-game-junior)、中級(id-game-middle)、高級(id-game-senior)、自定義(id-game-custom)、顏色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、幫助(id-help)。
2.在資源編輯器中對應(yīng)于雷區(qū)的每個小區(qū)域的13個屬性。用畫筆或其他繪圖工具繪制出相對應(yīng)的13個10乘10的16色小位圖,三個對應(yīng)于小人表情的20乘20的16色小位圖,供更換顏色時使用的一套與前16個對應(yīng)的單色位圖,顯示時間和雷數(shù)的0~9十個數(shù)字位圖(底色為黑色)。
定制customer對話框,內(nèi)含三個靜態(tài)文本控件和三個編輯控件,三個編輯控件分別對應(yīng)成員m_irownum,m_icolumnnum,m_ibombnum。該對話框用于定制雷數(shù),行列數(shù),其相應(yīng)的mfc類為ccustomer。定制sort對話框,內(nèi)含九個靜態(tài)文本控件,其中六個顯示排行榜的姓名和時間,其對應(yīng)的mfc類為csort。定制input對話框,內(nèi)含一個靜態(tài)文本控件和一個編輯控件,編輯控件用于在游戲成功結(jié)束時輸入姓名,其對應(yīng)的mfc類為cinput。
3.定義類bomb,封裝每顆雷的相關(guān)屬性。
class bomb
{
public:
int isbomb;//決定初始時是否是雷
bool issel;//判斷區(qū)域是否被處理過且周圍有雷
bool isdone;//判斷遞歸時是否被處理過
int num;//周圍雷數(shù)
bool findbomb;//排雷者認(rèn)為是雷時置一(但是不一定真是雷)
};
4.重載cmainframe中precreatewindow,并設(shè)置相應(yīng)屬性,使其窗體大小固定,這樣就固定了顯示區(qū)域的大小為初始10乘10個雷和外加雷區(qū)上部的控制區(qū)域,部分代碼如下。
cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;
cs.cy= 10*15+6;
cs.cx= 10*15+60;//6和60分別是橫縱的附加值,用于邊框、菜單、標(biāo)題條、控制區(qū)域。
5.游戲的主要工作就是呈現(xiàn)不斷變換的圖形或動畫,并按用戶的輸入交互進(jìn)行顯示,而windows文檔-----視窗構(gòu)架中的視窗的功能正是接受用戶輸入并負(fù)責(zé)顯示,因此由cview類來完成掃雷的大部分工作。在cbombview中定義下列成員變量記錄相關(guān)操作的結(jié)果或?qū)ο蟮臓顟B(tài)。
bomb m_bomb[30][30];//最大的地雷區(qū)域
cstring m_currenttime;//用于記錄并顯示掃雷時間
ctime m_begintime;//記錄游戲開始時的時間
bool m_timerbegin;//定時器是否開啟
int m_ibomnum;//雷的數(shù)目
int m_irow;//雷的行數(shù)
int m_icolumn;//雷的列數(shù)
int m_ibombfound;//指示被認(rèn)為是雷的數(shù)目
cbitmapbutton m_bitbutton;//控制區(qū)的位圖按鈕
int m_currentlevel;//指示當(dāng)前游戲的級別
bool m_biscolor;//指示當(dāng)前是彩色還是單色
cbitmap m_bmbomb[12];//用于存放12個小位圖
int m_igameover;//游戲未結(jié)束置0,已清除所有的雷置1,被炸死置2。
重載cbombview中oncreate函數(shù)創(chuàng)建位圖按鈕,該位圖按鈕的兩幅位圖對應(yīng)了正常、排雷正確兩種狀態(tài),當(dāng)要顯示被炸死的狀態(tài)時應(yīng)動態(tài)銷毀該按鈕,并重新創(chuàng)建一位圖對應(yīng)正常和被炸死兩種狀態(tài),將該位圖按鈕的id號定為id_game_begin,這樣一來當(dāng)點擊按鈕時便可重新開始游戲,部分代碼如下。
crect rcclient;
getclientrect(&rcclient);
crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);
m_button.create("new",bs_defpushbutton|ws_visible|
bs_ownerdraw,rect,this,id_game_begin);
m_button.loadbitmaps(idb_face1, idb_face2);
顯示時間的功能相對比較簡單,在響應(yīng)第一個wm_lbuttomdown消息時開啟定時器,并記錄游戲開始的時間,在wm_time消息響應(yīng)函數(shù)ontimer中獲得當(dāng)前時間,減去游戲開始時的時間,在顯示時間的客戶區(qū)域顯示得到的時間差(用數(shù)字位圖),當(dāng)游戲結(jié)束時(排完全部雷或被炸死)關(guān)閉定時器,停止顯示。
wm_lbuttomdown消息響應(yīng)函數(shù)onlbuttomdown是處理用戶輸入的主要執(zhí)行者,函數(shù)首先判斷點中位置是否是雷,是則關(guān)閉定時器,銷毀原位圖按鈕,創(chuàng)建一對應(yīng)正常和被炸死兩種狀態(tài)的新位圖按鈕,并調(diào)用setstate將其設(shè)置為pushdown(小人哭的狀態(tài)),將m_bgameover,置為true標(biāo)志游戲結(jié)束,否則先調(diào)用setstate設(shè)置位圖按鈕為pushdown(小人笑的狀態(tài)),并在onlbuttomup中設(shè)置位圖按鈕為正常狀態(tài),然后調(diào)用caculate函數(shù)記下周圍雷的數(shù)目,最后調(diào)用invalidate使客戶區(qū)無效,迫使ondraw函數(shù)重繪客戶區(qū)域,在調(diào)用invalidate時不應(yīng)重畫背景,避免閃爍,這樣就完成了在雷區(qū)按下左鍵的響應(yīng)動作。
wm_rbuttomdown消息響應(yīng)函數(shù)onlbuttomdown將被認(rèn)為有雷位置的m_ibombnum.findbomb置一,減少左上角的雷記數(shù),然后判斷是否真正全部排完了雷,是則結(jié)束游戲彈出input對話框,讓掃雷的人輸入姓名,在響應(yīng)idok通知碼時將其寫入注冊表,沒有全部排完則使客戶區(qū)無效,迫使ondraw函數(shù)重繪客戶區(qū)域完成在雷區(qū)按下右鍵的動作。
ondraw函數(shù)在每次點擊左鍵或右鍵時都會被調(diào)用重雷區(qū)和控制區(qū)域,因為點擊情況的復(fù)雜性和雷屬性的多元化導(dǎo)致ondraw函數(shù)需要精心設(shè)計。
函數(shù)caculate計算某個雷周圍的雷數(shù),根據(jù)前面的分析知道,計算某個雷周圍的雷數(shù)本身就是一個遞歸過程,在編制時應(yīng)注意遞歸的邊界條件,稍不注意會陷入無窮遞歸而耗盡了系統(tǒng)的資源。
6.菜單命令的響應(yīng)是游戲交互的另一個重要方式,下面的九個命令響應(yīng)函數(shù)分別與九個菜單項相對應(yīng),用以完成用戶的更新和設(shè)置命令。
ongamebegin完成初始時間清零,隨機(jī)布雷,依據(jù)顏色指示裝載12幅小位圖,使雷區(qū)無效調(diào)用ondraw重繪等工作。其中隨機(jī)布雷就是多次調(diào)用rand(),根據(jù)其返回值決定m_bomb[i][j].isbomb的值。
ongamecustom首先彈出ccustomer對話框,在用戶輸入設(shè)置后響應(yīng)idok通知碼時將用戶輸入的雷數(shù)、行列數(shù)分別賦給cview的數(shù)據(jù)成員m_ibombnum、m_irow、m_icolumn,得到框架窗口的指針,用其調(diào)用movewindow將窗口調(diào)至所需大小,銷毀原位置的位圖按鈕,并在x軸坐標(biāo)為新窗口寬1/2減8處,y軸坐標(biāo)為新窗口頂部加30的位置創(chuàng)建一新按鈕。最后調(diào)用ongamebegin重新開始游戲。
ongamejunior、ongamemiddle、ongamesenior三個函數(shù)與ongamecustom類似,只不過將分別賦給cview的數(shù)據(jù)成員m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由編程者自定,筆者定為junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。
ongamecolor函數(shù)銷毀原位圖按鈕,根據(jù)重新裝載位圖的標(biāo)志m_iscolor來創(chuàng)建新的位圖按鈕,將裝載12幅單色位圖的標(biāo)志取反,調(diào)用ongamebegin重新開始游戲。
ongamesort函數(shù)根據(jù)當(dāng)前游戲級別從注冊表中讀出排名并彈出sort對話框顯示結(jié)果。到現(xiàn)在為止,一個自己編制的掃雷游戲就基本完成了,將數(shù)百行代碼編譯一下,找出小錯誤,最后build一遍,run一下,好了,可愛的掃雷游戲就出現(xiàn)在你的面前了。怎么樣,自己的勞動成果并不比microsoft的差吧,而且你還可以把小位圖畫成各種樣子,當(dāng)然你自己要認(rèn)得出才行了。










