在學習C++基礎知識之後,應該學習什麼以達到能編寫小遊戲的水平?

我已經把c++理論知識看了個大概,看完之後我陷入迷茫了,這個黑白的程序到底能幹什麼,離我想想中的遊戲,app什麼相差甚遠,接下來我應該接觸什麼書籍,才能獨立編一個4399上面那樣的小遊戲呢?好茫然啊


一口吃不成胖子,我來拋個磚

4399上也有很多純文字劇情的小遊戲不是嗎,你能用黑窗口做出來嗎?多做了幾個之後,有沒有覺得重複的代碼寫起來很無聊呢,有沒有想要把他們寫成一個現成的東西隨你調用呢?

更進一步的,你能用黑窗口畫方塊字元,做出來一個粗糙的像素2D遊戲嗎?(比如貪吃蛇,掃雷,俄羅斯方塊)

再進一步,你能用黑窗口畫出一個粗糙的2D的圖像嗎,你覺得,這樣之後你可以幹些什麼呢?

以上是你的第一步嘗試,下一步,你想不想知道怎麼在黑窗口裡輸出彩色字元呢ANSI escape code(需要linux或者Win10)有了彩色字元,你也許可以學習一下什麼是ascii art - 必應

然後你覺得你可以用控制台幹些什麼了呢?

然後看看別人用python寫的ascii遊戲引擎carlosmaniero/pygamii,你又有什麼想法了呢

這個時候你的編程能力應該已經很強了,隨便學個qt,unity,cocos(已死),看看別人框架和你自己之前造的東西有沒有什麼異同,手到擒來的事。


題主,你有沒有看 c++ primer。 我當時抱著 primer啃的時候就覺得,智能指針這個東西真是神奇。到底什麼黑科技?然後後來書里講了如何實現一個自己的智能指針,頓時覺得厲害了我的哥。。然後就特別想敲出來,也特別想學其他的這麼神奇的設計。

然後學演算法和數據結構的時候,也是覺得,卧槽還能這樣??尼瑪真么想出來的。就想自己敲出來,想繼續學。

還有什麼軟體工程(有些書感覺有點雞湯的味道)。讀著讀著感覺,還有這麼一說?!以後我也要多注意,養成好習慣。

還有網路編程,還有操作系統,還有編譯器,還有渲染。。。這麼多東西,其實很多都是黑乎乎的。但是很有意思啊。

不過如果沒有視覺畫面的話有時候的確很著急。所以我又學了Qt,開始膨脹了覺得只要給我能畫出圖像的API,我就能敲個大東西出來。。。

用Qt敲了點可視化的演算法過程啦,貪吃蛇俄羅斯方塊2048什麼啦。

但是越敲越覺得其實我還差得遠……

這麼小的工程就已經有些應付不過來了。

然後我狠狠心要敲一個QQ堂,閉門造車想了半天,覺得這個設計絕了!。敲是敲出來了。也大概能玩了。可是敲出來以後我自己都覺得我的設計太爛。讀了那麼多書,什麼設計模式,什麼底層優化,什麼高內聚低耦合,什麼演算法。。。,自以為很NB,掌握編程真諦了,結果真敲出來代碼也就那個樣子。。

然後就繼續學,這個時候我就覺得我想可能喜歡遊戲引擎。。然後就入坑了。邊學邊敲。往往看完幾本書,又覺得自己NB了。然後開始敲代碼。。敲著敲著又發現差好多知識,接著學,接著敲。。。

自從入了編程坑,真心恨不得天天抱著書啃。。。。。


PS:沒想到有人惡意對我的網頁後台傳數據,也是醉了,你到底有多無聊,我已經把後台上傳成績功能關了,其實我可以換個方式登錄成績來防止惡意登記成績,不過我主要是讓大家體驗一下這礦工怎麼樣什麼樣,懶得改了,所以乾脆就取消了這個功能

大兄弟和我很像,(知乎高手如雲,我得提前說我只是一個小遊戲愛好者,只是覺得我的經歷可以給題主點幫助,也希望給大家一些初學者想自己製作遊戲給朋友分享並獲得快樂的人一點幫助)其實我一開始學語言也是想寫遊戲,覺得4399上的遊戲很酷,但是一開始學控制台c++我是直接懵比了的,這是什麼鬼!!!!這和我想學的編程完全不一樣好嗎!!!!!(後來才知道C++是一門深奧強大的語言,一步登天寫華麗遊戲,就是圖形化界面真的是太難了)但是大神們都說開發遊戲c++性能好,而且用的人比較多,大型遊戲如lol都是c++,可是無奈於厚厚的書和教程讓我望而卻步,畢竟實在想體驗一下自己快速開發遊戲的感覺,網上那麼長的教程最後寫的竟然是些文字推理遊戲。

