C语言小游戏—拼图找茬小游戏

本文介绍了一款使用C语言编写的蜜雪冰城主题的小游戏,包括菜单设计、地图绘制、图片随机加载、游戏流程控制(拼图和找茬)以及鼠标交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大一实训做的C语言小游戏——拼图&&找茬(蜜雪冰城主题~还有音乐哦hahaha)


全部代码文件在资源里~ 

 

目录结构:

可能需要用到一个插件

源码如下:

#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<mmsystem.h>
#include<time.h>
#include <windows.h>
#pragma comment(lib,"winmm.lib")

HWND hwnd;            //窗口句柄
//IMAGE 图像类
IMAGE m,image,ma;     //第一张图片
IMAGE white;          //白色方块
int map[3][3];        //地图
int NUMBER = -1;      //当前照片序号

void drawMenu();//菜单
void drawMap();//画出地图
void loadResoure();//加载随机图片
int gameOver();//判断游戏是否结束

int searchWhite_i();//返回白色图片的 y坐标
int searchWhite_j();//返回白色图片的 x坐标
void playGame();//开始游戏
void find();//找不同

bool Lookup(int n);//判断参数n,是否在temp中存在
void random();//图片的随机发放
void main_game();//游戏运行


void drawMenu()//菜单
{
    initgraph(600, 600);

    setbkcolor(WHITE);//背景色
    settextstyle(40, 0, "宋体");
    setbkmode(TRANSPARENT);//使文字的背景不变
    loadimage(&ma,"3.bmp",600,600);//加载背景图片
    putimage(0,0,&ma);

	setfillcolor(WHITE);
    fillrectangle(200, 180, 360, 240);
    fillrectangle(200, 270, 360, 330);

    settextcolor(CYAN);
    outtextxy(200, 180, "开始游戏");
    outtextxy(200, 270, "退出游戏");
    settextcolor(BLUE);
    outtextxy(95, 75, " 蜜雪冰城拼图小游戏");

    MOUSEMSG m;//创建储存鼠标信息变量
    while (1)
    {
        m = GetMouseMsg(); //获取鼠标信息
        if (m.x >= 200 && m.x <= 360 && m.y >= 180 && m.y <= 240)
        {
            setlinecolor(BLACK);
            rectangle(200 - 2, 180 - 2, 360 + 2, 240 + 2);
            if (m.uMsg==WM_LBUTTONDOWN)
            {
                break;
            }
        }
        else if (m.x >= 200 && m.x <= 360 && m.y >=270  && m.y <= 310)
        {
            setlinecolor(BLACK);
            rectangle(200 - 2, 270 - 2, 360 + 2, 330 + 2);
            if (m.uMsg == WM_LBUTTONDOWN)
            {
                exit(0);
            }
        }
       else
        {
            setlinecolor(WHITE);
            rectangle(200 - 2, 180 - 2, 360 + 2, 240 + 2);
            rectangle(200 - 2, 270 - 2, 360 + 2, 330 + 2);
        }
    }
    closegraph();

}

//加载资源
void loadResoure()
{
    int choose;

    srand((unsigned int)time(NULL));            //设置时间种子
    choose = rand() % 5;

    if(choose==0)

        loadimage(&m, "0.bmp", 600, 600);      //加载第一个图片文件
    else if(choose==1)

        loadimage(&m, "1.bmp", 600, 600);

    else if(choose==2)

        loadimage(&m, "2.bmp", 600, 600);
    else if(choose==3)

        loadimage(&m, "7.bmp", 600, 600);
    else if(choose==4)

        loadimage(&m, "5.bmp", 600, 600);

    loadimage(&white, "白块.bmp", 200, 200);

}

//判断游戏是否结束,没有结束返回1,否则返回0
int gameOver()
{
    int count = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (map[i][j] != count++)  //0-8
            {
                return 0;
            }
        }
    }
    return 1;
}

//返回白色图片的 y坐标,如果找不到则返回-1
int searchWhite_i()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (map[i][j] == 8)
                return i;
        }
    }
    return -1;  //没找到返回-1,因为-1不是数组下标
}
//返回白色图片的 x坐标,如果找不到则返回-1
int searchWhite_j()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (map[i][j] == 8)
                return j;
        }
    }
    return -1;  //没找到返回-1,因为-1不是数组下标
}

//开始游戏
void playGame()
{
    MOUSEMSG m;                //创建储存鼠标信息变量
    while (TRUE)               //一直循环直到游戏结束
    {
        drawMap();             //画出地图
        if (gameOver()==1)        //判断是否拼出该图形,条件成立弹出提示并开始下一关,否则继续游戏
        {
            if (MessageBox(hwnd, "拼图成功啦,是否开始找茬游戏!", "拼图游戏", MB_YESNO) == IDYES)
            {
                mciSendString("close Inspire.mp3", 0, 0, 0); //关闭音乐
                loadimage(&image,"3.bmp",600,600);//加载图片
                putimage(0,0,&image);//输出图片
                loadimage(&image,"33.bmp",600,600);//加载图片
                putimage(600,0,&image);
                find();
                getchar();
            }
            else
            {
                exit(0);          //结束程序,0为正常退出
            }
        }
        m = GetMouseMsg();    //获取一个鼠标消息。如果没有,就等待
        int w_i = searchWhite_i();     //获取白色方块的y坐标
        int w_j = searchWhite_j();	   //获取白色方块的x坐标
        int m_i;
        int m_j;
        switch (m.uMsg)
        {
        case WM_LBUTTONDOWN:
            m_i = m.y / 200;           //换算成鼠标左键点击图片的所对数组Map的值

            m_j = m.x / 200;			   //换算成鼠标左键点击图片的所对数组Map的值

            if (w_i == m_i && w_j + 1 == m_j)    //如果点击的是白色图片右边的图片,所点击图片与白色图片交换位置
            {
                map[w_i][w_j] = map[m_i][m_j];
                map[m_i][m_j] = 8;
            }

            if (w_i == m_i && w_j - 1 == m_j)    //如果点击的是白色图片左边的图片,所点击图片与白色图片交换位置
            {
                map[w_i][w_j] = map[m_i][m_j];
                map[m_i][m_j] = 8;
            }

            if (w_i + 1 == m_i && w_j == m_j)    //如果点击的是白色图片下边的图片,所点击图片与白色图片交换位置
            {
                map[w_i][w_j] = map[m_i][m_j];
                map[m_i][m_j] = 8;
            }

            if (w_i - 1 == m_i && w_j == m_j)    //如果点击的是白色图片上边的图片,所点击图片与白色图片交换位置
            {
                map[w_i][w_j] = map[m_i][m_j];
                map[m_i][m_j] = 8;
            }
            break;
        }
    }
}

