大學C++應該怎麼學?

我大一剛剛結束

是讀計算機的軟體開發的

選擇了C++語言

我每次看到一些小遊戲都想探究是如何開發 運行的 一個遊戲的製作過程是怎樣的

我現在所學到的並不能給我答案

學了一年了

只知道什麼叫類 結構體 函數等

小組作品也就是簡單的exe程序框里的小程序

有時候解決了某些bug覺得好有成就感

自己的程序能運行很開心

可是就是比起4399裡面的小遊戲

也覺得自己很差勁

真是想知道學習類 結構體之類的

對以後製作一個APP或者遊戲很大幫助嗎

課餘時間想自己研究開發微信頁的小遊戲應該學習點什麼知識呢

……有點迷茫


首先要對題主說,你看到的遊戲基本上全都是以你現在所學的類,結構體,函數為基礎的,你現在學的並不是沒用的。

其次提醒題主不要指望通過學校安排的課程可以解決你遇到的所有問題,也不要指望跟著學校的課程你能學會遊戲編程,不是「我現在所學到的並不能給我答案」,而應該是「我是為了找到答案才去學的」,好好利用谷歌必應。

再者建議題主看到一個遊戲時試著這樣想「這個遊戲的某某部分給我的話我可以怎麼做?我怎麼能做一個功能相似的小玩意出來?做不到的話我能不能做個簡化版的?」,用自己知道的知識嘗試實現一下,不管有沒有結果,有嘗試有思考就是進步。

最後也是最重要的一點:行動是第一位的,一定要思考,思考後就動手,代碼敲起來,千萬不要停留在閱讀滿足上和下決心上。有時間陶醉於閱讀後的滿足不如滾去寫兩行代碼。

----------------------------------------分割線-----------------------------------------------------------------------------

我現在大二,說下我學著製作遊戲的經歷吧。

這是我大一時自己做的第一個勉強算是遊戲的小東西

很簡單,隨機生成一個數,並根據輸入的難度生成一個範圍,讓用戶猜數字,

只用到了隨機數,輸入輸出,switch判斷和while循環,雖然簡陋,但做出來的時候還是十分激動的。

然後我注意到了

system("pause");

這個常用在控制台程序結尾的命令,它是調用cmd里的pause暫停執行,而我恰巧知道cmd里cls可以清屏,

那麼使用

system("cls");

就可以清除當前屏幕顯示,再想辦法重新輸出內容到屏幕上,再清屏,再輸出,不斷重複這個過程,其中每次輸出的內容稍有不同的話看起來就像逐幀動畫一樣。

基於上面這個想法,我的第二個類似遊戲的程序誕生了,有點類似貪吃蛇,但蛇不會變短也沒有食物,用戶可以使用方向鍵控制蛇的前進方向。

(抱歉源碼找不到了,沒法上圖,就大概說下我的思路吧):建立一個整形二維數組,用於儲存當前蛇每一節的xy坐標位置,然後prinf()從左到右,從上到下的填充整個屏幕,空白的地方輸出空格,蛇所在的地方輸出+號,然後清屏,不斷循環。用getchar()獲取用戶輸入,按照不同的方向鍵生成新的xy坐標寫入二維數組並排序保存數組有序。

現在看起來很簡單的東西當時寫了我一天,而且效果相當不咋的,清屏和繪製太慢,看起來像ppt一樣。

再然後玩vs的時候發現vs可以拖窗體拖控制項,而且控制項的位置可以通過代碼控制,於是誕生了這個玩意:

