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号 本篇为原创可转载 勿复制