扫雷游戏设计(从零开始)(4)

本文介绍了如何在控制台上通过图形界面库实现扫雷游戏,重点讲解了如何处理鼠标消息、使用鼠标左键翻开空白图片和右键标记/取消标记,以及如何通过坐标计算元素的行和列。通过编写PlayGame函数,实现游戏的基本操作和判断游戏胜利条件。
摘要由CSDN通过智能技术生成

我们上一节呢,讲到我们如何通过我们的图形界面库把我们控制台里面的数字绑定一张图片,并且把它贴出来,这个是我们上节的内容。那么上节的内容呢,最主要的是大家一定要去了解的是,咱们在设置各种图片所对应的数值的时候呢,有一点巧妙啊,大家一定要去理解深透。那么,既然我们有了这样的界面,那么我们肯定是希望我们可以去玩这个扫雷的游戏。那么我们今天的重点就是去写一个函数。我们用void PlayGame,玩游戏的这样的一个函数。那么大家都知道我们在玩游戏的过程当中,我们肯定是需要去用到鼠标嘛,我们一般不用键盘去玩,用鼠标。那咱们来定义一个鼠标消息,我们让它初始化为零。

我们定义了一个鼠标消息之后呢,咱们给上一个while(1)。玩游戏呢,它一定是一个循环的去点的过程。

我们先让这个msg呢,让它等于GetMouseMsg(),不断地去获取鼠标的消息。那么,鼠标有哪些消息呢?鼠标有鼠标的左键,右键,滑轮,鼠标的滑动,光标的x,光标的y等等一系列。我们这些东西呢,用switch。大家要有这种敏感啊。

我们把msg.uMsg,就是咱们鼠标消息的内容呢,给它带进来啊。当然这个default呢,咱们就不要了啊,来我们来定义WM_LBUTTONDOWN。WM_LBUTTONDOWN是什么?是鼠标左键点下。然后咱们来一个case WM_RBUTTONDOWN,就是鼠标的右键。

这个鼠标的左键和鼠标的右键,它有不同的功能。鼠标左键呢?是指我们要去翻开扫雷的里面的一个空白图片。那么鼠标的右键,它的功能呢,是我们要去标记一个空白图片。或者我们去取消一个标记图片。

这是我们的功能,那么我们首先来看,比如说我们先把这个函数啊,给它调用在咱们主函数里边。然后,因为它是一个循环,所以咱们用一个while (1)吧。把这两个东西给它带进来。

那么我们先来运行一下。运行起来之后呢,大家一定要注意啊,比如说假设我点到这个图片,那它对应的是哪一个元素呢?我们鼠标的消息msg里面已经包含了鼠标的x和y,那么也就是说我们这一张图片的大小是50,那么我们的坐标呢?请看下图。

这是咱们的这个坐标,是咱们的msg.x以及msg.y,这是已知的。什么叫已知,我点任何一个地方,都可以得到一个确定的xy的值。

那我点到小方块,它对应的元素是哪一个呢?那么我们就要得到二维数组的行和列。那大家要注意,我们的数组是有一个辅助区的,所以呢,我们没有第零行和第零列。假设我们点到的这个呢,它正好是第四行五列,那么我们怎么来算呢?msg.x,他是200多,200到250之间啊,我不知道他是多少,比如说210吧。y呢?他是一百五到200之间,我们假设他是170可以吧?那么,我们得到x得到y之后,我们怎么去得到行和列呢?50,这是咱们的一张图片的大小。210除50啊,它应该是等于四的。这个y,就是咱们的170,除50。应该是等于三的。那么,我们要得到一个五,那我们就让它加一个一;得到一个四,我们就让它加一个一。

所以啊,我们是可以通过我们鼠标的坐标去获取到我们元素的行和列的。我们在前面来定义一个int类型的r,定义一个int类型的c来作为它的行和列,那么在鼠标点下去之后r它就应该等于msg.x除SIZE+1。那么我们的c呢,就应该等于msg.y除SIZE+1,这就是咱们的y值。我们就可以去获取到我们点击的那个元素的下标。那既然有下标,我们就可以去引用它。

