Winform GDI+ 制作连连看,五子棋等(等格子类小游戏 )
这些游戏有一个共同的特征就是他们 游戏的画面都可以根据 一张背景图片,一个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+ 制作连连看,五子棋等(等格子类小游戏 )相关推荐
- python经典小游戏五子棋,适合python编程的小游戏
python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...
- 每个人都能制作的简易版狂拍灰太狼小游戏(HTML+CSS+JavaScript)
自制系列一完善版来了. 如果在制作过程中有任何问题你都可以私信我,我会一一答复你们的. 由于上一次发的进度条不是很完善,显得不美观,这次改进了进度条问题,使增强了游戏的体验感.制作过程很简单,每个人都 ...
- c语言像素鸟游戏,掌控板制作Flappy bird(像素鸟)小游戏
掌控板制作Flappy bird小游戏 大学时期火爆的手机游戏,记得那时候我在做unity开发,还用C#仿照写过这个游戏,用"空格键"操作. 先说一下这游戏的操作:游戏开始,点击屏 ...
- 【Unity2d】带你制作一款类似于金山打字的小游戏
博主大概08年开始接触电脑游戏,当时玩的是我哥的电脑,那时候家里没网,只可以玩电脑上自带的单机游戏,比如扫雷.蜘蛛纸牌等等,当然还有红色警戒.冰封王座.星际争霸.帝国崛起等等,这些大概是我哥当时在大学 ...
- 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第二部分
原文链接:http://www.raywenderlich.com/6888/how-to-make-a-multi-directional-scrolling-shooter-part-2 这里使用 ...
- 2048小游戏html制作,[ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)
前言 这次使用了 vue 来编写 2048,主要目的是温习一下 vue. 但是好像没有用到太多 vue 的东西,==! 估计可能习惯了不用框架吧 之前由于时间关系没有对实现过程详细讲解,本次会详细讲解 ...
- python接水果游戏代码_【Python】python制作一个接水果和金币的小游戏
开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 相关文件 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 ...
- python制作一个接水果和金币的小游戏
开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 相关文件 关注公众号:Python学习指南,回复"game9"获取相关文件 ...
- Python制作的简单易学的猜单词小游戏
游戏说明: 由程序随机产生一个单词,打乱该单词字母的排列顺序,玩家猜测原来的单词. 游戏关键点: 1.如何产生一个单词? 2.如何打乱单词字母的排列顺序? 设计思路: 采用了元组(tuple)和ran ...
最新文章
- linux启动顺序详解
- 移动机器人建图与导航代码实现——3.Path Tracking
- 8086汇编_除法指令
- mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询
- React-Native 组件开发方法
- 误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter
- MYSQL定时创建表分区
- Office LTSC 2021 for Mac
- 具有system权限的进程无法访问sdcard
- 米勒-拉宾素性检验(MillerRabbin)算法详解
- android 自定义地图标注,Android中调用高德地图的自定义标记视图
- 最简单的php爬虫库 QueryList
- 个人学习java的真实经历!
- 《后端成长路线》系列 导航篇
- 基于Spring Boot的个人博客系统的设计与实现 毕业设计-附源码271611
- ArcGIS提取NDVI
- 小计Tomcat的调优思路
- FPGA入门实验-寻迹小车的实现
- 查看Oracle sys_lob,system表空间满的处理-SYS_LOB0003450292C00039$$
- 擅自修改金蝶k 3服务器密码,金蝶k3登陆常见问题.docx