zoukankan      html  css  js  c++  java
  • 推箱子

    观察这个图,发现它并不是全屏的,而是某个固定大小,背景是由30*30的小砖块铺成的,整个背景14行16列,这里所说的14行和16列所在的区域是用户区,而不是整个窗口。

    现在计算整个窗口的高度,应该等于14*30+上边非客户区的一段+最下面一段非常小的边框。窗口计算专门写一篇记录,参看:
    http://www.cnblogs.com/tinaluo/p/5439891.html

    第二步,窗口计算完成之后,接下来是铺图的问题,。如上图所示,怎么能让这些墙,背景,人物按照规则排在指定好的位置呢?
    其实整幅图是由一个一个小图块组成的,比如:

    一共有8幅小图,把这几个小图编成一个序号,比如,0,1,2,3....,再将整幅图的信息记录在一个文件中,可能的形式如下:

    0000000000000000
    0000000000000000
    0000000000000000
    0000011100000000
    0000013100000000
    0000012111100000
    0001114243100000
    .....(截选)

    这是一个二维数组,里面的信息已经人为的固定好了,也就是每一关的地图。当程序启动的时候,首先读取这个文件,每读一个数,就将相对应的图块画在DC上,读完整个二维数组,则整幅地图也就画完了。
    这个思路概括一下就是:用二维数组操纵地图

    关于位图操作的问题,同样写一篇详细的记录,参看:
    http://www.cnblogs.com/tinaluo/p/5439965.html

    关于读取文本文件地图的问题,也写了一篇详细的记录,参看:
    http://www.cnblogs.com/tinaluo/p/5442176.html

    算法
    问题提出:玩家需要回退一步

    根据上面的分析,地图的状态完全是由地图的二维数组控制,走一步刷新一步,如果要回退,自然就会想到把每一步的地图状态都存储起来。比如说,移动四步:
    初始状态->A->B->C->D,每次在移动之前,都把整个地图状态存储起来,对于这个例子,就是记录 初始态-A-B-C,一共四个记录,当玩家从C->D要回退的时候,就读取C的状态重画地图,这个是不难理解的。

    这个数据结构可以通过链表(栈)来完成,每次移动前,就建立一个结点存储当前的地图状态(入栈),当回退的时候就读取尾结点(出栈),然后重画地图。假设一个玩家推了上百步也没有过关,这个链表的结点就得有上百个。(这是目前我的设计)

    具体实现,有两种办法,第一种:自己写链表,第二种:使用STL。STL的使用,也写了一篇记录,参看:
    http://www.cnblogs.com/tinaluo/p/5442939.html

    游戏中更细节的逻辑

    游戏中的细节逻辑很重要,所以很多游戏需要内测,就是多测几次看看会出现什么问题。还是以这个小游戏为例。当一关完成之后到下一关,就得清空栈。不然链表会一直记录,比如说,到了第二关,玩家要回退一步,结果又回到第一关的末尾。还有,重新开始也得清空栈,比如玩家玩了一半发现没路了,要求重新开始这一关,一样得清空栈,不然链表还记录以前的内容。也就是说,要注意链表的清空时机。

    游戏完整代码(只能用作字面上的参考)

  • 相关阅读:
    MSSQL错误1069解决方法
    Xamarin的Mono for Android目前可运行于MIPS上
    Oracle大数据机和连接器产品支持与Hadoop和Cloudera Manager集成
    百度1
    恒生电子
    IGT中国
    经典笔试题——a和&a有什么区别
    腾讯HTTP协议1
    腾讯http协议2
    面向对象的三大特征
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5420090.html
Copyright © 2011-2022 走看看