只到有一天,我遇到了HTML5,canvas標籤讓我看到了希望,於是等同於零基礎的我開始了我的寫小遊戲之旅!!(在這裡我推薦題主用html是有原因的,雖然題主問的是用c++但是我看的出來題主說想做出4399的那樣的遊戲,我覺得對於一個需要做出成果的人用html寫是很有幫助的,用記事本就可以寫,有瀏覽器就可以運行,包括手機!!當然這一點還有個很重要很重要的好處,就是便於分享,後面會說)

一開始的我,從網上找到了一個貪吃蛇,我猜很多人一開始都是從貪吃蛇搞起,它大概長這個樣子,

像素遊戲low爆了好嗎!!!但是他的源代碼邏輯對初學者很有好處,而且對於一個初學者的我來說,這簡直是狂拽酷炫吊炸天!!兒時遊戲機的遊戲竟然自己開始著手研究怎麼實現了,於是我硬著頭皮開始學習如何看得懂源代碼,經過了一個下午的奮戰終於把每個語句都看的差不多了。自己對每一句都坐了標註。後來開始嘗試著寫自己的遊戲,我問了朋友,他們想玩黃金礦工還是植物大戰殭屍,他們隨口一說說黃金礦工吧。於是我登錄了4399,玩了幾把,搞清楚了大概的邏輯,於是開始對他們的顏色採樣,記錄到自己的代碼里,代碼的邏輯,類什麼的都走了很多路,問了好多人,好多帖子,讀了html5底下canvas的每一個規範寫法,終於在3天寫了出來,自己當然是很高興的,嘿嘿。界面大概是這樣,知乎大神別吐槽丑了,我也很無奈啊。。。。。。鏈接(網址備案太麻煩,雖然沒有域名不方便,但是無奈,只是用於發給朋友交流一下) 無論你啥設備,基本上都可以玩,很小的遊戲。

http://182.254.220.103:8888/ 請勿在知乎手機客戶端點開,無法兼容。。。。

老實說我對於我一個普通學生來說我是很自豪的,我對每一個石頭和金子的位置都精心的調了,我甚至加了背景音樂,我沒有直接參考任何別人的寫好的遊戲代碼,都是一個個自己的為了實現的小創意,其實我知道,4399的源碼肯定比我的簡潔很多很多,期間參考了很多教程,而canvas規範都是在一個好像是火狐社區的裡面找的,然後邏輯部分也是自己想的,我還很逗比的用暴漫表情,當勾到石頭的時候甚至還會變更表情,哈哈哈。歡迎大家去試玩

在此期間遇到了一個很大很大的困難,我為了讓我的qq高中同學的好友能直接在qq自帶的手機瀏覽器上玩,就是在群里點一下別人說的網址那種玩,我自己測試了很多遍,有很大的延遲,這tm什麼鬼啊!!我是不是手機壞了?手機不該這麼卡啊,這也不是網遊,這到底是怎麼了,後來我在萬能的知乎上找到了答案,原來是移動端的瀏覽器自動設置了延遲,為了解決判斷用戶是否雙擊了頁面,瀏覽器加了延遲,加了一個fastclick包就可以啦,哈哈(這個過程花了我倆小時。。。)。

這時候學html最重要的一點就出來了,可以及時的分享給別人,我先打個比方,一個初學者廢了好大的勁寫了一個遊戲,假如是c++,exe,除了您要好的朋友,你用u盤或者qq單獨發,誰會去玩玩,更不會有人給你評論的,更不用說你用python,人家怎麼裝運行環境啊。。。。。但是,你用了html,js寫了後,在qq群,說說,朋友圈發了個網址,人家立馬就可以用手機點進去玩,然後給你反饋,好不好玩,哪裡需要改進,這對一個初學者很重要的,改了代碼ftp一傳,人家點了網址就可以玩!不受時間空間限制!有手機就可以玩!流量也要不了幾十k。

後來最讓我不能忍的是,這個遊戲就是個單機遊戲!!!你可能會想,難不成答主你要做網遊,其實不是。。哈哈哈,我想做個小的排行榜,差不多是成績統計系統,我要是能自動記錄每個人玩了多少分,然後在qq群里貼出來,那不是更好,大家也更會有玩的積極性,就像網友那樣大家互相比看誰的分數高。一個小小的排行榜我去百度發現可不是一般的難,好像還涉及到一門後端語言,於是我又開始了看了一些php,(畢竟中國的論壇教程php教程最多 )php本身還行不算太難,但是其中連接資料庫又是一大難點,在這裡感謝騰訊雲,學生一元購買一個月的伺服器,還可以一鍵安裝環境。感謝百度裡面各種的大神,於是我有擁有了一個可以計算大家勾礦成績的後台啦!!(三個月後我發現了websocket這個東西,這可是可以真正的做網遊的,發現用了這個技術的網頁網遊延遲不算太高,等日後有時間再細細研究)

