今天带来一个小游戏——连连看,用C语言打造,里面涉及的知识点也并不是很多的。涉及到了,数组、函数、分支结构、循环结构。自然配上音乐就会有感觉了,不要忘了安装好图形库。
这个的话代码也有点多的,我就只先把一部分的代码发出来吧
/********************************************************************************
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~总结~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
*通过一维数组来给二维数组赋值*
*利用随机数通过switch语句进行随机打印图片*
*处理鼠标消息设置条件来消除(逐行扫描画实心矩形来覆盖图片消除)*
********************************************************************************/
#include //图形库
#include //标准输入输出
#include //标准库
#include //随机
#include
#include //多媒体设备接口头文件和库文件
#pragma comment(lib,"winmm.lib")
void tupian();
void shubiao();
int a[120] = {1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,
11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,
14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15};//图片个数
int xia, chang=120;//下标 长度
int er[10][12];// 二维
IMAGE tu[15];//类
int main()
{
initgraph(500,600);//初始化图形窗口
setbkcolor(WHITE);//背景颜色
cleardevice();//刷新
srand((unsigned int)time(NULL));//随机数种子
PlaySound(L"群星 - 老司机带带我(云南山歌).wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
loadimage(&tu[0], L"1.jpg"); //存图片
loadimage(&tu[1], L"2.jpg");
loadimage(&tu[2], L"3.jpg");
loadimage(&tu[3], L"4.jpg");
loadimage(&tu[4], L"5.jpg");
loadimage(&tu[5], L"6.jpg");
loadimage(&tu[6], L"7.jpg");
loadimage(&tu[7], L"8.jpg");
loadimage(&tu[8], L"9.jpg");
loadimage(&tu[9], L"10.jpg");
loadimage(&tu[10], L"11.jpg");
loadimage(&tu[11], L"12.jpg");
loadimage(&tu[12], L"13.jpg");
loadimage(&tu[13], L"14.jpg");
loadimage(&tu[14], L"15.jpg");
tupian();
shubiao();
system("pause");//系统 暂停
closegraph();//关闭画布
getchar();
return 0;
}
void tupian()// 随机产生图片
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 12; j++)
{
xia = rand() % chang; //通过一维数组给二维数组赋值
er[i][j] = a[xia];
for (int k = xia; k < chang; k++)// 将取走的元素后面的元素向前移位
{
a[k] = a[k + 1];
}
chang--;
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 12; j++)//遍历二维数组进行选择 随机产生图片
{
switch (er[i][j])
{
case 1:
putimage(i * 50, j * 50, &tu[0]); break;
case 2:
putimage(i * 50, j * 50, &tu[1]); break;
case 3:
putimage(i * 50, j * 50, &tu[2]); break;
case 4:
putimage(i * 50, j * 50, &tu[3]); break;
case 5:
putimage(i * 50, j * 50, &tu[4]); break;
case 6:
putimage(i * 50, j * 50, &tu[5]); break;
case 7:
putimage(i * 50, j * 50, &tu[6]); break;
case 8:
putimage(i * 50, j * 50, &tu[7]); break;
case 9:
putimage(i * 50, j * 50, &tu[8]); break;
case 10:
putimage(i * 50, j * 50, &tu[9]); break;
case 11:
putimage(i * 50, j * 50, &tu[10]); break;
case 12:
putimage(i * 50, j * 50, &tu[11]); break;
case 13:
putimage(i * 50, j * 50, &tu[12]); break;
case 14:
putimage(i * 50, j * 50, &tu[13]); break;
case 15:
putimage(i * 50, j * 50, &tu[14]); break;
}
}
}
}
void shubiao()//处理鼠标消息 消除图片
{
MOUSEMSG m;//定义鼠标变量
int r, c, r1 = 12, c1 = 12, temp = 0;
while (1)
{
m = GetMouseMsg();//得到鼠标消息
switch (m.uMsg)//处理鼠标消息
{
/*case WM_RBUTTONDOWN://右键按下重新开始
//fillcircle(m.x, m.y, 25);
//cleardevice();
break;*/
case WM_LBUTTONDOWN:
if (temp % 2 == 0)
{
r = m.x / 50;
c = m.y / 50;
}
else//if (temp % 2 != 0)
{
r1 = m.x / 50;
c1 = m.y / 50;
}
temp++;
//消除
if (temp % 2 == 0)
{
if ((er[r][c] == er[r1][c1]) && (r == r1 || c == c1))//(r == r1 || c == c1)不加这个相同就消除
{
if (r == r1 && c == c1)//r == r1 && c == c1不加这个条件 点两下一个图片会消除 小bug
{
break;
}
if (r == 0)//逐行扫描
{
switch (c)
{
case 0:fillrectangle(0, 0, 50, 50); break;
case 1:fillrectangle(0, 50, 50, 100); break;
case 2:fillrectangle(0, 100, 50, 150); break;
case 3:fillrectangle(0, 150, 50, 200); break;
case 4:fillrectangle(0, 200, 50, 250); break;
case 5:fillrectangle(0, 250, 50, 300); break;
case 6:fillrectangle(0, 300, 50, 350); break;
case 7:fillrectangle(0, 350, 50, 400); break;
case 8:fillrectangle(0, 400, 50, 450); break;
case 9:fillrectangle(0, 450, 50, 500); break;
case 10:fillrectangle(0, 500, 50, 550); break;
case 11:fillrectangle(0, 550, 50, 600); break;
}
}
if (r == 1)
{
switch (c)
{
case 0:fillrectangle(50, 0, 100, 50); break;
case 1:fillrectangle(50, 50, 100, 100); break;
case 2:fillrectangle(50, 100, 100, 150); break;
case 3:fillrectangle(50, 150, 100, 200); break;
case 4:fillrectangle(50, 200, 100, 250); break;
case 5:fillrectangle(50, 250, 100, 300); break;
case 6:fillrectangle(50, 300, 100, 350); break;
case 7:fillrectangle(50, 350, 100, 400); break;
case 8:fillrectangle(50, 400, 100, 450); break;
case 9:fillrectangle(50, 450, 100, 500); break;
case 10:fillrectangle(50, 500, 100, 550); break;
case 11:fillrectangle(50, 550, 100, 600); break;
}
}
后面的话还是一样的代码,是分支语句,行数,所以不发了,代码太多了,最终的效果图,在这就发下吧(加QQ群:{{315732400:0}},群内有大量学习资源可供学习)
重要的事情,说三遍!!!不要忘了装图形库,图形库,图形库。我就说到这就结束吧,各位晚安哈,打手不易,也希望各位大佬们,多多提下意见哈,~~在这里希望每一位爱好编程的伙伴们,在这条道路上越走越远。