国庆长假,男朋友女朋友们都出去旅游了,而我只能和我的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. SSH分客户端openssh-client和openssh-server
  2. 桌面云实验环境的部署配置
  3. 中国移动雄安研究院 2020校园招聘笔试JAVA方向(一)
  4. linux 编译链接图
  5. 计算机基础--认识CPU
  6. c语言编程 完美数,用完美数的数字之美激发学生学习C语言编程的兴趣
  7. 嵌入式里如何给内存做压力测试?不妨试试memtester
  8. Linux下grub.cnf详解
  9. Git如何处理代码冲突
  10. ClassGraph使用
  11. Photoshop使用教程 如何在线抠图
  12. 互联网大数据面试题集锦
  13. java 存根,使用mockito使用三个参数对方法进行存根
  14. 计算机窗口弹出多个窗口,电脑怎么打开多个微信窗口
  15. cesium给广告牌加动图
  16. 简单句的扩展----成分角度扩展-----非谓语动词作定语,状语 和 同位语 插入语
  17. 无效的列类型所执行的sql语句
  18. 诺基亚 java_诺基亚开放Symbian Javaapps了
  19. eNSP配置静态路由实例
  20. 深度学习在计算机视觉领域图像应用总结

热门文章

  1. vue+node.js操作阿里云OSS,上传和删除文件
  2. 炫酷加载中动画GIF
  3. 日本人的名字是姓在前还是名在前
  4. 2021.11.6洛谷凸边形对角线——c语言
  5. Apache web服务器(LAMP架构)(week3_day4)--技术流ken
  6. Unity部署的EXE文件双击后没有任何反应(Crash)--Q盾这个坑!
  7. appium新手入门(1)—— appium介绍
  8. 解决IK分词英文查询问题
  9. Owin搭建webapi的http测试服务器
  10. 基于JavaWeb的事业单位公务员招考信息发布平台-考务考试报名系统