时间过得很快,来腾讯很快就一年了,凑巧,也是我工作满十年的日子。
感谢我的导师 阿福,感谢身边的小伙伴们。感谢家人的支持和理解。
感谢十年前的隔壁班那位外语系女生,替我保存着这份毕业设计十年(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;
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 上的 .