今天小编用简单的C语言知识写一个连连看的游戏,但是是有含义的哈,游戏玩完之后又是属于一个表白程序,也感觉不错的哦。
下面小编把全部的代码发出来一下,以及效果图发一下,最终的话把涉及的知识点也讲解一下,小编用的编译器是VS2015哈。
#include//图形库 #include #include//随机数 //#include 图形库与windows.h有冲突 #include//放音乐 #pragma comment(lib,"WINMM.LIB")//需要的库 /* 1.连连看部分 加载图片 数组部分 ---1.随机 2.成对出现 图片贴进去-----用数组 二维数组 xy图片贴的位置 元素的值 表示贴什么图片 获取用户点击 判断能否消除 2.表白部分 有背景图片 写出需要说的话 弹窗部分 */ //窗口大小 640*480 IMAGE img[9]; int map[8][6];//数组大小 8*6 1.窗口大小 2.图片大小 80*80 int win;//全局变量 //函数声明 void putimg();//加载图片 void init();//数组赋值 void draw();//画图部分 int playgame();//获取鼠标点击 void play();//处理两次点击 void lo(); //void //===================================== //函数定义部分 void putimg() {//图形库里面的函数 initgraph(640, 480);//创建窗口 loadimage(&img[0], "1.jpg", 80, 80);//加载图片 loadimage(&img[1], "2.jpg", 80, 80); //L多字节字符集 loadimage(&img[2], "3.jpg", 80, 80); loadimage(&img[3], "4.jpg", 80, 80); loadimage(&img[4], "5.jpg", 80, 80); loadimage(&img[5], "6.jpg", 80, 80); loadimage(&img[6], "7.jpg", 80, 80); loadimage(&img[7], "8.jpg", 80, 80); loadimage(&img[8], "背景.jpg", 640, 480);//窗口大小一样大 } void init() { //1.map 赋值 每张图片放哪里 放哪张图片 //map随机赋值 成对出现 保证每个都有 //用arr数组先处理下地图 int arr[8 * 6] = { 0,0,0,0,0,0, 1,1,1,1,1,1, 2,2,2,2,2,2, 3,3,3,3,3,3, 4,4,4,4,4,4, 5,5,5,5,5,5, 6,6,6,6,6,6, 7,7,7,7,7,7 };//初始地图 //把arr打乱之后放到这个map数组里面 //随机数 srand((unsigned)time(NULL));//生成随机数 随机数种子 time.h int lenth = 48;//arr长度 int temp; //给map赋值 for (int i = 0; i < 8; i++) { for (int j = 0; j < 6; j++) { //随机取出arr中的一个 赋给map[i][j] temp = rand() % lenth; map[i][j] = arr[temp];//取出的数字的话不能再用 //取出的数字放到后面 for (int k = temp; k < lenth - 1; k++) { arr[k] = arr[k + 1];//k+1 } lenth--;//数组有效长度减一 } } win = 48;//记录当前的图片个数 //map被打乱了 按照map 贴图 } void draw() { BeginBatchDraw(); //背景 --贴背景 putimage(0, 0, &img[8]); //再贴别的图片 for (int i = 0; i < 8; i++) { for (int j = 0; j < 6; j++) { //遍历数组 switch (map[i][j]) { case 0://贴第一张图 putimage(80 * i, 80 * j, &img[0]); break; case 1:putimage(80 * i, 80 * j, &img[1]); break; case 2:putimage(80 * i, 80 * j, &img[2]); break; case 3:putimage(80 * i, 80 * j, &img[3]); break; case 4:putimage(80 * i, 80 * j, &img[4]); break; case 5:putimage(80 * i, 80 * j, &img[5]); break; case 6:putimage(80 * i, 80 * j, &img[6]); break; case 7:putimage(80 * i, 80 * j, &img[7]); break; } } } EndBatchDraw(); } int playgame() { //图形库的函数 //1.鼠标信息 MOUSEMSG msg;//存储鼠标信息 msg = GetMouseMsg();//获取鼠标信息 //根据鼠标位置 鼠标信息 switch (msg.uMsg) { case WM_LBUTTONDOWN: //msg.x msg.y 第一张图片 0< msg.x <80 0 //返回坐标值 map[msg.x / 80][msg.y / 80] ; //86-->map[8][6] return msg.x / 80 * 10 + msg.y / 80; //return msg.x/8+msg.y/80; //int 除法不保留小数 3/4 0 3/4*4=0 break; } return -1;//没有获取到值 } void play() { //获取两次鼠标点击 1.两次鼠标点击都要有效 int point1, point2;//获取到两次鼠标点击 while ((point1 = playgame()) == -1 || map[point1 / 10][point1 % 10] == -1);//获取到一个坐标 //outtextxy(point1 / 10 * 80, point1 % 10 * 80, "get"); setlinecolor(RED); rectangle(point1 / 10 * 80, point1 % 10 * 80, point1 / 10 * 80 + 80, point1 % 10 * 80 + 80); //根据坐标判断 //1.是不是获取到了内容point1 = playgame() != -1 //2.是不是已经赋值的内容 map[point1 / 10][point1 % 10] != -1 //消掉的部分 =-1 while ((point2 = playgame()) == -1 || map[point2 / 10][point2 % 10] == -1); //加一条就可以 //可以消除或不可以消除 //可以消除 1.坐标不一样 2.图片一样 if (point1 != point2 && map[point1 / 10][point1 % 10] == map[point2 / 10][point2 % 10]) { //连线部分 line(point1 / 10*80+30,point1 % 10*80+30,point2 / 10*80+30,point2 % 10*80+30);//连线 两个坐标 Sleep(500);//500毫秒 map[point1 / 10][point1 % 10] = -1;//图片和数组挂钩 -1没有对应的图片 draw map[point2 / 10][point2 % 10] = -1; win -= 2;//消除部分 } else { //没有消掉 } } void lo() { //alias song mciSendString("open 1.mp3 ", 0, 0, 0); mciSendString("play 1.mp3", 0, 0, 0); setbkmode(TRANSPARENT);//设置文字背景透明 settextcolor(LIGHTGRAY);//设置文字颜色 settextstyle(30, 0, "黑体"); char poem[2][9] = { "默然相爱","寂静欢喜" }; //一个中文占两字节 8个字节 考虑字符串 //两只黄鹂鸣翠柳 你还没有男朋友 /*outtextxy(0, 0, poem[0]); outtextxy(0, 30, poem[1]);*/ //文字一个个出现 循环做 每次输出一个中文 //1.中文占两个字节 不能char存储 字符串 三个字节 char word[3];//保存一个中文字 for (int i = 0; i < 2; i++) { for (int j = 0; j < 9; j+=2) { word[0] = poem[i][j]; word[1] = poem[i][j + 1]; word[2] = ''; outtextxy(15* j+100,30*i,word); Sleep(200); if (poem[i][j + 2] == '') break; } } //弹窗内容 HWND hwnd = GetHWnd();//获取当前窗口句柄 MessageBox(hwnd, "I Love You", "NAME", MB_OK); MessageBox(hwnd, "夏七", "制作人", MB_OK); } //======================= int main() { putimg(); init(); draw(); while (win!=0)//循环部分 { play(); draw();// 贴图 } //表白部分 //一首诗 写的句子 一个喜欢的人 //一段话 /*initgraph(640, 480); loadimage(NULL, "背景.jpg", 640, 480);*/ lo(); getchar(); return 0; } |
最终的效果图,小编发一下,只是素材的话有时候可以自己找的哈,
编译工具的话,小编给个建议:开发工具 VS 2013 2015 (Vs2017不可以)VC 都可以
但是DEV C /GCC /CODEBLOCK 不可以,之所以vs2017不行,因为图形库还不支持。
额外需要的东西有1.图形库 easyx graphics.h 需要安装2.素材9张图片
涉及到的知识点:
图形库的一些函数(注释)
1.数组
2.if for 分支循环
3.函数
4.随机数
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。