国庆长假,男朋友女朋友们都出去旅游了,而我只能和我的idol隔着手机单相思,不过我可以用表白神器代码来一波骚操作,自慰一下我苦涩又空虚的灵魂。亲测可行,运行时在文件夹下插入两张图片即可女神\空白,空白图片可自行截取网页等空白区域,整体游戏效果图如下,附以源码链接:https://paste.ubuntu.com/p/z39f7HKGSn/

文章目录

  • 一、.h与main
  • 二、绘制菜单
  • 三、加载资源
  • 四、绘制拼图
  • 五、游戏过程

一、.h与main

  1. 首先,若想使用#include<graphics.h>需要安装EasyX。EasyX是一个轻量级的简单的C++图形库,可以用来做些简单的演示2d类游戏。现提供官网下载地址:EasyX
    注意当安装过程检测到支持的编程软件,Visual C++2017、Visual C++2019即是本机上的VS2017、VS2019,小编在此亲测过,直接安装打开VS即可编译调用该图形库
  2. 当程序调用getchar()时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止,用在此处是为了防止闪屏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
IMAGE img, blank;
int array1D[9] = { 0 };
int array2D[3][3] = { 0 };
int main()
{drawmenu();initgraph(300, 300);loadresource();playgame();closegraph();return 0;
}

二、绘制菜单

字体样式设置通过查找路径 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();
}

三、加载资源

  1. srand函数是随机数发生器的初始化函数。原形:void srand(unsigned seed) srand根据seed返回一个随机数但是一个伪随机数,多次编译产生的随机数是一样的,除非给一个变化的种子 因此使用系统时间来初始化
  2. time函数可获得当前系统时间srand ((unsigned)time(NULL)) 从单目运算符的优先级别从右到左考虑,返回秒数后,最后强制转化为unsigned int 型整数
  3. rand函数经常和srand函数一起使用,rand函数每一次被调用的时候,都会先查看srand函数是否被调用。如果被调用,则会调用srand(seed)初始化它的随机值,如果没被调用,则会默认调用srand(1)初始化
  4. 此部分代码段为拼图游戏的核心,将随机初始化一维数组的值赋给二维数组,使得每次拼图的原始界面都不同
  5. 图片的加载需要将两张图片 女神\空白 存储在工程文件夹的直接层下面,空白图用于制作右下角可供周围拼图块移动调整的区域
/*此代码块使用的头文件
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
*/
void loadresource()
{srand((unsigned int)time(NULL));int length = 8;int pos = 0;int i, j;//1.给一维数组初始化0-15for (i = 0; i < 8; i++){array1D[i] = i;}//2.随机出来一个下表for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){//单独处理最后一个位置if (i == 2 && j == 2){array2D[2][2] = 8;break;}pos = rand() % length;array2D[i][j] = array1D[pos];for (int k = pos; k < length; k++){array1D[k] = array1D[k + 1];}length--;}if (i == 2 && j == 2){array2D[2][2] = 8;break;}}
//缩放加载loadimage(&img, "圣经经.jpg", 300, 300);loadimage(&blank, "blank.jpg", 100, 100);
}

四、绘制拼图

// 绘制图像的各个参数(指定宽高和起始位置)
void putimage(int dstX,              // 绘制位置的 x 坐标int dstY,              // 绘制位置的 y 坐标int dstWidth,          // 绘制的宽度int dstHeight,         // 绘制的高度IMAGE *pSrcImg,        // 要绘制的 IMAGE 对象指针int srcX,              // 绘制内容在 IMAGE 对象中的左上角 x 坐标int srcY,              // 绘制内容在 IMAGE 对象中的左上角 y 坐标
);

根据打乱顺序的二维数组中的值去拿照片中相应的位置,效果图如下:

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;}}}
}

五、游戏过程

  1. 这里是我被坑最久的代码区,主要原因是鼠标操作导致二维数组下标溢出。VS2019会显示报错(好评++),同时我还用了VC++6.0,编译通过也能加载拼图资源(没有显示具体报错内容),但在playgame,某些边界的拼图块无法和空白块交换位置导致界面卡住

  2. 解决之路还挺曲折的,先是自己盯着警告,最后也明白错误的可能根源,但没有想出合适的解决办法,最后万分感谢莫老师,远程控制帮我写了两个子函数,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;}}
}

