關於遊戲的介紹:
貪食蛇遊戲是一條不停游動的蛇不斷的捕食來達到自身的增長,但是若蛇碰到自身的身體或者碰到了任何障礙物,則遊戲結束。
在該篇文章中,我並不討論遊戲的規則,而只是實現乙個游動的蛇。通過該實現來看關於物件導向的設計。
尋找規律,建立物件模型:
首先從物理的角度來分析蛇得運動規律。它是蠕動的,像水一樣流動。他有個特性就是身體的每乙個點都經過他頭部所在的點,他每乙個時刻骨節所要運動的目的地是他前乙個骨節所在的位置。
不難看出,其中的物件模型為:蛇,骨骼,骨節,頭。抽象的介面為:蛇,骨骼,骨節,頭,圖元。
結構圖:
介面結構圖
物件結構圖
給介面新增行為:
圖元(graphicobject)
繪畫:進行圖元自身的繪畫操作
當前矩形:得到圖元當前所在的矩形,也可考慮使用region,這樣使得對圖元範圍得描述更加具體。
骨節(condyle)
前乙個骨節:提供前序訪問
後乙個骨節:提供後序訪問
流動:進行骨節運動詭計得計算。
骨骼(cadre)(管理骨節鏈)
得到頭:得到蛇頭
得到尾:得到蛇尾
新增骨節:在骨節鏈中新增骨骼
刪除骨節:在骨節鏈中刪掉指定骨節
頭(head)
方向:能夠設定和訪問當前運動方向。
蛇(snake)
增長:蛇進行自身得增長
完善模型,引入訪問者模式
存在的問題:
當前是由具體的骨骼物件來負責圖元的繪畫以及處理流動的,而骨骼只是管理骨節,沒有提供任何訪問骨節的方法,我們應該怎樣訪問骨節呢?比如我們要每個骨節畫出自己的形態,我們可能會這樣做。在骨骼上提供乙個繪畫方法,然後通過遍歷骨節鏈,呼叫每個骨節的繪畫方法。這樣似乎可以解決問題。那麼,我們要進行骨節流動計算呢?我們再在骨骼上提供流動方法,然後同樣的遍歷骨節,呼叫每個的流動方法。我們要是加入統計骨節個數功能呢?我們要是加入其他的需要遍歷骨骼的方法呢?……
這樣做的缺點是什麼?
1、 相似的**有多份
2、 如果骨節的訪問結構發生變化,後果會怎樣?
3、 有新功能需要遍歷骨節鏈該怎麼辦?
這樣會迫使我們拷貝**.
解決辦法,引入訪問者模式:
新增加介面如下:
加入行為:
訪問者:(空,無方法,屬性)
被訪問者:
接受訪問者
骨節訪問者:繼承自訪問者
訪問骨節
完整的結構圖:
介面結構圖:
物件結構圖:
小遊戲,貪食蛇
include include include include struct coor struct snake handle hconsole getstdhandle std output handle 獲取標準輸出控制代碼 int food x,food y 食物座標 int score 0 ...
as貪食蛇小遊戲(二)
先在建構函式裡面新增監聽事件 stage.addeventlistener keyboardevent.key down,onkeydownhandler snakegame類裡面新增2個全域性變數 private varisstop boolean true private varisover b...
貪食蛇的程式
無聊,分析了乙個用c語言寫的貪食蛇的程式。寫的非常簡練,就是函式的名字起得不是很好。include include define kuan 20 地圖的大小 int iz kuan kuan 地圖 struct jiedian 蛇的結點位置,使用鍊錶結構來儲存蛇身上各結點的位置 point ptsh...