我在做這個遊戲的過程中學到了很多我自認為重要的東西和編程思想,面向對象,對象繼承,操作dom,函數閉包,碰撞檢測如何實現,動畫竟然是用快速的重繪實現,各種障眼法!!我認為這個過程對我的幫助很大,歡迎大家交流,想和有同樣的愛好的人一起開發小遊戲!!

你以為這就完了,菜鳥之路終結了?

然而,不!!!我還想學3d!!!3D啊,你問我我是不是瘋了,你個菜雞才學了幾天小遊戲你想做3D?在這裡感謝github的three.js組,其實我看到網上各種webgl的效果我是震驚的,這是什麼東西,瀏覽器玩3D,怎麼可能? 多一句話,知乎的大神肯定都覺得是小兒科,而對於我們這些玩4399的小學生來說,這簡直就是鬼斧神工,天工開物,無與倫比!!好不妙哉啊,就拿那個魚缸來說WebGL Aquarium, (注意,webgl手機端支持的還不夠好,手機看知乎的別點了,電腦端請用firefox或者chrome瀏覽器,網頁較大哦)

沒多少人看啊,等看得人多了再講講我three.js的旅途,暫時就只寫這麼多


因為你現在只是學了語法,並沒有開始學各種類庫,比如寫遊戲需要用的圖形庫和界面庫。

推薦個上手快的,你可以下個qt,搜qt學習之路博客,至少掃雷之類的,很容易就能寫出來了。

另外,除了遊戲這種前台交互極度絢爛的,大部分程序的精髓都在後台,用戶能看到的前台只是其中一小部分。很多組件甚至連小黑框都沒有,這才是程序設計的真相。


學C#+WinForm,然後你就可以無痛地快速做出最常見的GUI程序了。這個步驟很有價值——它具有這樣三個好處:

1、提升信心,開發出能給自己用的東西

2、明白UI只是表皮,邏輯才是核心的道理——進而明白你之前學的C++和數據結構之類的知識是幹啥用的

3、很容易地累積出龐大的項目——然後你就會發現之前大力出奇蹟寫的東西有點不堪重負了,進而理解軟體工程和設計模式的知識


4399上的小遊戲,一般不用C++哦。如果你真想做那個,換技術棧了,H5 、JS、 Flash等會更符合你要做的小遊戲。


如果只是遊戲 js一天就夠了


其他回答都很好,但是我看題主應該還是入門,萬一聽不懂。

是這樣的,

c++就是遊戲的後台,是你玩遊戲時看不到的那部分。

你看到的花花綠綠的動畫是另一個方向的,和程序幾乎完全沒關係。

然後你玩的遊戲是由c++和動畫製作者合作完成的。當然,一個人也可以學會兩個東西。

~~~

為什麼你的c++是黑白的呢,因為你是在學語言,你的輸出是console(控制台),它是最簡單,最基礎的方式。

c++有一個叫做MFC的,那個就不是黑白的了,相應的,你需要對更多東西進行設置。(這東西比較低級,不好用,評論區)

有一個軟體,是用來做遊戲的,我們叫它遊戲引擎,它的功能是把動畫和c++代碼文件(cpp)鏈接在一起,然後變成遊戲。類似的引擎有很多。

-----------有人要我講的更細點,那我就說說我之前見過的一個小遊戲吧------------

用的遊戲引擎是:Unity

用的語言是:C#

先介紹遊戲,這是開始界面

戴帽子的是玩家,紅色的是怪,玩家拿著一把AK打怪。請注意屏幕上方的Score,以及左下角的血量。

-----------------現在講講這遊戲是怎麼做的--------

整體項目長這個樣子

---------動畫部分------------

動畫其實就是玩家的角色,怪物的設計等。先講講玩家,下圖中,我們可以看見玩家由彩色的人和槍兩部分組成,這會由美工做出來。同時還有對應的碰撞檢測體積(白色的人和槍),這樣一來,就可以把美工做出來的3D角色變換為電腦能懂的角色,以便進行「碰撞檢測「,碰撞檢測在 這個遊戲里重要用來檢測是不是和怪碰撞了,如果是,那就扣血。同事還可以看到有3個動畫,分別是玩家走路 ,玩家閑著以及玩家死亡,觸發相應條件就播放相應動畫 。