//画出地图
void drawMap()
{
    //根据map的值画出地图
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            int x = j * 200;
            int y = i * 200;
            if (map[i][j] == 8)         //如果为8,打印白色的图片
                putimage(x, y, &white);
            else
                //以下局部代码将m所指图片文件 ((map[i][j] % 3 * 200), (map[i][j] / 3 * 200)) 起始的 200x200 的图像拷贝至 (x,y) 位置
                putimage(x, y,200,200, &m, (map[i][j] % 3 * 200), (map[i][j] / 3 * 200));
        }
    }
    putimage(600,0,&m);
}

int Num = 8;
int temp[8];     //临时存储图片对应的数值,判断参数n,是否在temp中存在,若存在数组元素前移返回1,否则返回0
bool Lookup(int n)
{
    for (int i = 0; i < Num; i++)
    {
        if (temp[i] == n)
        {
            for (int m = i; m < Num-1 ; m++)
            {
                temp[m] = temp[m + 1];
            }
            return 1;           //存在数组元素前移返回1
        }
    }
    return 0;    //没有这个数
}
//打乱照片
void random()
{
	srand((unsigned int)time(NULL));
    int Count = 0;
    int Temp = 0;           
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Count++;
            Temp = temp[rand() % Num];   //利用辅助数组随机产生0 - 7不重复的数字
            if (Lookup(Temp))
            {
                map[i][j] = Temp;
                Num--;                   //赋值成功temp数值-1;
            }
            if (Count == 8)            //计数判断是否为map数组 赋8个值,因为最后一个值为8:白色图片的值
            {
                break;
            }
        }
    }
    map[2][2] = 8;                      //最后一个元素值为8:白色图片
}

void main_game()
{
    mciSendString("open Inspire.mp3", 0, 0, 0);   //加载背景音乐
    mciSendString("play Inspire.mp3", 0, 0, 0);   //播放背景音乐
    
    srand((unsigned int)time(NULL)); //设置随机种子

    for (int i = 0; i < 8; i++)    //为辅助数组赋值
    {
        temp[i] = i;
    }

    random();
    hwnd=initgraph(1200, 600);  //初始化图形环境长为:1200,宽为:600
    cleardevice();                  //清屏

    loadResoure();	//加载
    playGame();         //开始游戏

    closegraph();       //关闭图形环境

}



void find() //找不同
{
    int index1=0,index2=0,index3=0;//定义变量
    MOUSEMSG m;  //创建储存鼠标信息变量
    m = GetMouseMsg();
    while (1)
    {
        m = GetMouseMsg();
        if (m.x >= 675 && m.x <= 710 && m.y >= 115 && m.y <= 165)
        {
            if (m.uMsg==WM_LBUTTONDOWN)
            {
                setlinecolor(RED);
                rectangle(675,115,710,165);
                rectangle(675-2,115+2,710-2,165+2);
                rectangle(75,115,110,165);
                rectangle(75-2,115+2,110-2,165+2);
                index1=1;
                mciSendString("open music1.mp3", 0, 0, 0);   //加载背景音乐
				mciSendString("play music1.mp3", 0, 0, 0);   //播放背景音乐
            }
        }

        if (m.x >= 1080 && m.x <= 1110 && m.y >= 450 && m.y <= 480)
        {
            if (m.uMsg==WM_LBUTTONDOWN)
            {
                setlinecolor(RED);
                rectangle(1080,450,1110,480);
                rectangle(1080-2,450+2,1110-2,480+2);
                rectangle(480,450,510,480);
                rectangle(480-2,450+2,510-2,480+2);
                index2=2;
                mciSendString("open music2.mp3", 0, 0, 0);   //加载背景音乐
				mciSendString("play music2.mp3", 0, 0, 0);   //播放背景音乐
            }
        }
        if (m.x >= 1050 && m.x <= 1100 && m.y >= 150 && m.y <= 190)
        {
            if (m.uMsg==WM_LBUTTONDOWN)
            {
                setlinecolor(RED);
                rectangle(1060,150,1100,190);
                rectangle(1060-2,150+2,1100-2,190+2);
                rectangle(460,150,500,190);
                rectangle(460-2,150+2,500-2,190+2);
                index3=3;
                mciSendString("open music3.mp3", 0, 0, 0);   //加载背景音乐
				mciSendString("play music3.mp3", 0, 0, 0);   //播放背景音乐
            }
        }
        if(index1==1&&index2==2&&index3==3)
        {

            if(MessageBox(hwnd, "真厉害,全部找对啦,即将退出游戏!", "拼图游戏", MB_YESNO) == IDYES)
            {
                exit(0);
            }
        }
    }

}
int main()
{
    drawMenu(); //菜单
    main_game(); //运行游戏
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值