钢七连实战C3-P2:项目源码结构 面向对象基础 堆分配
鋼七連軟件培訓(xùn)
C3-P2 ?面向?qū)ο??第2節(jié)
1.怎樣閱讀一套項(xiàng)目源碼
2.面向?qū)ο蠡炯夹g(shù)
https://blog.csdn.net/weixin_42644456
一、通用的學(xué)習(xí)路線,解決辦法
學(xué)習(xí)資源:慕課,樣例代碼。
通用的解決辦法:查資料,分析設(shè)計(jì),編碼,調(diào)試
大學(xué)基礎(chǔ)課程和基本功的重要性。程序員,設(shè)計(jì)師,架構(gòu)師。
二、面向?qū)ο缶唧w知識(shí)
程序是打出來的。
不要發(fā)明一個(gè)項(xiàng)目,技術(shù)是通過閱讀學(xué)習(xí)的。
20%的講解,30%的案例閱讀,50%的編碼。
難點(diǎn)分析。初學(xué)者理解困難。當(dāng)學(xué)習(xí)了更多課程、有了更多積累之后,就能聽懂。
老師做的多個(gè)中等案例:
https://blog.csdn.net/weixin_42644456/article/details/103092496
學(xué)生能讀懂多少,能做出多少,能不能做更好的。
Java難題的原理,是C/C++基礎(chǔ)知識(shí).
C3-P1:java的安裝、環(huán)境變量的含義,命令行的編譯和運(yùn)行。
C3-P1更正:程序文件:JavaGame.java
文件中的類名: public class JavaGame 和文件名一致。
? ?C3-P2:eclipse或者其他工具。
Java, eclipse都有大量安裝教程、配置教程。
Eclipse的版本(32/64)要和jdk匹配32位、64位.
Eclipse配置jdk路徑。
Window-- Preferences--搜索JDK: java/installed JRES 添加本機(jī)jdk路徑。
例如:C:\Program Files (x86)\Java\jdk1.7.0_60
eclipse編輯文本。由eclipse找到j(luò)dk,觸發(fā)java的編譯、運(yùn)行。如果是控制臺(tái)main, 把運(yùn)行結(jié)果輸出在eclipse的窗口上。
三、案例閱讀:
初級(jí)效果:LegendCarry0925_1 飛機(jī)大戰(zhàn)源碼
中等效果:LegendCarry0927飛機(jī)大戰(zhàn)源碼
游戲角色:飛機(jī)、敵機(jī)、子彈、BOSS
地圖:背景圖片。
游戲功能:多個(gè)關(guān)卡,BOSS1,BOSS2,...
多種運(yùn)動(dòng)方式:BOSS怎么動(dòng),飛機(jī)拐彎,子彈斜著飛,道具飄動(dòng)
游戲事件的觸發(fā),數(shù)據(jù)刷新:碰撞檢測(cè)
大二下學(xué)期:planegame_finalV2源碼
增加了數(shù)據(jù)庫(kù):用戶注冊(cè)、登錄,保存玩家生命值、得分等數(shù)據(jù)。
增加了設(shè)計(jì)模式:單件、工廠、備忘錄。適合于大一、大二初學(xué)者。大三、大四是否能改進(jìn)。
四、怎樣閱讀一套工程代碼:
學(xué)習(xí)目標(biāo):類是什么,答:封裝、繼承、多態(tài)。菜譜。科一。
學(xué)習(xí)目標(biāo):類怎樣組成了一個(gè)項(xiàng)目。做飯。科二、科三。
程序是打出來的:不是看會(huì)了菜譜,再做飯。是會(huì)做飯以后,理解了菜譜。
語(yǔ)言無關(guān)(c++,java, javascript, python)。
閱讀順序:Model,View,Control。
閱讀順序:Model這個(gè)應(yīng)用軟件、游戲軟件的數(shù)據(jù)怎樣存放。
View數(shù)據(jù)、圖片怎樣輸出到屏幕。
Control業(yè)務(wù)邏輯,行為。
1.按照代碼難度,先找到數(shù)據(jù)類Model類:
玩家積分,飛機(jī)類,敵機(jī)類,子彈類....
數(shù)值設(shè)計(jì)崗位:王者榮耀的一個(gè)英雄,是同一個(gè)類,有30多個(gè)數(shù)值屬性。
比如:int hp; int mp; int attack_distance;
? ?int attack_speed;?? ? int shield;
int magic_distance;?
int attack_type;//攻擊范圍:1一個(gè)點(diǎn)/區(qū)域范圍
不同角色,是數(shù)值高低的組合搭配。
高級(jí)數(shù)值設(shè)計(jì):所有英雄,所有技能,是五個(gè)因素的組合搭配:
1.攻擊 2.防守 3.控制 4.運(yùn)動(dòng)方式 5.傷害范圍
攻防技能的數(shù)值設(shè)計(jì),傷害,防守,有趣,平衡。
Model的設(shè)計(jì):
(1)一個(gè)數(shù)據(jù)、一個(gè)類。(實(shí)訓(xùn))
(2)父類、子類。復(fù)雜設(shè)計(jì)模式。類、接口的設(shè)計(jì)。(培訓(xùn)機(jī)構(gòu))
少量代碼、通用代碼,實(shí)現(xiàn)復(fù)雜功能。
(3)復(fù)雜數(shù)據(jù)結(jié)構(gòu)。
2.工程View部分:新建了哪些窗口,有那些界面元素
飛機(jī)類,敵機(jī)類的圖片素材是哪些文件(Model),怎樣輸出圖片(View)
3.行為Control部分:
(1)鼠標(biāo)、鍵盤事件接口
(2)游戲循環(huán),碰撞檢測(cè)
(3)碰撞檢測(cè):事件觸發(fā)和數(shù)值改變,攻防結(jié)算,生命值改變,積分,吃到道具。
事件觸發(fā)和數(shù)值改變:
A.簡(jiǎn)單寫法。初學(xué)者用分支、循環(huán)、函數(shù),用堆積函數(shù)的辦法,做更多功能。代碼越來越多,容易出錯(cuò),難以調(diào)試,不可維護(hù)。
B.用了設(shè)計(jì)模式的改進(jìn)寫法。通用的一段代碼,完成多個(gè)功能。好的寫法,重復(fù)、組合各種模塊/功能點(diǎn),由此產(chǎn)生大型復(fù)雜游戲。
(4)數(shù)據(jù)刷新:勝負(fù)
(5)數(shù)據(jù)刷新:事件、狀態(tài)、動(dòng)作。產(chǎn)生BOSS,這一關(guān)失敗,這一關(guān)勝利
事件、狀態(tài)、動(dòng)作:有限狀態(tài)機(jī)。可以寫任何游戲。
以飛機(jī)大戰(zhàn)/LegendCarry0927為例:
Model類:
BOSS: /LegendCarry0927/src/gamerole/Boss.java
玩家:/LegendCarry0927/src/gamerole/Hero.java
父類:ItemBase
子彈:/LegendCarry0927/src/gamerole/BulletArray.java
敵機(jī):/LegendCarry0927/src/gamerole/EnemyArray.java
...
類和屬性(成員變量)
public class ItemBase {
?? ?public int x ; // 橫坐標(biāo)
?? ?public int y ; // 縱坐標(biāo)
?? ?public int r ; // 感應(yīng)半徑
?? ?public int iseffect ; //是否有效,在屏幕繪制
?? ?public int state ; //當(dāng)前狀態(tài)
?? ?
?? ?public int allBlood ; //總血量
?? ?public int blood ; //當(dāng)前血量
?? ?public int shield ; //護(hù)甲
?? ?
?? ?public Image Img;?? ?//圖片
?? ?public String ImgFile;
View:窗口
Hero玩家類的父類ItemBase:
public void paint()
{
//繪制一張圖片
}
函數(shù)上,右鍵點(diǎn)擊Call Hierarchy。查看該函數(shù)在哪些地方被調(diào)用。
窗口類JFrame:
窗口添加了一個(gè)面板類MyPanel
MyPanel包含一個(gè)繪圖函數(shù)public void paint(Graphics g) {... }
其中,調(diào)用hero.paint(); 畫出了玩家飛機(jī)。
行為Control部分:
了解了Model數(shù)據(jù),了解View的繪圖輸出,最后是業(yè)務(wù)邏輯、行為Control:
類名MyPanel,創(chuàng)建了一個(gè)對(duì)象 panel
MyPanel panel = new MyPanel() ;
Java多線程編程:
Thread th = new Thread(panel) ;
?? ??? ?th.start() ;// 觸發(fā)了panel的run()函數(shù)
panel的run()函數(shù):
public void run() {
?? ??? ?
?? ??? ?while(true) {
?? ??? ? ?? ?//不停的刷新數(shù)據(jù),業(yè)務(wù)邏輯
?? ??? ??? ?/*重畫*/?
repaint() ; ?? ?
//觸發(fā)了MyPanel的繪圖函數(shù)public void paint(Graphics g) {... }?? ??? ??
?? ??? ?}
?? ?}
小節(jié):
一些類,完成Model。一些類完成View,完成Control。共同組成了一個(gè)軟件項(xiàng)目。
View和Control,混合寫在窗口類、面板類之中,這是不好的寫法。
這三部分內(nèi)容,混合寫,還是分開寫,類和類的牽連多不多,這就是類的內(nèi)聚、耦合。
好的設(shè)計(jì):分工良好,內(nèi)聚性高,耦合性低。
《設(shè)計(jì)模式》:怎么設(shè)計(jì)類(類的個(gè)數(shù)、結(jié)構(gòu)、關(guān)系),解決某種應(yīng)用問題。
----
Java函數(shù):不是直接調(diào)用,而是間接觸發(fā)。比如:按鍵、鼠標(biāo)的響應(yīng)函數(shù)。線程啟動(dòng)的Run函數(shù)。repaint()發(fā)出一個(gè)消息,間接觸發(fā)繪圖函數(shù)。
大一初學(xué)者,剛學(xué)習(xí)了函數(shù)、參數(shù)、返回值,做《貪吃蛇》,情理之中。
這種項(xiàng)目,是大一學(xué)完《java》、大二學(xué)完《設(shè)計(jì)模式》的學(xué)習(xí)成果,代表學(xué)生兩年學(xué)習(xí)的編程能力。
面向?qū)ο蟮募夹g(shù):
Java環(huán)境有問題。C++的瀏覽器在線編程,學(xué)習(xí)面向?qū)ο蟮募夹g(shù)。
程序員的工作:
1.高效率的學(xué)習(xí)過程,事半功倍,成長(zhǎng)為軟件工程師。
2.解決語(yǔ)法錯(cuò)誤 expected ';' after class definition
3.解決功能錯(cuò)誤
python123, 瀏覽器在線C++編程:
#include "stdio.h" //OOP,面向?qū)ο?#xff0c;封裝,繼承,多態(tài) //封裝舉例:成員變量,成員函數(shù) 組成一個(gè)類 class Hero {//成員變量或者成員函數(shù)的權(quán)限 public:// 默認(rèn)private, 不可以從外部訪問int x;int y; public:void printhero(){printf("%d,%d\n", x,y);} };// expected ';' after class definition int main(){Hero h1,h2;h1.x=100; // 對(duì)象.成員變量 對(duì)象.成員函數(shù)h1.y=200;h1.printhero();h2.printhero( );return 0; }輸出結(jié)果:
-1116678880,32766
4195728,0
這種輸出,是C的變量沒有初始化,輸出的原始數(shù)據(jù)。
權(quán)限錯(cuò)誤。error: 'int Hero::x' is private
C3 -P1, Java的錯(cuò)誤舉例:對(duì)象數(shù)組添加十個(gè)不同的對(duì)象,再次遍歷,數(shù)值都一樣。
C++ 十個(gè)對(duì)象組成的數(shù)組:十個(gè)數(shù)據(jù),各不相同,結(jié)果正確
Hero hArray[10]={};
? ? int i;
? ? for(i=0;i<10;i++)
? ? {
? ? ? ? h1.x=100+i;
? ? ? ? hArray[i]=h1; ? // 數(shù)組元素是十個(gè)具體的對(duì)象,各不相同
? ? ? ? h1.printhero();
? ? }
? ? ?printf("\n --- 遍歷各個(gè)元素 \n");
? ? for(i=0;i<10;i++)
? ? {
? ? ? ? hArray[i].printhero();
? ? }
C++ 十個(gè)對(duì)象指針組成的數(shù)組:重現(xiàn)JAVA的錯(cuò)誤
以下指針數(shù)組,就是第一節(jié)課java代碼,編譯后的樣子。
Hero* hArray[10]={};
? ? int i;
? ? for(i=0;i<10;i++)
? ? {
? ? ? ? h1.x=100+i; ? ? //修改的是同一個(gè)對(duì)象
? ? ? ? hArray[i]=&h1; ? // 數(shù)組元素是十個(gè)指針,指向了同一個(gè)元素
? ? ? ? h1.printhero();
? ? }
? ? ?printf("\n --- 遍歷各個(gè)元素 \n");
? ? for(i=0;i<10;i++)
? ? {
? ? ? ? hArray[i]->printhero();
? ? }
C++ 十個(gè)對(duì)象指針組成的數(shù)組:指針數(shù)組的正確寫法。
給數(shù)組添加元素的時(shí)候,在循環(huán)體內(nèi),每次創(chuàng)建新對(duì)象。
數(shù)組元素是不同的指針,指向不同的對(duì)象。
Hero* hArray[5]={};
? ? int i;
? ? Hero* tmp;
? ? ?printf(" one pointer size %d\n",sizeof(tmp) );
? ? for(i=0;i<5;i++)
? ? {
? ? ? ? tmp=new Hero;
? ? ? ? tmp->x=100+i; ? ? //每次分配新對(duì)象
? ? ? ? hArray[i]=tmp; ? // 數(shù)組元素是不同的指針,指向不同的對(duì)象
? ? ? ? tmp->printhero();
? ? }
? ? ?printf("\n --- 遍歷各個(gè)元素 \n");
? ? for(i=0;i<5;i++)
? ? {
? ? ? ? hArray[i]->printhero();
? ? ? ? //printf("%x\n",hArray[i] );
}
以上對(duì)象指針組成的數(shù)組,是JAVA數(shù)組列表編譯之后的樣子。
看起來是對(duì)象數(shù)組、添加的是對(duì)象,那是Java程序書寫的樣子。
堆的分配。
這需要《匯編語(yǔ)言》、《計(jì)算機(jī)操作系統(tǒng)》、《計(jì)算機(jī)組成原理》的知識(shí)。
函數(shù)局部變量,棧的分配。
視頻處理工具推薦:視頻剪切合并器。
總結(jié)
以上是生活随笔為你收集整理的钢七连实战C3-P2:项目源码结构 面向对象基础 堆分配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5G NR室分共享覆盖解决方案
- 下一篇: 基于JSP的民宿酒店管理系统【数据库设计