设为首页收藏本站

编程十万个为什么,属于程序员的编程论坛

 找回密码
 5秒快速注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 439|回复: 0

[原创] MFC实现贪吃蛇游戏之食物的产生

[复制链接]
发表于 2016-11-14 09:08:12 | 显示全部楼层 |阅读模式
最近有点事,耽误了文章的更新,需要说下的是,之前我用的VS2015写的代码,现在改成VS2010了~
根据早几天的文章,我们已经能创建出一条蛇,并能让他移动,今天的任务非常非常简单,我们只要在窗口上创建出食物即可~
思路是,我们随机一个X,Y出来,然后将数组 m_arrGameRange[x][y]改成3 然后在DrawGameRange函数加个判断 else if(m_arrGameRange[j] == 2)

大家可以先尝试下自己写个创建食物的代码,然后再看教程,这样有助于大家能力的提升!



好了,话不多说,我们在上次的代码的基础上加个函数,叫做CreateFood();没有返回值,我们再头文件加上void CreateFood();
然后在void CSnakeDlg::InitGameData()中调用下这个函数

CreateFood函数的实现代码如下
[mw_shl_code=cpp,true]void CSnakeDlg::CreateFood()
{
    srand(time(0));//创建一个时间种子
    int x = rand()%GAME_COL-1;//产生一个0--GAME_COL-1的随机数
    while (x == 0)//如果是0的话 会画在绿色的框框上,必须重新随机
    {
        x = rand()%GAME_COL-1;
    }

    int y = rand()%GAME_ROW-1;
    while (y == 0)
    {
        y = rand()%GAME_ROW-1;
    }

    m_arrGameRange[x][y] = 2;//将这个随机的行、列设置为2 表示食物
    Invalidate();
}[/mw_shl_code]
然后将DrawGameRange代码改成下面这样
[mw_shl_code=cpp,true]void CSnakeDlg::DrawGameRange(CDC& dc)
{
        CBrush brushGame(RGB(0, 0, 0));//创建黑色画刷 用来画游戏区域
        CBrush brushBorder(RGB(34, 176, 76));//创建绿色画刷 用来画边框
        CBrush brushFood(RGB(255,201,14));//创建橙色画刷 用来画食物
        //遍历行、列来画不同的颜色
        for (int i = 0; i < GAME_COL; i++)
        {
                for (int j = 0; j < GAME_ROW; j++)
                {
                        //根据行列来计算一个矩形大小,每个矩形占20个像素
                        CRect rt;
                        rt.left = i * 20;
                        rt.top = j * 20;
                        rt.right = rt.left + 20;
                        rt.bottom = rt.top + 20;
                        if (m_arrGameRange[j] == 1)//需要画边框
                        {
                                //填充矩形的函数,
                                //第一个参数是要填充的矩形
                                //第二个参数是什么什么画刷填充矩形
                                dc.FillRect(rt, &brushBorder);
                        }
                        else if(m_arrGameRange[j] == 0)//画游戏区域
                        {
                                dc.FillRect(rt, &brushGame);
                        }
                        else if(m_arrGameRange[j] == 2)//画食物
                        {
                                dc.FillRect(rt, &brushFood);
                        }
                }
        }
}[/mw_shl_code]

大功告成,运行看看是不是有食物了
20160919182953_13338.png

您需要登录后才可以回帖 登录 | 5秒快速注册

本版积分规则

关闭

BcWhy推荐上一条 /1 下一条

QQ|关于我们|最新帖子|小黑屋|手机版|编程十万个为什么 ( 粤ICP备16108587号-2  

GMT+8, 2017-1-19 21:04 , Processed in 0.182336 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表