国庆长假,男朋友女朋友们都出去旅游了,而我只能和我的idol隔着手机单相思,不过我可以用表白神器代码来一波骚操作,自慰一下我苦涩又空虚的灵魂。亲测可行,运行时在文件夹下插入两张图片即可女神\空白,空白图片可自行截取网页等空白区域,整体游戏效果图如下,附以源码链接:https://paste.ubuntu.com/p/z39f7HKGSn/
字体样式设置通过查找路径 C:\Windows\Fonts,打开字体库对应字体名称,最终菜单界面如下图所示
void drawmenu() { initgraph(500, 600); setbkcolor(WHITE);//窗口设置为白色 cleardevice(); setfillcolor(BLUE); settextstyle(20, 0, "华文行楷");//宽、高、字体,0:自适应 setbkmode(TRANSPARENT);//透明方式去掉文字背景 fillrectangle(200, 100, 300, 150);//(int x,int y,int xx,int yy) fillrectangle(200, 100 + 70, 300, 150 + 70); outtextxy(200 + 15, 100 + 15, "开始游戏"); outtextxy(200 + 15, 100 + 70 + 15, "退出游戏"); settextcolor(RED); outtextxy(200, 400, "made by xiexie"); MOUSEMSG m; while (1) { m = GetMouseMsg(); if (m.x >= 200 && m.x <= 300 && m.y >= 100 && m.y <= 150) { setlinecolor(RED); rectangle(200 - 5, 100 - 5, 300 + 5, 150 + 5); if (m.uMsg == WM_LBUTTONDOWN) break; } else if (m.x >= 200 && m.x <= 300 && m.y >= 100 + 70 && m.y <= 150 + 70) { setlinecolor(RED); rectangle(200 - 5, 170 - 5, 300 + 5, 220 + 5); if (m.uMsg == WM_LBUTTONDOWN) break; } else { setlinecolor(WHITE); rectangle(200 - 5, 100 - 5, 300 + 5, 150 + 5); rectangle(200 - 5, 170 - 5, 300 + 5, 220 + 5); } } closegraph(); }根据打乱顺序的二维数组中的值去拿照片中相应的位置,效果图如下:
void drawmap() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int x = i * 100; int y = j * 100; switch (array2D[i][j]) { case 0: case 1: case 2: putimage(x, y, 100, 100, &img, (array2D[i][j] % 3) * 100, 0); break; case 3: case 4: case 5: putimage(x, y, 100, 100, &img, (array2D[i][j] % 3) * 100, 100); break; case 6: case 7: putimage(x, y, 100, 100, &img, (array2D[i][j] % 3) * 100, 200); break; case 8: putimage(x, y, &blank); break; } } } }这里是我被坑最久的代码区,主要原因是鼠标操作导致二维数组下标溢出。VS2019会显示报错(好评++),同时我还用了VC++6.0,编译通过也能加载拼图资源(没有显示具体报错内容),但在playgame,某些边界的拼图块无法和空白块交换位置导致界面卡住
解决之路还挺曲折的,先是自己盯着警告,最后也明白错误的可能根源,但没有想出合适的解决办法,最后万分感谢莫老师,远程控制帮我写了两个子函数,bug消失了,游戏过程如下
//温馨提示,不要采用这种定位方式 for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (array2D[i][j] == 8) { break; } } if (array2D[i][j] == 8) { break; } } //此处为正解 int searchPos_i() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (array2D[i][j] == 8) { return i; } } } return -1; } int searchPos_j() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (array2D[i][j] == 8) { return j; } } } return -1; } void playgame() { MOUSEMSG m; int i, j; int j_Mouse, i_Mouse; while (1) { drawmap();//每次循环开始都要重新定位白块的坐标位置 i = searchPos_i(); j = searchPos_j(); m = GetMouseMsg(); switch (m.uMsg) { case WM_LBUTTONDOWN: i_Mouse = m.x / 100; j_Mouse = m.y / 100; if (j_Mouse == j + 1 && i_Mouse == i) { array2D[i][j] = array2D[i_Mouse][j_Mouse]; array2D[i_Mouse][j_Mouse] = 8; } if (j_Mouse == j - 1 && i_Mouse == i) { array2D[i][j] = array2D[i_Mouse][j_Mouse]; array2D[i_Mouse][j_Mouse] = 8; } if (i_Mouse == i - 1 && j_Mouse == j) { array2D[i][j] = array2D[i_Mouse][j_Mouse]; array2D[i_Mouse][j_Mouse] = 8; } if (i_Mouse == i + 1 && j_Mouse == j) { array2D[i][j] = array2D[i_Mouse][j_Mouse]; array2D[i_Mouse][j_Mouse] = 8; } break; } } }最后,感谢大家抽出时间阅读小编的文章,我会继续努力,用代码写出好玩的东西的!
祝大家国庆快乐呀