那大家注意,我们鼠标左键是做什么?翻开。能够翻开一张数字的图片吗?如果说它显示一个零,我还要去翻开吗?不用。我要翻开的都是空白图片,所以咱们得在这里如果map[r][c]它是大于等于19并且map[r][c]它是小于等于28的,那只有在满足它是空白图片的时候,我们只需要让它减等于20。为什么减等于20啊?因为咱们在加密的时候是给他加了一个20。所以我们减等于20,它就回到原来的状态。

那这里的话呢,我们顺便把这个PlayGame的这个返回值给它改成整形。

这样我们只要把这个值给他return一下,这个作为我们后期要用来判断咱们游戏的输赢啊。

然后呢,我们右键一样的,要知道它到底是哪个元素。知道是哪个元素之后,那大家注意我标记的一定是空白图片,你不可能去标记别的图片。我们说我们的标记的这个图片所对应的值是大于30的,那么我只要让map[r][c]加等于50,这绝对不可能比30小吧。大家一定要注意,取消的是标记图片,它一定是大于30的。所以那么我们在取消的时候,如果说它是大于30的,那么咱们就给它减等于50取消标记。当然我们在下面一样的return一个map[r][c]。

然后呢,咱们来调用一下这个函数,我们来运行一下。

运行起来之后,我们发现没有问题,可以点开空白图片,也可以标记图片。但是大家会发现点开的时候,它没有什么反应,那么我们回到我们刚才我们玩游戏的这个函数啊,设定了一个int类型的返回值,而我们在返回的时候,我们返回的是map[r][c]。

那大家一步一步来分析。首先我鼠标点下去,点到的一定是空白图片,空白图片一定是19到28的区间。然后呢,我找到这个区间之后,我给它减等于20,它就是负一到八这个区间。所以我们最后返回出去的就是负一到八这个区间。那返回的是零到八没关系,那我们点开的,如果说是一个雷,也就是说,当我们PlayGame这个函数,它的返回值等于负一的时候,那说明什么?说明咱们点到雷了啊。点到雷之后,咱们只需要把这个图片呢重新粘贴一下,然后呢,给一个MessageBox,把咱们的这个窗口的句柄给它带进来。

我们这里没有跟大家讲啊,我们把这个打开窗口的地方,把它的这个窗口的句柄给它返回,就是hwnd。

那么我们写上MessageBox的时候呢,这个hwnd带进来,咱们就可以写一个,如果你游戏失败了,咱们就可以这么写。然后呢,给一个MB_OK,那这就是咱们的程序结束了嘛,那咱们只需要break就可以了。

咱们来运行一下。

看,我们点到雷它就结束了。

那这边这些数字呢,都是我们用来反映我们扫雷的数据,里面的一些变化。大家更多的可以去看一下这些东西。那还有一个就是,点到雷之后,我们输掉了,那什么时候我们可以赢呢?

那么我们来定义一个count等于零。什么意思呢?就是我们点开的个数啊。我们来算一下。大家都知道我们整个游戏有多少个格子呢?ROW*COL,有这么多个格子。那有多少个雷呢?有NUM个雷。那我们的count是点开的格子的数量。总的格子数量减去雷的数量,如果说正好等于咱们点开的格子数,那这不就说明咱们赢了嘛?关键是我们的count在哪里呢?我们每点开一次,就让count加加。然后我们在游戏的过程当中,咱们不断的去判断,如果说ROW*COL减去咱们的NUM,

它是等于count,那咱们的游戏就成功了,you are a superman。

好,我们来开始执行。因为我不太会玩扫雷,所以我把雷的数量改成了1个。

那这个咱们赢了,you are superman。大家相信自己一定可以的。

那这个呢,就是咱们扫雷游戏的第四节啊。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值