在這裡,c#(比如說)的作用就是對每一個條件進行計算,比如:和玩家碰撞後觸發扣血函數,當玩家血量低於0時觸發死亡動畫,當玩家沒有動作10秒時,觸發idle 動畫。

來看看在引擎里,玩家長什麼樣子。

首先是玩家肚子那裡的音頻圖標是玩家收到攻擊後,播放的玩家痛苦挨揍的音頻。因為玩家是運動的,所以音頻的源頭也得是移動的。

再看看槍口那裡的小飛鏢,那個是粒子系統,玩家不是要開槍嗎,開完槍後,那裡會播放一段槍口煙霧的動畫。再看看那個燈泡圖標,那個是開槍後的槍口火焰動畫,因為是火,所以是光系統而不是粒子系統。再看看燈泡後面的音頻圖標,那是開槍的聲音。

怪我就不說了,差不多。

---代碼部分---

先說一下這遊戲不是我寫的,是開源的遊戲。

看看玩家身上的代碼,分別有Player Health.c#和Player MovementC#。 就是玩家血量和玩家移動咯。

點擊之後,用Visual Studio打開,隨便找個類的方法,比如受傷。

代碼邏輯為:如果受傷,血量=血量-傷害,修改血條數值,播放動畫。如果血量《=0,觸發死亡函數。

」血條「是一個特殊的類,是找個引擎自帶或製作出來的類。你只需要引用這個類文件,然後給他 傳值,血條就會根據血量左右移。

再來看看玩家是怎麼移動的

PlayerRigidBody 也是一個特殊的類,不用我們自己寫,引擎自帶,意思就是遊戲中的玩家的角色。然後使用它的一個移動方法(movePosition),輸入參數就是:改變位置+移動量。

移動量=速度x時間變化量。

簡單吧,哈哈。所以學習代碼還是要的。有什麼需要的評論告訴我,我找個時間添加。


C++自製遊戲框架,GUI自己寫,真的C++。

給個鏈接:bajdcc/GameFramework

下面是做的2048遊戲,【遊戲框架系列】2048 - 知乎專欄

-----------------------------------------------------------------

輪子哥有名言——C++要不斷去練習,所以如果代碼量不過1W,那還是只是做做黑框框遊戲了,像我剛學C語言時,代碼還沒寫過多少,後來上了課就寫了俄羅斯方塊、貪吃蛇、走迷宮。等到我學了C#、java、js後,我看到了另外一片天,編程的世界原來這麼廣泛啊。但是,路要自己走,我接觸了很多很多的領域,bajdcc/dev,基本上流行的語言全被我逛了個遍,等到某天自己發覺——自己終究無事可幹了的時候,我萌發了個想法——我想造個大輪子,好玩的輪子,這個時候,我發現我做過了好多事情——做了GUI、做過Parser、試過WPF、搞過Simulator、調試過OS、……。

所以我想到了做個GameFramework,好久沒接觸C++有點手生了。

項目架構:

  • base - 基礎類(包含二維碼庫、libevent、libcurl)
  • ui - 界面邏輯
  • render - DX渲染邏輯
  • lua - lua代碼
  • lua_ext - lua擴展(UI、Web)
  • script - lua腳本(UI、Scene)

做輪子難的不是寫代碼,而是想設計思路!!那麼架構的選定很重要。然而,有個成熟可行的設計思路並付諸實踐是初學者學不來的。

---------------------------------------------------------

那麼寫個小遊戲也有很多的路走:

  • 會折騰,夠牛b的,自己學習別人的優秀代碼,自己從頭造輪子,途徑是學習GUI怎麼寫(借鑒輪子哥的),學習lua,學習怎麼渲染(GDI或者輪子哥的Direct2D)
  • 次一點的,用用別人的開源框架,像QT等
  • 再次一點的,拿來主義,稍微改改,就當自己的了

哈哈,這個項目雖說是遊戲框架,其實它還可以做音樂播放器等其他功能,所以說,不是為了做遊戲而遊戲,醉翁之意不在酒。

按照自己的水平,選擇不同的路。


這個黑白的程序到底能幹什麼

是一切的核心。


很奇怪的是為什麼大家都在推薦轉語言。cpp不才是最強大的,值得學習的嗎?看完語法就斷定只能做控制台?

首先,控制台不是cpp的全部。有很多的應用,遊戲引擎也是cpp寫的,而且支持cpp繼續擴展自己的功能。torque,unreal 4等。吸加加是語言,很多強大的圖形庫,應用框架都是他的天下。如果你只看到控制台,那隻能說明你只是剛入門。別的不說,創建項目時,你沒看到win32程序也在那嗎?

