开发自己的QQ游戏

发表于2016-03-16
评论0 2.1k浏览
时间过得很快,来腾讯很快就一年了,凑巧,也是我工作满十年的日子。
感谢我的导师 阿福,感谢身边的小伙伴们。感谢家人的支持和理解。
感谢十年前的隔壁班那位外语系女生,替我保存着这份毕业设计十年(2006-2016)。
回忆写程序的这十年, 最开心的还是在 2006年读书时, 仿照腾讯的QQ游戏,实现的6人游戏《火拼俄罗斯》。
当然现在最开心的事情,是把十年前的这点小心思,写在腾讯的KM上了。 
注: 主要技术点
一、设计模块 ( bridge , instance 等 )
、双缓冲绘制 ( 防止界面闪烁 常用  )
、 数据结构 ( 矩阵转置,  将各种方块旋转后的数据预先存储到3维数组)
、消息的异步通知  (主要是网络消息的异步通知)
、 游戏界面信息的差异传输已经数据编码  
六 、 tcp 的网络编程   

一、 设计界面 ( 全部山寨 )

  界面豪无疑问 是山寨, 有玩过这个游戏的同学肯定很清楚。 下面哪些道具也都是按照当时使用习惯设计的。 当然 我偷偷 给自己设了几个快捷键,为了防止界面出现闪烁的效果 , 整个界面使用 双缓冲输出(  即 一块内存用来绘制界面, 一块内存拷贝绘制内存,用来直接展示。 )

二、 程序结构 

  备注:当时的设计电子文档丢了( 好可惜,花个把星期来学word 的格式),交给老师的那一份却神奇的流下来了( 老师太负责了 ) , 只好用手机拍几张照片凑合用一下,设计的总体思路还是挺简单的,  客户端总体分4大模块。如图下图 : 
 1、 图像界面模块 : 游戏的展示以及指令接收  。
2、用户消息处理模块 : 负责接收用户指令,聊天等消息 。    
3、中间消息双向处理桥模块: 设计模式的 Bridge 模式  , 接收网络命令 通知前端, 同时将前端用户指令发送到网络模块    。 
4、网络消息的接收与发送模块:负责连接游戏服务器以及网络心跳维护。 


三、消息流程 

消息这里主要是3类: 
1、游戏指令和道具: 主要是各种道具的使用了。    
2、用户聊天消息:玩家之间的聊天消息 。  
3、 游戏界面同步展示 : 玩家直接的信息同步展示稍微麻烦一点, 为了减少网络传输量,主要采取两种办法: 1,只传输改变的界面信息,2,将界面方块信息编码成简单的整数传输。   



消息缓冲处理, 主要需要考虑用户侧 和服务侧


四、类结构

1、方块类结构

每一个方块都是一个类,每个方块都继承自 统一的父类( SuperBrick ) 
方块共同的父类 ( SuperBrick )  : 使用三维数组存储 2维数据旋转的 4个方向  
其他7种类型方块继承自 SuperBrick :   

2、中间消息处理

Brige 类:设计模式的桥模式, 负责调用 Tetirs_Bridge 接口 和 Message_Bridge 接口 
注册两个接口 : Tetirs_Bridge 接口 和 Message_Bridge 接口   
    

五、部分代码

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、网络消息发送多线程还没有压测 
3、最后提交上代码 , 各位大神不要鄙视我。 上传的代码 还有很多 bug ,  当时也有很多版本,也都木有保存下来。 只留下这一份,还是保存在 csdn 上的。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论