1. 程式人生 > >20162301實驗五 數據結構綜合應用

20162301實驗五 數據結構綜合應用

str 閃爍 class 我們 飛機 Y軸 androidm block canvas

20162301實驗五 數據結構綜合應用

北京電子科技學院(BESTI)

實 驗 報 告

課程:程序設計與數據結構

班級:1623

姓名:張師瑜

學號:20162301

指導教師:婁嘉鵬老師、王誌強老師

實驗日期:2017年11月20號

實驗密級:非密級

實驗時間:五天

必修/選修:必修

實驗名稱:圖的實現與應用

實驗儀器:電腦

實驗目的與要求:

  • 目的:學會實現無向圖及有向圖。

  • 要求:

??1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程

??2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,註意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什麽啟示,有什麽收獲,教訓等)。報告可以參考範飛龍老師的指導

??3. 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。

實驗要求

0 分析系統架構

1 編譯、運行、測試系統

2 修改系統

3 分析數據結構、排序、查找算法的應用

0 分析系統架構

技術分享圖片

  • ISprite類是精靈類,其中戰鬥機類、走直線的精靈類(其中子彈類、敵機類都繼承了這個類)、爆炸類都繼承精靈類。

  • 戰鬥機類CombatAircraft:首先確保戰鬥機完全位於Canvas範圍內,每隔7幀發射單發黃色子彈。戰鬥機如果被擊中,執行爆炸效果,具體來說,首先隱藏戰鬥機,然後創建爆炸效果,爆炸用28幀渲染完成,爆炸效果完全渲染完成後,爆炸效果消失。然後戰鬥機會進入閃爍模式,戰鬥機閃爍一定次數後銷毀。

  • 走直線的精靈類AutoISprite:走直線的Sprite類,其位置只能直上直下。在y軸方向移動speed像素,檢查Sprite是否超出了Canvas的範圍,如果超出,則銷毀Sprite。

  • 敵機類EnemyPlane:敵機類,從上向下沿直線運動。設置一個敵機的抗打擊能力和打一個敵機的得分。敵機在繪制完成後要判斷是否被子彈打中,判斷方法為判斷敵機是否與子彈相交。若敵機已經沒有能量了,執行爆炸效果。創建爆炸效果完成後,向GameView中添加得分並銷毀敵機。

  • 爆炸類Explosion:爆炸效果類,位置不可變,但是可以顯示動態的爆炸效果。爆炸效果由14個片段組成,每個爆炸片段繪制2幀。當繪制完所有的爆炸片段後,銷毀爆炸效果。得到繪制完整爆炸效果需要的幀數,即28幀。

1 編譯、運行、測試系統

  • 從碼雲上克隆項目 git clone +XXX,用Android Studio打開項目編譯運行。
    技術分享圖片
    技術分享圖片

2 修改系統

  • 在主界面增加了帶有開發團隊bak的按鈕,點擊後展現出一個新的頁面。
  • 操作過程為:① 在activity_main.xml中增加一個按鈕
<Button
        android:id="@+id/btnMe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/btnDev"
        android:layout_below="@+id/btnDev"
        android:layout_marginTop="21dp"
        android:onClick="onClick"
        android:text="開發團隊bak" />

② 增加activity_zsybak.xml並加入DatePicker來改變原來的界面。

<DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

③ 增加DevActivitybak

public class DevActivitybak extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zsybak);
    }
}

④ 在MainActivity中的onClick方法中加入片段

 if (viewId == R.id.btnMe){
            startMe();
        }
        
 public void startMe(){
        Intent intent = new Intent(MainActivity.this, DevActivitybak.class);
        startActivity(intent);
    }

⑤ 最後,在AndroidManifest中加入<activity android:name=".DevActivitybak"></activity>

  • 結果如下:
    技術分享圖片

技術分享圖片

3 分析數據結構、排序、查找算法的應用

  • 我們小組的數據結構為線性結構,主要使用了線性表。例如獲取處於活動狀態的敵機、存儲所有的精靈等。

     public List<EnemyPlane> getAliveEnemyPlanes(){
        List<EnemyPlane> enemyPlanes = new ArrayList<EnemyPlane>();
        for(ISprite s : sprites){
            if(!s.isDestroyed() && s instanceof EnemyPlane){
                EnemyPlane sprite = (EnemyPlane)s;
                enemyPlanes.add(sprite);
            }
        }
        return enemyPlanes;
    }
  • 將所有敵機存儲在list中,並進行遍歷觀察是否與戰鬥機有交點。若有交點則戰鬥機死亡。

  List<EnemyPlane> enemies = gameView.getAliveEnemyPlanes();
            for(EnemyPlane enemyPlane : enemies){
                Point p = getCollidePointWithOther(enemyPlane);
                if(p != null){
                    //p為戰鬥機與敵機的碰撞點,如果p不為null,則表明戰鬥機被敵機擊中
                    explode(gameView);
                    break;
                }
            }
  • 未使用排序、查找算法。

感想

  • 作為本學期也是一年的java課程以來的最後一次實驗,或許也是最後一篇博客,感觸頗深。在這次大項目的過程中,作為組長的我雖有很多不足但成長了很多收獲了很多。本來以為6個人在一個月的時間內完成一個完整的app是一件不能完成的任務,但到今天看到一個打飛機的遊戲呈現在自己面前覺得很欣慰也很感激。甚至說,小組成員們在一次次討論後,在一起學習代碼後讓我體會到了戰友一般的感覺。將原本生疏無比的Android學習到現在對遊戲的整體結構了然於心,真的是深刻的體會了“做中學”的意義。

技術分享圖片

20162301實驗五 數據結構綜合應用