首先解释下何为 格子类游戏。 这是我自己取得名字格子游戏之游戏的画面是以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

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

  1. python经典小游戏五子棋,适合python编程的小游戏

    python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...

  2. 每个人都能制作的简易版狂拍灰太狼小游戏(HTML+CSS+JavaScript)

    自制系列一完善版来了. 如果在制作过程中有任何问题你都可以私信我,我会一一答复你们的. 由于上一次发的进度条不是很完善,显得不美观,这次改进了进度条问题,使增强了游戏的体验感.制作过程很简单,每个人都 ...

  3. c语言像素鸟游戏,掌控板制作Flappy bird(像素鸟)小游戏

    掌控板制作Flappy bird小游戏 大学时期火爆的手机游戏,记得那时候我在做unity开发,还用C#仿照写过这个游戏,用"空格键"操作. 先说一下这游戏的操作:游戏开始,点击屏 ...

  4. 【Unity2d】带你制作一款类似于金山打字的小游戏

    博主大概08年开始接触电脑游戏,当时玩的是我哥的电脑,那时候家里没网,只可以玩电脑上自带的单机游戏,比如扫雷.蜘蛛纸牌等等,当然还有红色警戒.冰封王座.星际争霸.帝国崛起等等,这些大概是我哥当时在大学 ...

  5. 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第二部分

    原文链接:http://www.raywenderlich.com/6888/how-to-make-a-multi-directional-scrolling-shooter-part-2 这里使用 ...

  6. 2048小游戏html制作,[ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)

    前言 这次使用了 vue 来编写 2048,主要目的是温习一下 vue. 但是好像没有用到太多 vue 的东西,==! 估计可能习惯了不用框架吧 之前由于时间关系没有对实现过程详细讲解,本次会详细讲解 ...

  7. python接水果游戏代码_【Python】python制作一个接水果和金币的小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 相关文件 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 ...

  8. python制作一个接水果和金币的小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 相关文件 关注公众号:Python学习指南,回复"game9"获取相关文件 ...

  9. Python制作的简单易学的猜单词小游戏

    游戏说明: 由程序随机产生一个单词,打乱该单词字母的排列顺序,玩家猜测原来的单词. 游戏关键点: 1.如何产生一个单词? 2.如何打乱单词字母的排列顺序? 设计思路: 采用了元组(tuple)和ran ...

最新文章

  1. linux启动顺序详解
  2. 移动机器人建图与导航代码实现——3.Path Tracking
  3. 8086汇编_除法指令
  4. mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询
  5. React-Native 组件开发方法
  6. 误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter
  7. MYSQL定时创建表分区
  8. Office LTSC 2021 for Mac
  9. 具有system权限的进程无法访问sdcard
  10. 米勒-拉宾素性检验(MillerRabbin)算法详解
  11. android 自定义地图标注,Android中调用高德地图的自定义标记视图
  12. 最简单的php爬虫库 QueryList
  13. 个人学习java的真实经历!
  14. 《后端成长路线》系列 导航篇
  15. 基于Spring Boot的个人博客系统的设计与实现 毕业设计-附源码271611
  16. ArcGIS提取NDVI
  17. 小计Tomcat的调优思路
  18. FPGA入门实验-寻迹小车的实现
  19. 查看Oracle sys_lob,system表空间满的处理-SYS_LOB0003450292C00039$$
  20. 擅自修改金蝶k 3服务器密码,金蝶k3登陆常见问题.docx

热门文章

  1. 显卡性能测试工具BenchMarkTool
  2. python:sine之舞
  3. 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测面部标记
  4. 小豹子带你看源码:Java 线程池(三)提交任务
  5. 用Python+可视化工具制作漂亮地图
  6. 沪深A股分析数据龙虎榜信息API接口(JSON标准格式,Get请求方式)
  7. 量化分析师的Python日记【第1天:谁来给我讲讲Python?】
  8. 【破解】修改程序版权、添加弹窗
  9. 小学计算机资格证教案模板,小学数学教师资格证教学设计通用模板
  10. 华南理工大学建筑学院建筑设计及其理论专业考研上岸经验分享