最后,感谢大家抽出时间阅读小编的文章,我会继续努力,用代码写出好玩的东西的!

祝大家国庆快乐呀

大一学了C语言有什么用,写个拼图小游戏表白女神,快学起来吧相关推荐

  1. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. c语言实验报告常见问题,C语言新手问题~~我是大一学生上C语言课期末让写实验报告我呕心沥 爱问知识人...

    我是大一学生 上C语言课 期末让写实验报告 我呕心沥血写了半天的东西计算机死活不认 老师不给力 找老师也没帮我明确找出问题...我只能求助网络了...#include "Stdio.h&qu ...

  3. c语言使用easyX图形库制作打气球小游戏

    大一c语言使用easyX图形库制作打气球小游戏 如果你是入门easyX图形库,那么这个打气球小游戏将会是和不错的入门项目选择,easyX开创了可视化窗口,使用户更加直观的了解到对象的变化,总代码以及素 ...

  4. 【C语言程序设计】—最近超火的小游戏—【数字炸弹】!

    ✍  准备工作和建议 一.程序的原理 在动手编程之前,得先跟大家说一下这个程序是干什么的. 我们可以称呼这个游戏为<数字炸弹>. 游戏的原理是这样: 每一轮电脑从 1 到 100 中随机抽 ...

  5. C语言编程学习:制作掷骰子小游戏!超适合新手的练手项目!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  6. 基于Java语言在窗体上实现飞机大战小游戏

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85594271 项目介绍 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程 ...

  7. c语言扔骰子随机数的相加,C语言编程学习:制作掷骰子小游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. 苹果手机用计算机怎么表白,隐藏在iphone短信中的自带功能,超适合表白,快学起来...

    原标题:隐藏在iphone短信中的自带功能,超适合表白,快学起来 我们身边一定有很多用苹果手机的朋友,但是我敢肯定的是,他们一定不会知道苹果手机所有隐藏的功能.今天小编就发现苹果手机在发短信的时候竟然 ...

  9. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

最新文章

  1. linux删除网卡bond,linux下网卡bond的基本配置及错误
  2. Day3 python基础
  3. GXGetImage方式连续采集和发送软触发采集
  4. python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题
  5. 【Vegas原创】GridView设定DataFormatString属性失效的解决方法
  6. Python 缩进问题-inconsistent use of tabs and spaces in indentation.原因及解决方法
  7. linux kernel: defconfig和.config
  8. 去哪儿-09-city-list
  9. 《温故而知新》JAVA基础四
  10. Druid、C3P0、Tomcat Pool的性能测试与选型
  11. Hive执行计划之 Group By Operator
  12. nohup java -jar
  13. 怎么快速把wmv视频格式转换成mp4视频
  14. 7-1 图深度优先遍历(c++)
  15. 到底何为产品架构师?
  16. web前端开发常用的几种图片格式及其使用规范
  17. android 创建桌面快捷方式 ShortCut
  18. bat脚本中如何多次键盘输入并判断_bat教程[282] @
  19. fx5u怎么与计算机通讯,两个FX5U系列PLC如何用RS485进行通信幻灯片
  20. 基于非对称纳什谈判的多微网电能共享运行优化策略

热门文章

  1. 爬取抖音粉丝数据1(作品、喜欢、ID 、关注) 完整源代码
  2. Nginx 配置数据库服务代理
  3. 华为p40是android系统吗,网友爆料:华为P40系列将搭载鸿蒙和Android 10操作系统
  4. Linux 配置Node环境变量
  5. Git 三剑客 ———— git gui 可视化工具
  6. CNKI学术趋势和万方数据知识服务平台的知识脉络分析
  7. 【Web篇】(6.3) ❀ 03. FortiWeb VM 下载与安装 ❀ FortiWeb 攻防演练
  8. 电商平台营销活动设计——任务活动
  9. 如何解决 img 标签四周出现白边的问题
  10. 给电脑一键重装系统之后扩展卷不能选怎么解决