Winform GDI+ 制作连连看,五子棋等(等格子类小游戏 )

         首先解释下何为 格子类游戏。 这是我自己取得名字格子游戏之游戏的画面是以M*N个矩形格子或格点组成的, 游戏中的物体基本上都位于 格子中 或格点上 。 如:俄罗斯方块,连连看,魔法寿司,推箱子,打砖块,和所有棋类游戏 等 。

                  这些游戏有一个共同的特征就是他们 游戏的画面都可以根据  一张背景图片一个2维数组,和游戏元素的素材图片 这3部分画出来,以五子棋为例 背景图片就不用说了 大家都明白的,2维数组嘛 五子棋用 15*15的int 数组就可以了  没什么不用 bool或其他呢? 这是因为 每个 格点的元素有3中可能  黑棋,白棋,和未落子 bool只能表达2种情况,对于五子棋来说游戏元素素材 就是 黑棋的棋子 和白棋的棋子        有了这3方面就可以 用如下的方法画出 当前的棋局

   1.绘制棋盘信息(绘制所有格点游戏都可用此法)

   private void label1_Paint_1(object sender, PaintEventArgs e) //此事件 是lable的重绘事件

//我这里是在lable上画的 其实也可以在picturebox上画 那个背景图片直接设置为控件的背景图片就OK了
        {
            Graphics g = e.Graphics; //这个就是把此控件作为画布
            for (float i = 0; i <= 561; i += 40)// p是画笔 我 在外面实例化了相信你应该也会事例画画笔的。这个循环 是用来画棋盘的网格线的
            {
                g.DrawLine(p, i, 0, i, 561);
                g.DrawLine(p, 0, i, 561, i);
            }

//下面这个嵌套的循环是用来画棋子的 由于棋盘是15*15的所以 就是这样的循环

//arrayQp 就是我说的棋盘画面的3个组成部分中的一个他是个int类型的2维数组 。       就是记录每个棋子位置的数组 这个也是我声明的全   局变量  我把 0作为未落子  1作为 黑子 2作为白子

//arrayQp[5, 4] =2就是指 在第5行 第4格的位置 是白子

//imgheiqi和imgbaiqi  是2个 image类型的全局变量 他们也是 组成游戏画面的3个部分之一 游戏元素素材  他们两个 分别为黑棋子和白棋子
            for (int row = 0; row < 15; row++)
            {
                for (int colum = 0; colum < 15; colum++)
                {
                    switch (arrayQp[row, colum])
                    {
                        case 1:  
                        //画黑棋
                            g.DrawImage(imgheiqi, row * 40 - 20, colum  * 40 -20);

//DrawImage这个方法很重要 他有很多重载  我写的这个 我写这个是比较简单的  他的这3个参数的含义分别为   黑棋素材,你要画到那个位置的横坐标,你要画到那个位置的纵坐标  。

row  * 40 + 20是什么意思呢?row  * 40得到是棋子所在格点 的坐标 也是 棋子的中心位置  可是画棋子需要的是他左上角的坐标 所以 要减去半个棋子
                            break;
                        //画白棋
                        case 2:
                            g.DrawImage(imgbaiqi, row  * 40 - 20, colum  * 40 -20);
                            break;
                    }
                }
            }
        }

2.接受用户操作(包含鼠标 和键盘的操作 对于棋类游戏 一般就只有鼠标操作)

2.1获取鼠标点击的位置 并计算 该点所对应的 2维数组 中的数字

2.2根据游戏 规则判断 该操作是否可执行(如:是否超出 游戏区界限 是否符合游戏规则如 有障碍物, 对于五子棋来说 就是这里是否已落子)

2.3更新数组信息 (这一步骤是关键 这里还要根据(格子游戏的核心算法 基本都在 这里 如:判断输赢(判断输赢也在在timer里出现)  是否可消除 ,吃子啊什么的 )

private void label1_MouseClick_1(object sender, MouseEventArgs e)
        {
            //判断是否为鼠标左键或者是否点击了开始游戏按钮
            if (e.Button == MouseButtons.Right || trueWin)
            {
                return;
            }

int gx=(e.x+20)/40;

int gy=(e.y+20)/40;

这里写的就是 计算落子位置 在数组中对应的下标 (就是计算出距离鼠标 单击的位置最近的格点所对应的数组下标)

为什么要+20在 /4呢  比如 你点的39,39 如果/40就会得到 0,0可是39明显 里40,40比较近对应的下标 实际应该是1,1 ,

我们要达到的效果是取接近的 类似与四舍五入效果的  比如19,19 算0,0。20,20算作1,1

所以我给他加上了 40的一半在除以40就达到了这样的效果

            //判断要点的位置上是否有棋子
            if (arrayQp[gx, gy] !=0)
            {
                return;
            }
            luozi = new Point(gx, gy);
           }

接下来就是 核心算法了  对于人人对战的五子棋来说  他的核心算法 也 就是判断是否有 一方获胜 由于不想 大家对于核心算法都 用复制粘贴 。 所以 我以后会专门写篇日志来讲这个。

其实他并不神秘 对于我们每个来说不一定是 五子棋高手 但是 懂五子棋的游戏规则 简直 轻而易举   我们只需把这些幼稚的规则 给计算机说清楚就OK了   也就是 告诉他什么 叫做 5个同颜色的子 横竖斜连在一块吗  如果你是五子棋高手  还可以将自己下棋的方法归纳一下 写给计算机 制造出一个NB的AI  别说没方法乱下的   至少你是看着棋盘下的  你不是棋子自己滚到那个位置的   试着归纳自己的下棋策略 或许你的棋艺讲更加的精进  甚至成为大事 出一本讲下棋策略的书

3.除了用户操作 为更新游戏画面 外 timer 也经常 更新游戏画面 和决定游戏 是胜利 还是 game over如俄罗斯方块就是这样的  还有很多小游戏 也是通过 timer 来让你 GAME over 的

今天就写到这里 有语句不通顺的还请见谅  有不懂的有问必答 有做这类游戏遇到问题也可以发我邮箱 我也尽力帮忙 有游戏开发爱好者请加好友交流下  写此文章主要用来锻炼下自己的表达能力 也给爱好游戏编程的初学者 一些帮助

                           留个名 湖北省银河信息技术学院 10届学院 N2D10003班 胡成亮 写于 2011年 6月6号    本篇为原创可转载 勿复制

转载于:https://www.cnblogs.com/hudejia/archive/2011/06/11/2078334.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值