其次,4399的遊戲就是你的編程目的的話,那你學學即將退出歷史舞台的flash,撤學cpp了。

最後,誰都會迷茫學到的能幹嘛的。要是你真喜歡花里花哨的而不是練好基礎功,那就多看書先。windows編程大師,遊戲編程大師,directX相關,openGL相關,就可以讓你知道你玩的真正大型的遊戲是什麼做出來的,畫面品質跟4399比…真的是天淵之別。

(當然看到這些書基本都是把迷茫的勸退了。)


浙大翁愷老師講C語言的時候給了一個acllib,基於windows api做的封裝,提供了繪圖,滑鼠鍵盤事件回調等基本函數,將開發者從複雜的windows窗口系統中解放出來,可以快速進行遊戲的邏輯設計。

不過我不建議這樣做。術業有專攻,自己造輪子最可能的結果是中途放棄,或者達不到自己滿意的效果。所以想寫小遊戲的話我建議用unity 3D。

我第一次接觸unity是公司的任務,讓我做一個感測器位姿顯示軟體(功能很簡單,但是一定要炫,一定要高大上)。一開始用openGL做,結果光導入三維模型這一步就耗費了大量的時間,而且最終效果也不滿意,而此時已經幾千行代碼了。後來想到用專業的遊戲引擎來做。從第一次接觸安裝unity到最終做好只用了不到兩天的時間,那同時是我第一次使用c#。

官網的第一個入門教程是一個滾小球的教程。九個視頻片段(每個視頻十分鐘左右)基本上讓你明白unity的工作原理和組織結構。第二個教程是space shooter,效果也很贊,實現也非常簡單。後面的我就沒做了,因為學到的這些已經夠我完成任務了。

最關鍵的是,unity真的做到了全平台支持,一個工程同時可以在windows,linux,macos,webgl,android和ios上跑,而且不需要依賴任何配置,編譯後拷過去就能用。便於你和同學分(zhuang)享(bi)。

所以說磨刀不誤砍柴工,我建議題主在C++的基礎上學點C#,然後用unity做遊戲開發,絕對事半功倍。而C++有更適合它的領域(比如工業控制,機器視覺,數值計算,嵌入式等等)。祝好運。


黑框對初學者最大的好處就是--------讓初學者把注意力放在編程語言和程序設計本身上,而不會被軟體開發相關的其他繁瑣的東西所干擾。


志向是做遊戲的話以後會加班加成狗啊。


以2048為例,你UI寫的再好看,不如在黑框框里寫一個計算機自動運算2048的程序提高得快,如果你的評估函數是用計算機程序找出來的,那麼提高就更大了。


現在大三狗。。用c#兩個星期編程,實現類似4399射擊遊戲的小遊戲。。。

1.理解面向對象的思想。由於編一個小遊戲是大一c#大作業,拿起書一本一本看,實驗,然後理解了面向對象思想之後頓悟。

2.從小做起,一次實現一些功能。

3.我寫代碼之前喜歡先寫文檔,想可能出現的所有情況,然後把所有的邏輯用代碼偽代碼簡單寫在紙上,之後才是敲代碼。。

4.層次清晰,盡量低耦合,高內聚。。

5.csdn有很多大神, stack overflow可以解決很多問題。。


我也是剛入門的c++學習者,也是打算以後做遊戲的,現在迷茫得都快失眠了,樓主的問題也正好是我的問題啊


這很正常,C++是一門博大精深的語言。那個黑窗俗稱控制台,是系統給你提供的一個已經實現好的輸入和輸出界面,本身也是一個程序。如果你想要做一個看得見摸得著的有界面的軟體那你得實現一個自己的界面程序來實現類似那個黑窗的功能。如果不急用C++的話可以先用C#或者python練習寫點簡單的用戶界面程序,這些語言提供更多簡單易用的特性,而且有很強大的IDE可以幫助你快速上手提高自信。


找個項目開發的視頻教程,照著擼一遍。先熟悉遊戲開發流程。在想怎麼做遊戲。


Unity - Game Engine


推薦閱讀:

MATLAB App Designer教程連載1:如何使用App Designer進行的簡單的GUI設計
如何形式化定義「什麼是面向對象」?
【Kotlin填坑-03】類訪問器get和set :不要自己調用自己啊!
這樣理解面向對象的封裝,繼承,多態是否正確?
如何理解「在面向對象編程的時候,方法或者函數的參數最好是介面或者抽象類」?

TAG:編程 | 面向對象編程 | C |