SFQRM 2015-06-15 10:21 采纳率: 0%
浏览 2838

求大神设计一个C语言的连连看!!谢谢!!

1 问题描述
连连看是一个经典的游戏,本课题要求实现一个文本界面的连连看游戏。
2 基本要求
要能提供以下几个基本功能:
(1)定义一个矩阵,随机产生字符布置地图,例如下面这个4x4 的地图。
1 2 3 4
B C H C 1
C F B E 2
A E D F 3
C H A D 4
(2)游戏者通过坐标(1,2)、(3,4)判定第一行第二列的字符与第三行第四列的字符是相同的),判定争取则相应位置的字符消失,如判断错误给出相应的错误提示,允许重新判定。
(3)如果找不出配对的字符,提供restart 模式,给现存的地图重新排序。
(4)定义成绩排行榜,记录前五名的用户名及时间。
(5)提供菜单功能,定义不同等级的连连看地图供选择。
(6)设定有时间限定的游戏模式和无时间限定的游戏模式。
(7) 成绩排行榜以文件形式保存。
3 选做内容
使用MFC 等开发工具,实现彩色或图形操作界面。
4 其他要求
(1)变量、函数命名符合规范。
(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(3)程序的层次清晰,可读性强。
5 开发环境
可以选择TC2.0、TC3.0、VC++6.0等。

MFC就先算了,我想先把黑屏程序学会了。。
谢谢!

  • 写回答

8条回答 默认 最新

  • braseking 2021-06-28 11:48
    关注

    #include<stdio.h>
    #include<graphics.h>
    #define FPS 100
    #define WIN_SIZE 640
    #define MAP_SIZE 10//一行多少图片
    #define IMG_SIZE  //图片宽度
    #define MAX_PICTURE_NUM  42//图片数量
    #define WIN__SIZE MAP_SIZE*IMG_SIZE+2*IMG_SIZE
    IMAGE img_total[2];//初始化数据
    IMAGE img_picture[MAX_PICTURE_NUM 42] [2];
    int map[MAP_SIZE + 2][MAP_SIZE + 2];//前后有边界+2
    MOUSEMSG msg;
    POINT begin = { -1,-1 }, end = { -1,-1 };//现代你记得坐标,后点击的坐标
    enum STATE//表示点击的状态,第一次&第二次
    {
        m_begin,
        m_end,
    };
    int flag = m_begin;

    void GameInit()
    {
        srand(GetTickCount());
        loadimage(&img_total[0], "/res/animal.bmp");
        loadimage(&img_total[1], "/res/bk.jpg",WIN_SIZE,WIN_SIZE);
        SetWorkingImage(&img_total[0]);//长图切片,保存数组;
        for(int i=0;i<MAX_PICTURE_NUM;i++)//二维数组双重循环
        {
            for (int k = 0; k < 2; k++)
            {
                getimage(&img_picture[i][k], k*IMG_SIZE, i*IMG_SIZE, IMG_SIZE, IMG_SIZE);
            }
        }
        SetWorkingImage();
        int temp = 1, _count = 1;//_count记录已经初始化的个数
        //每张图片10个
        for (int i = 0; i < MAP_SIZE; i++)//去头去尾,消除边界
        {
            for (int k = 1; k <= MAP_SIZE; k++)
            {
                map[i][k] = temp;
                if (_count % 10 == 0)
                {
                    temp++;
                }
                _count++;
            }
        }
        //打乱数组
        for (int i = 1; i < MAP_SIZE; i++)
        {
            for (int k = 1; k <= MAP_SIZE; k++)
            {
                //也可以用i,k去与别的交换
                int x = rand() % 10 + 1;
                int y = rand() % 10 + 1;
                int x1 = rand() % 10 + 1;
                int y1 = rand() % 10 + 1;
                int _swap = map[x][y];
                map[x][y] = map[x1][y1];
                map[x1][y1] = _swap;
            }
        }
    }

    void GameDraw()
    {
        cleardevice();//背景图
        putimage(0, 0, &img_total[1]);//绘制动物图片
        for(int i = 1; i <= MAP_SIZE, i++)
        {
            for (int k = 1; k <= MAP_SIZE; k++)
            {
                if (map[i][k] > 0)
                {
                    putimage(k*IMG_SIZE, i*IMG_SIZE, &img_picture[i][k][1],SRCAND);
                    putimage(k*IMG_SIZE, i*IMG_SIZE, &img_picture[i][k][0],SRCPAINT);
                }
            }
        }
    }
    //游戏控制,鼠标点击获得数组下标
    void GameControl()
    {
        if (MouseHit())
        {
            msg = GetMouseMsg();
            if (msg.uMsg == WM_LBUTTONDOWN && flag==m_begin)
            {
                begin.y=msg.x/IMG_SIZE;
                begin.x = msg.y; /IMG_SIZE;
                flag = m_end;
            }
            else if (msg.uMsg == WM_LBUTTONDOWN && flag == m_end)
            {
                end.y = msg.x / IMG_SIZE;
                end.x = msg.y; / IMG_SIZE;
                flag = m_begin;
            }
            printf("begin:(%d,%d)end:(%d,%d)\n", begin.x, begin.y, end.x, end.y);
        }
    }
    //判断某一点是否有障碍
    static int isBlockeed(int x,int y)
    {
        return map[x][y];
    }
    //同一水平是否能够消除
    int horizon(POINT begin,POINT end)
    {
        //首先判断是否点击的同一个
        if (begin.x == end.x&&begin.y == end.y)
        {
            return 0;
        }
        //是否在同一水平方向
        if (begin.x!=end.x)
        {
            return 0;
        }
        //判断两者之间是否有障碍
        int tx = min(begin.y, end.y);
        int maxx = max(begin.y, end.y);
        for (int i = minx + 1; i < maxx; i++)
        {
            if (isBlockeed( begin.y,i))
            {
                return 0;
            }
        }
        return 1;
    }
    //垂直方向消除
    woid vertical()
    {

    }
    //一个拐点
    void turn_once()
    {

    }
    //两个拐点
    void turn_two()
    {

    }
    voidprintf()
    {
        for (int i = 0; i < MAP_SIZE + 2; i++)
        {
            for (int k = 0; k < MAP_SIZE + 2; k++)
            {
                printf("%d", map[i][k]);
            }
            printf("\n");
        }
    }
    int mian()
    {
        initgraph(WIN_SIZE, WIN_SIZE,SHOWCONSOLE);
        printf("WELCOME");
        GameInit();
        //BeginBatchDraw();//开启双缓冲绘图

        while (true)
        {
             GameDraw();
             FlushBatchDraw();
             GameControl();
             if (horizon(begin,end) == 1&&map[begin.x][begin.y]==map[end.x][end.y])
             {
                 map[begin.x][begin.y] = 0;
                 map[end.x][end.y] = 0;
             }
             printf("%d", horizon(begin, end));
        }
        
        return 0;
    }

     


     

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况