大一实训做的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;
}