开发自己的QQ游戏
時間過得很快,是我工作滿十年的日子。 感謝我的導師 阿福,感謝身邊的小伙伴們。感謝家人的支持和理解。 感謝十年前的隔壁班那位外語系女生,替我保存著這份畢業設計十年(2006-2016)。 回憶寫程序的這十年, 最開心的還是在 2006年讀書時, 仿照騰訊的QQ游戲,實現的6人游戲《火拼俄羅斯》。 當然現在最開心的事情,是把十年前的這點小心思,寫在騰訊的KM上了。? 注: 主要技術點 ?1, 設計模塊 ( bridge , instance 等 ) 2, 雙緩沖繪制 ( 防止界面閃爍 常用 ?) 3, 數據結構 ( 矩陣轉置 ) 4, 消息的異步通知 ?(主要是網絡消息的異步通知) 5 , ? 游戲界面信息的差異傳輸已經數據編碼?? ?6 , ? tcp 的網絡編程???
消息緩沖處理, 主要需要考慮用戶側 和服務側
public class SuperBrick ?//方塊父類 { public int[,,] Brick_Array; ?//三維數組 存儲 方塊旋轉4個方向的數據? public SuperBrick() { this.Brick_Array=new int[4,5,5]; for(int i=0;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=0;
} protected void turnBrick_Four()//旋轉方塊(4個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; } protected void turnBrick_Two()//旋轉方塊(2個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) if(i%2==0) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; else this.Brick_Array[i,x,y]=this.Brick_Array[i-1,y,4-x]; } } public class Brick_BB :SuperBrick//田字型方塊 { public Brick_BB() { this.setBrickArray(); } private void setBrickArray() { for(int i=0;i<4;i++) { this.Brick_Array[i,3,1]=1; this.Brick_Array[i,3,2]=1; this.Brick_Array[i,2,1]=1; this.Brick_Array[i,2,2]=1;
} } } public class Brick_UT :SuperBrick//倒T型方塊 { public Brick_UT() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_L :SuperBrick//L型防塊 { public Brick_L() { this.setBrickArray(); this.turnBrick_Four();
} private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UL :SuperBrick//倒L型方塊? { public Brick_UL() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_I :SuperBrick//-型方塊 { public Brick_I() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; this.Brick_Array[0,4,2]=1; } } public class Brick_Z :SuperBrick//Z型方塊 { public Brick_Z() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,2,1]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UZ :SuperBrick//倒Z型方塊 { public Brick_UZ() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; } }
感謝我的導師 阿福,感謝身邊的小伙伴們。感謝家人的支持和理解。 感謝十年前的隔壁班那位外語系女生,替我保存著這份畢業設計十年(2006-2016)。 回憶寫程序的這十年, 最開心的還是在 2006年讀書時, 仿照騰訊的QQ游戲,實現的6人游戲《火拼俄羅斯》。 當然現在最開心的事情,是把十年前的這點小心思,寫在騰訊的KM上了。? 注: 主要技術點 ?1, 設計模塊 ( bridge , instance 等 ) 2, 雙緩沖繪制 ( 防止界面閃爍 常用 ?) 3, 數據結構 ( 矩陣轉置 ) 4, 消息的異步通知 ?(主要是網絡消息的異步通知) 5 , ? 游戲界面信息的差異傳輸已經數據編碼?? ?6 , ? tcp 的網絡編程???
消息緩沖處理, 主要需要考慮用戶側 和服務側
public class SuperBrick ?//方塊父類 { public int[,,] Brick_Array; ?//三維數組 存儲 方塊旋轉4個方向的數據? public SuperBrick() { this.Brick_Array=new int[4,5,5]; for(int i=0;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=0;
} protected void turnBrick_Four()//旋轉方塊(4個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; } protected void turnBrick_Two()//旋轉方塊(2個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) if(i%2==0) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; else this.Brick_Array[i,x,y]=this.Brick_Array[i-1,y,4-x]; } } public class Brick_BB :SuperBrick//田字型方塊 { public Brick_BB() { this.setBrickArray(); } private void setBrickArray() { for(int i=0;i<4;i++) { this.Brick_Array[i,3,1]=1; this.Brick_Array[i,3,2]=1; this.Brick_Array[i,2,1]=1; this.Brick_Array[i,2,2]=1;
} } } public class Brick_UT :SuperBrick//倒T型方塊 { public Brick_UT() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_L :SuperBrick//L型防塊 { public Brick_L() { this.setBrickArray(); this.turnBrick_Four();
} private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UL :SuperBrick//倒L型方塊? { public Brick_UL() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_I :SuperBrick//-型方塊 { public Brick_I() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; this.Brick_Array[0,4,2]=1; } } public class Brick_Z :SuperBrick//Z型方塊 { public Brick_Z() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,2,1]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UZ :SuperBrick//倒Z型方塊 { public Brick_UZ() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; } }
1, 設計界面 ( 全部山寨 )
界面豪無疑問 是山寨, 有玩過這個游戲的同學肯定很清楚。 下面哪些道具也都是按照當時使用習慣設計的。 當然 我偷偷 給自己設了幾個快捷鍵。? 為了防止界面出現閃爍的效果 , 整個界面使用 雙緩沖輸出( ?即 一塊內存用來繪制界面, 一塊內存拷貝繪制內存,用來直接展示。 )2, 程序結構?
備注:當時的設計電子文檔丟了( 好可惜,花個把星期來學word 的格式),交給老師的那一份卻神奇的流下來了( 老師太負責了 ) , 只好用手機拍幾張照片湊合用一下。? 設計的總體思路還是挺簡單的, ?客戶端總體分4大模塊。如圖下圖 :? ? ? ?1, 圖像界面模塊 ? ? ? ??: ?游戲的展示以及指令接收 ?。 2, 用戶消息處理模塊??: ? 負責接收用戶指令,聊天等消息 。 ? ? 3, ? ?中間消息雙向處理橋模塊: ??設計模式的 Bridge 模式??, 接收網絡命令 通知前端, 同時將前端用戶指令發送到網絡模塊 ? ?。? ?4, ? ?網絡消息的接收與發送模塊: ?負責連接游戲服務器以及網絡心跳維護。?3, 消息流程?
消息這里主要是 3類:? ?1, 游戲指令和道具?? ?: ? 主要是各種道具的使用了。 ? ? 2, 用戶聊天消息 ??? ?: ?玩家之間的聊天消息 。 ? 3, 游戲界面同步展示?: ? 玩家直接的信息同步展示稍微麻煩一點, 為了減少網絡傳輸量,主要采取兩種辦法: 1,只傳輸改變的界面信息,2,將界面方塊信息編碼成簡單的整數傳輸。 ??消息緩沖處理, 主要需要考慮用戶側 和服務側
4, 類結構?
方塊類結構
每一個方塊都是一個類 , 每個方塊都繼承自 統一的父類( SuperBrick )? 1, 方塊共同的父類?( SuperBrick )??: ? 使用三維數組存儲 2維數據旋轉的 4個方向 ? 2, 其他7種類型方塊繼承自?SuperBrick?: ??2, 中間消息處理
1, Brige 類?: ?設計模式的橋模式, 負責調用 Tetirs_Bridge 接口 和 Message_Bridge 接口? ?2 ?, ?注冊兩個接口?: ?Tetirs_Bridge 接口 和 Message_Bridge 接口 ??5,部分代碼
public class SuperBrick ?//方塊父類 { public int[,,] Brick_Array; ?//三維數組 存儲 方塊旋轉4個方向的數據? public SuperBrick() { this.Brick_Array=new int[4,5,5]; for(int i=0;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=0;
} protected void turnBrick_Four()//旋轉方塊(4個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; } protected void turnBrick_Two()//旋轉方塊(2個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) if(i%2==0) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; else this.Brick_Array[i,x,y]=this.Brick_Array[i-1,y,4-x]; } } public class Brick_BB :SuperBrick//田字型方塊 { public Brick_BB() { this.setBrickArray(); } private void setBrickArray() { for(int i=0;i<4;i++) { this.Brick_Array[i,3,1]=1; this.Brick_Array[i,3,2]=1; this.Brick_Array[i,2,1]=1; this.Brick_Array[i,2,2]=1;
} } } public class Brick_UT :SuperBrick//倒T型方塊 { public Brick_UT() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_L :SuperBrick//L型防塊 { public Brick_L() { this.setBrickArray(); this.turnBrick_Four();
} private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UL :SuperBrick//倒L型方塊? { public Brick_UL() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_I :SuperBrick//-型方塊 { public Brick_I() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; this.Brick_Array[0,4,2]=1; } } public class Brick_Z :SuperBrick//Z型方塊 { public Brick_Z() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,2,1]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UZ :SuperBrick//倒Z型方塊 { public Brick_UZ() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; } }
?
6, 不足之處
1, ?用戶等級以及積分還不是很完整 ? 2, ?網絡消息發送多線程還沒有壓測? 3, ?最后提交上代碼 , 各位大神不要鄙視我。 上傳的代碼 還有很多 bug , ?當時也有很多版本,也都木有保存下來。 只留下這一份,還是保存在 csdn 上的 ?.感謝我的導師 阿福,感謝身邊的小伙伴們。感謝家人的支持和理解。 感謝十年前的隔壁班那位外語系女生,替我保存著這份畢業設計十年(2006-2016)。 回憶寫程序的這十年, 最開心的還是在 2006年讀書時, 仿照騰訊的QQ游戲,實現的6人游戲《火拼俄羅斯》。 當然現在最開心的事情,是把十年前的這點小心思,寫在騰訊的KM上了。? 注: 主要技術點 ?1, 設計模塊 ( bridge , instance 等 ) 2, 雙緩沖繪制 ( 防止界面閃爍 常用 ?) 3, 數據結構 ( 矩陣轉置 ) 4, 消息的異步通知 ?(主要是網絡消息的異步通知) 5 , ? 游戲界面信息的差異傳輸已經數據編碼?? ?6 , ? tcp 的網絡編程???
1, 設計界面 ( 全部山寨 )
界面豪無疑問 是山寨, 有玩過這個游戲的同學肯定很清楚。 下面哪些道具也都是按照當時使用習慣設計的。 當然 我偷偷 給自己設了幾個快捷鍵。? 為了防止界面出現閃爍的效果 , 整個界面使用 雙緩沖輸出( ?即 一塊內存用來繪制界面, 一塊內存拷貝繪制內存,用來直接展示。 )2, 程序結構?
備注:當時的設計電子文檔丟了( 好可惜,花個把星期來學word 的格式),交給老師的那一份卻神奇的流下來了( 老師太負責了 ) , 只好用手機拍幾張照片湊合用一下。? 設計的總體思路還是挺簡單的, ?客戶端總體分4大模塊。如圖下圖 :? ? ? ?1, 圖像界面模塊 ? ? ? ??: ?游戲的展示以及指令接收 ?。 2, 用戶消息處理模塊??: ? 負責接收用戶指令,聊天等消息 。 ? ? 3, ? ?中間消息雙向處理橋模塊: ??設計模式的 Bridge 模式??, 接收網絡命令 通知前端, 同時將前端用戶指令發送到網絡模塊 ? ?。? ?4, ? ?網絡消息的接收與發送模塊: ?負責連接游戲服務器以及網絡心跳維護。?3, 消息流程?
消息這里主要是 3類:? ?1, 游戲指令和道具?? ?: ? 主要是各種道具的使用了。 ? ? 2, 用戶聊天消息 ??? ?: ?玩家之間的聊天消息 。 ? 3, 游戲界面同步展示?: ? 玩家直接的信息同步展示稍微麻煩一點, 為了減少網絡傳輸量,主要采取兩種辦法: 1,只傳輸改變的界面信息,2,將界面方塊信息編碼成簡單的整數傳輸。 ??消息緩沖處理, 主要需要考慮用戶側 和服務側
4, 類結構?
方塊類結構
每一個方塊都是一個類 , 每個方塊都繼承自 統一的父類( SuperBrick )? 1, 方塊共同的父類?( SuperBrick )??: ? 使用三維數組存儲 2維數據旋轉的 4個方向 ? 2, 其他7種類型方塊繼承自?SuperBrick?: ??2, 中間消息處理
1, Brige 類?: ?設計模式的橋模式, 負責調用 Tetirs_Bridge 接口 和 Message_Bridge 接口? ?2 ?, ?注冊兩個接口?: ?Tetirs_Bridge 接口 和 Message_Bridge 接口 ??5,部分代碼
public class SuperBrick ?//方塊父類 { public int[,,] Brick_Array; ?//三維數組 存儲 方塊旋轉4個方向的數據? public SuperBrick() { this.Brick_Array=new int[4,5,5]; for(int i=0;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=0;
} protected void turnBrick_Four()//旋轉方塊(4個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; } protected void turnBrick_Two()//旋轉方塊(2個方向) { for(int i=1;i<4;i++) for(int x=0;x<5;x++) for(int y=0;y<5;y++) if(i%2==0) this.Brick_Array[i,x,y]=this.Brick_Array[i-1,4-y,x]; else this.Brick_Array[i,x,y]=this.Brick_Array[i-1,y,4-x]; } } public class Brick_BB :SuperBrick//田字型方塊 { public Brick_BB() { this.setBrickArray(); } private void setBrickArray() { for(int i=0;i<4;i++) { this.Brick_Array[i,3,1]=1; this.Brick_Array[i,3,2]=1; this.Brick_Array[i,2,1]=1; this.Brick_Array[i,2,2]=1;
} } } public class Brick_UT :SuperBrick//倒T型方塊 { public Brick_UT() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_L :SuperBrick//L型防塊 { public Brick_L() { this.setBrickArray(); this.turnBrick_Four();
} private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UL :SuperBrick//倒L型方塊? { public Brick_UL() { this.setBrickArray(); this.turnBrick_Four(); } private void setBrickArray() { this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_I :SuperBrick//-型方塊 { public Brick_I() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; this.Brick_Array[0,4,2]=1; } } public class Brick_Z :SuperBrick//Z型方塊 { public Brick_Z() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,1,1]=1; this.Brick_Array[0,2,1]=1; this.Brick_Array[0,2,2]=1; this.Brick_Array[0,3,2]=1; } } public class Brick_UZ :SuperBrick//倒Z型方塊 { public Brick_UZ() { this.setBrickArray(); this.turnBrick_Two(); } private void setBrickArray() { this.Brick_Array[0,2,1]=1; this.Brick_Array[0,3,1]=1; this.Brick_Array[0,1,2]=1; this.Brick_Array[0,2,2]=1; } }
?
6, 不足之處
1, ?用戶等級以及積分還不是很完整 ? 2, ?網絡消息發送多線程還沒有壓測? 3, ?最后提交上代碼 , 各位大神不要鄙視我。 上傳的代碼 還有很多 bug , ?當時也有很多版本,也都木有保存下來。 只留下這一份,還是保存在 csdn 上的 ?.總結
- 上一篇: linux卸载思科,ciscodk教你卸
- 下一篇: requestPermissions