俄罗斯方块游戏算法分析

news/2024/7/8 5:24:15 标签: 游戏, 算法, 图形, random, timer, windows
    该游戏算法比较简单,主要功夫都在界面体验上了,比如方块图形、用户控制、消去与累计等。
图形我们采用GDI+画图方式显示,共8种图形,当然可以根据自己的喜好随意定制。如何表示图形?我们可以借鉴马赛克效果。把所有图形都用3*3矩阵表示,0表示背景色显示,1表示着色显示。比如
    {0,0,0},   
    {0,1,0},  表示 T型,看出来了吗?每个数字位置其实就是一个正方形小块。
    {1,1,1}
用户控制?简单KeyPress事件实现就好。当然还有一个无需用户控制的就是自动下落,可以使用Timer实现。
消去算法?^_^,当然很简单,如果一行上有为0的单元格,那么表示没有充满,就不用消去;否则就要消去。累计就是数组追加,消去就是元素删除。
当然了,消去与累计都需要将数据的变化体现到界面上,那就是画图。Graphics对象我们都会使用,在该windows窗体游戏中,我们可以实现OnPaint事件。每当需要重绘的时候,比如用户控制,消去等,就调用窗体refresh,那么自然会触发Paint事件。以下是代码示例:
       public int[][,] figures = new int[8][,]//8种图形
    {
        new int[3,3] {
    {0,0,0},
    {0,1,0},
    {1,1,1}
    },
        new int[3,3] 
    {
    {0,0,0},
    {0,2,2},
    {2,2,0}
    },
        new int[3,3] 
    {
    {0,0,0},
    {3,3,0},
    {0,3,3}
    },
        new int[2,2] 
    {
    {4,4},
    {4,4}
    },
        new int[3,3] 
    {
    {5,0,0},
    {5,0,0},
    {5,5,0}
    },
        new int[3,3] 
    {
    {0,6,0},
    {0,6,0},
    {6,6,0}
    },
        new int[4,4] 
    {
    {7,0,0,0},
    {7,0,0,0},
    {7,0,0,0},
    {7,0,0,0}
    },
        new int[3,3]
    {
    {0,8,0},
    {8,8,8},
    {0,0,0}
    }
    };
你能从上面的定义看出有哪些图形吗?^_^,为什么不为0的地方不全是1?因为我想让不同的图形显示不同的颜色,如果无此要求则不必这样。
在具体画图时,我们需要将将数组大小转换为区域边长方格数
        int conversize(int sz)
        {
            int s = 0;
            if (sz == 4) s = 2;
            if (sz == 9) s = 3;
            if (sz == 16) s = 4;
            return s;
        }
当然出现的图形是随机的,直接用Random就可以做到。
记住无论什么动作引起的图形变化,包括移动、旋转等都要用Refresh,以便刷新游戏界面。例如向左
        public void moveLeft()
        {
            if (check(figure, px - 1, py)) px = px - 1;
            Refresh();//this.Refresh();
        }
protected override void OnPaint(PaintEventArgs e)这个熟悉吧?嗯,界面就是它画出来的。你要在界面显示什么,就在里面画什么。记住,是全部界面,因为我们的这个游戏没有任何其他资源,没有任何控件,只有图形
 
当然了,图形位置移动必须要要检查越界和是否遇到障碍物。也就是上述的check方法。基本思路就是图形经过的位置中无越界并且无不为0的单元格存在。
        bool check(int[,] fg, int x, int y)
        {
            int sz = conversize(fg.Length);
            for (int i = 0; i < sz; i++)
                for (int j = 0; j < sz; j++)
                {
                    int rx = i + x;
                    int ry = j + y;
                    if ((rx < 0 || rx > 9 || ry < 0 || ry > 19) && fg[i, j] != 0) return false;
                    if (!(rx < 0 || rx > 9 || ry < 0 || ry > 19))
                        if (board[rx, ry] != 0 && fg[i, j] != 0) return false;
                }
            return true;
        }
旋转怎么实现?一个纯数组倒序排列的简单题目,不是吗?
最后是游戏难度的问题,等级越高,降落速度越快,其实就是把等级数字跟计时器的Interval挂钩就是了。
其他的就不多说了。有兴趣的可以把它做成控件,方便大家使用。祝你玩的开心。

http://www.niftyadmin.cn/n/790787.html

相关文章

使用 patch-package 修改第三方模块

使用 patch-package 修改第三方模块&#xff0c;及时解决第三方依赖包的 bug 安装 1 2 3 4 5 6# npm npm install patch-package --save-dev# yarn yarn add --dev patch-package postinstall-postinstall创建补丁 直接在项目根目录下的 node_modules 文件夹中找到要修改依赖…

堆的操作和实现

数据结构——堆的操作和实现 当应用优先级队列或者进行堆排序时&#xff0c;一般利用堆来实现。堆是一个完全&#xff08;除最底层 外都是满的&#xff09;二叉树&#xff0c;并满足如下条件&#xff1a; 1、根结点若有子树&#xff0c;则子树一定也是堆。 2、根结点一定…

Android MutableLiveData

https://blog.csdn.net/feather_wch/article/details/88648559 我们在《ViewModel的基本使用》这篇文章中提到了&#xff0c;ViewModel的主要作用是存放页面所需要的各种数据&#xff0c;而当这些数据发生变化时&#xff0c;我们采用接口的方式实现对页面的通知。这样做是可行…

倒排索引求子串

有对搜索引擎有点了解的&#xff0c;就应该知道倒排索引吧。不知道也不要紧&#xff0c;看看就行了&#xff0c;这种数据结构比较简单&#xff0c;但很实用&#xff0c; 这里举个例子来说明&#xff0c;有时候在非搜索引擎的运用中&#xff0c;倒排索引也能显著提高算法效率。 …

nginx keeplived相关

nginx中的root与alias的差别 https://blog.csdn.net/asahinokawa/article/details/87702491 搭建Keepalived双机热备 https://blog.csdn.net/zhouchuan152/article/details/94976214 Nginx高可用、高并发&#xff1a;NginxKeepalived部署 https://blog.csdn.net/qq_354570…

ribbon的注解 @LoadBalanced 报错 No instances available for [IP]

使用RestTemplate类调用其他系统的url的时候&#xff0c;加上ribbon的注解LoadBalanced上这个注解之后访问&#xff0c;就报错了。 java.lang.IllegalStateException: No instances available for localhostat org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerCl…

外部排序简介

我们一般提到排序都是指内排序&#xff0c;比如快速排序&#xff0c;堆排序&#xff0c;归并排序等&#xff0c;所谓内排序就是可以在内存中完成的排序。RAM的访问速度大约是磁盘的25万倍&#xff0c;我们当然希望如果可以的话都是内排来完成。但对于大数据集来说&#xff0c;内…

RabbitMQ和Kafka的比较,一比吓一跳!

导言 作为一个有丰富经验的微服务系统架构师&#xff0c;经常有人问我&#xff0c;“应该选择RabbitMQ还是Kafka&#xff1f;”。基于某些原因&#xff0c; 许多开发者会把这两种技术当做等价的来看待。的确&#xff0c;在一些案例场景下选择RabbitMQ还是Kafka没什么差别&…