類似打磚塊,不過背景是我舍友的照片扣的,效果音也是偷偷錄室友的「雅蠛蝶」(怕被室友打所以我打碼了)。(逃

大一暑假時逛博客園時發現了EGE這個圖形庫(直通車:Easy Graphics Engine),通過它完成了真正意義上自己的第一個遊戲貪吃蛇並加入了難度機制(蛇越長移動速度越快)

當時水平不夠寫了接近250行代碼才完成的。在這之後又從學長那裡要到一個簡易小遊戲的源碼,暑假看著源碼實現了一遍,大二上的時候看著博客(傳送門:用canvas整個打飛機遊戲)跟著寫了一個HTML5的打飛機小遊戲,發現其中很多代碼不懂後又學習了JavaScript。

這以後就大概知道從哪裡,怎麼搜才能找到自己想要的資料,學長學姐,github,各類技術博客都可以找到遊戲開發相關的資料,也大概明白了一個簡易的遊戲流程是怎樣的。

15號考完試後我暑假不打算回家了,計劃留在學校學一學計算機圖形學和OpenGL。


做個遊戲,首先你需要用計算機「語言」,對你要表達的遊戲建模。然後來操控模型。這些就是涉及到需要你有一定數據結構+演算法的基礎。所以,當你學完了語言的語法,僅具備讀寫直白(直接)的計算機代碼的能力。之後你需要學計算機思維,計算機語言,也就是數據結構和演算法。然後才能用該語言嘗試解決實際問題。這個就不細說了。

之後,看到同志們提到一些繪圖相關的東西。

說些 VC 在 windows 程序中和繪圖有關的東西:

(1)GDI。可以說是 C 語言介面:

在 WIN32 里就是 HDC,在 MFC 里被封裝到 CDC。

HDC 主要是在 WM_PAINT 中 BeginPaint 得到,這是一個固定模式,可以說其他技術,是在 HDC 基礎上進行封裝。(此外是用 GetDC 短暫獲得,並立即 ReleaseDC)。

這是一種比較原始的狀態機模型,使用過程如下:

(1.1)創建一個 GDI 對象(點陣圖,畫筆,畫刷等);

(1.2)選入 DC。(SelectObject),同時保存返回值(被選出對象)。

(1.3)繪製你要的東西(這個過程中,被選入的 GDI 對象起作用)。

(1.4)把選出對象再次選入 DC。

(1.5)刪除你創建的 GDI 對象。(除了系統長期維護的 Stock Objects)

有的人把上面最後兩部用一行代碼完成:

DeleteObject(SelectObject( hdc, hOldXXX ));

MFC 的封裝就不說了,和 WIN32 基本一致的。

可以看到,使用 GDI 還是比較麻煩的。一旦你忘記最後一步刪除 GDI 對象,結果類似內存泄漏,叫做 GDI 對象泄漏。由於系統能維持的 GDI 對象數量有限(我預估大概在幾千個左右吧)。所以發生 GDI 對象泄漏以後,你會發現系統繪製開始不正常。而且會影響的不是你自己的進程,而是整個系統範圍。

(2)是使用 GDI+,也就是 gdiplus.dll 。

gdiplus 是採用 OO 的,也就是 C++ 介面。

Graphics g(hdc);

然後通過其成員函數就可以繪圖了。

在 VC 里使用方法和 .Net 裡面幾乎是一樣的。

支持抗鋸齒等。貌似在 GDI 中沒有這些設置選項。

--

總體來說,GDI 操作起來比較繁瑣些,也可以說是僅屬於 VC 才會用。

所以我會比較推薦採用 GDIPlus 來繪圖。用法也可以說和 C# 這些 .net 語言近似。

這兩種方法就可以實現基本的 2D 繪圖了。

當然還有就是 OpenGL (還是 C 語言介面,狀態機模型), DirectX (比 C++介面更進一層,它是基於 COM 的介面)這樣的 3D 圖形庫,但它們需要一些數學基礎,而且學習深度和廣度,要遠遠超過 GDI / GDI+ 。這是一個專門的方向了,個人認為,只有有足夠興趣,耐心和毅力,時間和精力,的條件下,再去學習 3D 圖形庫的東西。


當初馬克了現在回來答過,希望題主還在。

遊戲有三大要素,分別對應了現實中三大職業:程序,美術音樂和策劃。

我們這的做法是,策劃先設定一個大致的故事背景和基本的遊戲類型(端游?手游?回合制?角色扮演?),然後美術音樂根據背景,然後定下一個風格,程序根據遊戲類型挑選合適的引擎。之後,策劃細化背景和細化玩法機制,程序配合。美術音樂出模型出地圖出人物出效果出音樂,程序配合。策劃對最終效果驗收,程序配合。。。。。。(程序其實是最慘的

然後,一款遊戲就出來了。當然,這裡面還有細化的,但大抵就是這幾樣~

對於一些小成本的遊戲,一般以獨特的玩法取勝,這需要你有強大的策劃能力。而美術和程序這塊,只要過得去也沒問題。架構不好,美術風格很糟糕,並不能阻止它成為一款受歡迎的遊戲(斜眼看隔壁mc

總之,到了最後你會發現,做遊戲的,最重要的從來不是程序能力。

我說這個是為了提醒題主,要搞清楚寫程序和做遊戲哪個比較爽,兩者的目的不一樣,這非常重要。

如果是前者,老老實實打好基礎比什麼都好,而這些基礎往往不是語言本身,而是更底層的系統和更抽象的演算法和工程能力。如果是後者,請堅決奉行夠用主義,如果不是問題絕不深究。

待補


看C++ Primer,沒plus,別買錯了

--看完之後你的感受應該就是:哇原來C++這麼複雜

然後看計算機圖形學,然後你就可以嘗試用原生opengl擼2D和3D遊戲了

學C++目的是為了屠龍,4399小遊戲這種東西自己去看看flash

為什麼會迷茫,因為你代碼寫得不夠多,當你寫的代碼只是為了解決作業裡面什麼破學生管理系統的時候,你是無法體會為什麼要有這些語法,為什麼要有這些數據結構,以及為什麼要OO的

以及,你的工程寫的不夠大,你是無法理解為什麼要用VS2015而不是VC6的


太年輕啦,跟我當年的狀態很像,唯一的區別是我當年不知道有知乎呀。(一堆廢話)

好啦,進入正題吧。有這種探究的慾望就是一種值得表揚的。但是從實際出發想要追根究底的話並不是一件容易的事情。需要的了解各個方面的知識。就好像從你按下F5開始到整個hello word列印到屏幕之間發生了些什麼嗎?這裡面包含的東西太多了。很多時候計算機裡面很多東西就是一個黑盒子,想要完全探究你必須要足夠的積累。C++輸出hello world,請從電子電路、內存CPU、程序層面解釋一下? - 編程

在看看別人的一些關於學習C++的回答

用一年時間如何能掌握 C++ ? - C / C++

C++ 如何進階? - 編程

如果對遊戲有興趣可以多看看計算機圖形學方面的書籍吧。學習點圖形介面opengl,dx等。

數據結構對以後發展幫助很大的。你現在沒認識到它的作用不代表它沒用。事實上它很有用。

最重要的是要多寫代碼,多寫代碼,多寫代碼。

學而不思則罔,思而不學則殆。這也是看書和寫代碼之間關係的闡述。左手理論右手實踐,兩手都要抓,兩手都要硬。


題主,首先C++本身是不帶圖形庫的,所以想用C++做圖形遊戲的話我們可以藉助一些繪圖庫:

easyx:首頁 -- EasyX Library for C++ 官網上有很多教程,文檔也很詳細;社區(其實就是貼吧)也比較活躍,裡面有很多吧友貢獻的程序。

EGE:已經有知友貼出來了。

SDL:Simple DirectMedia Layer 現在已經有了2.0版本,不過對應的中文教程不太多。

題主可以先嘗試用類似的繪圖庫做點小遊戲出來,雖然和很多網頁小遊戲還是不能比,但你通過寫這些程序慢慢的就能理解結構體,類這些東西有什麼用了。(順便推薦一本書,叫《高質量程序設計指南——C/C++語言》)

在寫這些程序的同時,題主也可以了解一點win32API(我假定你是用windows的了)、webGL、openGL(ES)、DirectX、計算機圖形學的知識。

不過題主,這個世界上的編程語言千千萬萬種,不是只有C++才能做遊戲——如果想寫微信/網頁小遊戲的話,javascript才是首選吧(我沒寫過,不太肯定);題主也可以根據自己手機的系統(andorid -&>java 、ios -&>swift or object-C)找點書寫點遊戲。總之別只弔死在C++上。

另外不知道題主聽沒聽說遊戲引擎這種東西: unity3D、cocos......


大學裡面能把TC++PL或者C++ Primer看好幾遍, 順便再看看其他C++書籍, 就已經不錯了


常用數據結構封裝下,造些簡單的輪子,看些開源庫,自己能改改,加加需求。


知道基本語法之後直接lu代碼啊,看書沒lu頂用。


題主問了兩個問題。

1. 大學c++怎麼學

2. 開發微信小遊戲

第一個問題,由於你學了基礎的c++,看到一個小遊戲,便想探究他的運行機制。你現在大可直接上手遊戲框架,例如 cocos-2d,亦或者虛幻4引擎。

第二個問題,如果想開發微信可以玩的小遊戲,需要學習 html5 和 JavaScript。

並推薦閱讀這篇博客 你應當如何學習C++(以及編程)(rev#1)

還有這系列的博客 C++ - 劉未鵬|C++的羅浮宮


和我上大學的時候很像,我可以免費教你


學了幾天自己寫了個2048……


別急,後面還有三年課程呢,慢慢學吧。


我也剛讀完大一。計科。

一年C++經驗,兩年半ActionScript3.0經驗,以前是用C的。寫過一堆flash小遊戲。

flash新遊戲,當然用ActionScript寫啦!使用ActionScript3.0你就會發現,以前學得類啊吧啦吧啦的都用上了。

你寫不出遊戲是正常的,我們要站在巨人的肩膀上,用別人寫的庫,用別人寫的類,用別人寫的引擎(這個假期我在研究flixel),然後你就可以輕鬆寫各種東西了,包括寫小遊戲。

那麼學校教的類、結構體有什麼用呢?

1、代碼交流。這麼說吧,以前我寫小遊戲,用面向過程的方法(被C教壞),後來想要一些高級功能,想用別人寫的東西,發現別人的都是面向對象的,用類寫的。我想用別人寫的東西,就要學會類怎麼用(當年好奇葩有木有)。這叫隨大流吧,因為別人的代碼是用類的,我想移植,就要用類。

2、代碼管理。如今寫東西用類一發不可收拾,有點濫用類了。一個對象十幾個類,好處就是方便管理。簡單的說,就是你要找代碼怎麼找得快。當工程比較大的時候,用類比較方便管理代碼。

我覺得還是代碼交流的需要,寫遊戲時,一些高級的東西,比如尋找路徑,我還寫不出,不過沒關係,用別人寫的開源代碼就行了(*^-^*),可我找到的多數代碼都是以類的方式封裝的。

微信的小遊戲好像都比較簡單,用HTML5寫的。

下面說說如何寫小遊戲。

首先找到一種顯示圖像的辦法。(用C++的話要找庫,我沒用過,ActionScript好像有天然優勢呵呵呵)

就選打飛機吧。

1、寫或找一個類A,可以在有成員x,y,可以在屏幕(x,y)處顯示一個圖像。

2、找一個辦法,使得一個函數B可以隔一定時間間隔被調用一次。可能要Timer類之類的東西吧。

3、用類A顯示飛機,在B內檢測方向鍵是否按下,依據此改變飛機的x,y。再來一些用隨機函數操控的飛機(用隨機函數代替方向鍵)。

4、用類A顯示子彈,在B內讓子彈移動(好像要寫個Bullet類存放飛行的方向。。),然後來兩個循環,歷遍子彈和飛機,看有沒有相撞(碰撞檢測或者個子彈和飛機一個半徑,把它們看成圓是否相交),相撞的死掉。

5、打磨。比如用隨機函數控制的飛機,狀態應該幾秒才改變一次(又用隨機函數,在一定概率下才改變飛機飛行方向),防止它抖動。比如飛機或子彈飛出屏幕怎麼處理。比如飛機相撞怎麼處理。

不難的,題主加油。

(不貼代碼有點怪,可我匿名了。。。)

(我沒寫過打飛機,上面那個是我以前寫的打坦克的遊戲的做法改的,好像飛機不是這樣飛的。。。)


推薦閱讀:

用很厚的教材學編程的時候,該如何一邊攤開書一邊敲代碼?
如何讓編譯器在預處理時在一個項目中的某些指定文件中每一個函數定義前插入一個宏?
C++ 03和C++11的vector在調用元素的構造函數時有什麼區別?
為什麼C++ 中 void * 能指向靜態成員函數但不能指非靜態向成員函數?
程序員對自己的語言有沒有感情的?

TAG:C | CC | VisualC | C標準 | C編程 |