(本次复习依托扫雷游戏的编写,对前文所学图形库、函数、分支、循环、等内容进行复习,重点内容及相关说明如下)

1.扫雷游戏规则

本次扫雷游戏规则及要求为:要求绘制500*500的地图,共100个格子。要求在这100个格子里随机分布10个雷,在初始状态下,玩家见到全部被方块覆盖的地图。鼠标左键一次,如果按到雷则提示游戏结束,如果非雷,则显示这个点显示四周(包括对角)的雷的数量;鼠标右键用来标记该地点可能有雷的存在,再次点击旗子则撤销旗子。游戏胜利为全部点完全部数无雷区域,游戏结束标志为点到雷。

2.鼠标操作

  • MOUSEMSG 定义一个鼠标结构体(相当于定义一边变量)

以下内容可以用 msg.XXX 的方式使用(msg为定义的鼠标名,XXX为可替代名)

  • uMsg; // 当前鼠标消息

  • mkCtrl; // Ctrl 键是否按下

  • mkShift; // Shift 键是否按下

  • mkLButton; // 鼠标左键是否按下

  • mkMButton; // 鼠标中键是否按下

  • mkRButton; // 鼠标右键是否按下

  • x; // 当前鼠标 x 坐标

  • y; // 当前鼠标 y 坐标

  • wheel; // 鼠标滚轮滚动值 (120 的倍数)

相关的鼠标消息

  • // WM_MOUSEMOVE 鼠标移动
  • // WM_MOUSEWHEEL 鼠标滚轮拨动
  • // WM_LBUTTONDOWN 左键按下
  • // WM_LBUTTONUP 左键弹起
  • // WM_LBUTTONDBLCLK 左键双击
  • // WM_MBUTTONDOWN 中键按下
  • // WM_MBUTTONUP 中键弹起
  • // WM_MBUTTONDBLCLK 中键双击
  • // WM_RBUTTONDOWN 右键按下
  • // WM_RBUTTONUP 右键弹起
  • // WM_RBUTTONDBLCLK 右键双击

3.图形库

  • 图形库的使用包括定义一个画板、加载图形库函数、关闭图形姐妹三个部分(组成要完整,不然无法正确使用)

定义一个画版

  • initgraph(numb1,numb2);

加载图形库函数:

  • 加载图片:loadimage(&image[],L"文件位置“);

  • 输出图片:putimage(numb1i,numb2j,&image[]);

    (更多常见函数请见easyx库)
    关闭图形界面

  • closegraph();

4.循环结构、分支结构、函数、数组

格式占位符的详细内容请见格式站位符文末

if语句、switch语句的详细内容请见分支结构
需要说明的是:

  • if语句有三种写法,else后不加条件,if的条件后直接加; 则表示无执行语句

  • switch语句的default:后可以加执行语句,表示其他条件都不满足的情况下执行(前提是,每个条件后都有break;)

while、for、do while 语句的详细说明请见循环结构
需要说明的是:

  • 三目运算符与for有着相似的作用,但是for写起来更加直观、易懂

上述的循环结构和分支结构均可相互嵌套

函数的详细说明请见函数-基本函数-传参
需要说明的是:

  • 如果定义了全局变量,那么在函数中只要使用了全局变量,那么只要全局变量发生变化,函数的下次执行会按照新的值进行

    (后文会学通过指针改变实参的值,需要注意区别)

数组详细的说明请见数组说明
数组需要注意的是:

  • 数组的赋值通常与for循环进行搭配

  • 数组与指针还有部分交集,请见数组说明

5.说明

1.存在一个bug

  • 实例中的代码运行以及说明本次复习所需内容已经满足,但是存在持续右键出错的bug,未改2

2.循环的起始值、数组的起始值

  • 循环的起始值,特别是for循环是自己定义的,

  • 数组的起始值,都从下标为0开始(也就是下标为0,是数组的第一个元素)

4.本次扫雷的关键点

  • 理解扫雷,除了应具备上述基础知识以外,还应该了解扫雷的游戏规则及设计思路,这样在写起来才知道每一步在做什么

6.代码实例

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>IMAGE image[12];
int map[10][10] = { 0 };
int flag = 0;//用于判断游戏是否结束void inIt()
{//加载图片loadimage(&image[0], L"素材/数字0.jpg");loadimage(&image[1], L"素材/数字1.jpg");loadimage(&image[2], L"素材/数字2.jpg");loadimage(&image[3], L"素材/数字3.jpg");loadimage(&image[4], L"素材/数字4.jpg");loadimage(&image[5], L"素材/数字5.jpg");loadimage(&image[6], L"素材/数字6.jpg");loadimage(&image[7], L"素材/数字7.jpg");loadimage(&image[8], L"素材/数字8.jpg");loadimage(&image[9], L"素材/雷.jpg");loadimage(&image[10], L"素材/方块.jpg");loadimage(&image[11], L"素材/红旗.jpg");//用随机数生成10个雷srand((unsigned)time(NULL));int x, y;for (int i = 0; i < 10; ){x = rand() % 10;y = rand() % 10;if (map[x][y] != -1){map[x][y] = -1;++i;}}//计算每个格周围的雷数量for (int i = 0; i < 10; ++i){for (int j = 0; j < 10; ++j){if (map[i][j] == -1){for (int q = i - 1; q < i + 1; ++q){for (int w = j - 1; w < j + 1; ++w){if (q >= 0 && q <= 10 && w >= 0 && w <= 10 && map[q][w] != -1){map[q][w] += 1;}}}}}}
}void draw()
{for (int i = 0; i < 10; ++i){for (int j = 0; j < 10; ++j){switch (map[i][j]){case 10:putimage(50 * i, 50 * j, &image[0]); break;case 11:putimage(50 * i, 50 * j, &image[1]); break;case 12:putimage(50 * i, 50 * j, &image[2]); break;case 13:putimage(50 * i, 50 * j, &image[3]); break;case 14:putimage(50 * i, 50 * j, &image[4]); break;case 15:putimage(50 * i, 50 * j, &image[5]); break;case 16:putimage(50 * i, 50 * j, &image[6]); break;case 17:putimage(50 * i, 50 * j, &image[7]); break;case 18:putimage(50 * i, 50 * j, &image[8]); break;//前面为数字0-8case 19:putimage(50 * i, 50 * j, &image[9]); break;//雷case 21:putimage(50 * i, 50 * j, &image[11]); break;//红旗default:putimage(50 * i, 50 * j, &image[10]); break;//方块}}}
}void play()
{MOUSEMSG msg;int i, j;while (1){msg = GetMouseMsg();switch (msg.uMsg){case WM_LBUTTONDOWN:{i = msg.x / 50;j = msg.y / 50;if (map[i][j] == 0){for (int q = i - 1; q <= i + 1; ++q){for (int w = j - 1; w <= j + 1; ++w){if (q >= 0 && q <= 9 && w >= 0 && w < 10 && map[q][w] != -1){if (map[q][w] <= 8){map[q][w] += 10;flag++;}}}}}else if (map[i][j] == -1){flag = -1;return;}else if (map[i][j] <= 8){map[i][j] += 10;flag++;return;}}break;case WM_RBUTTONDOWN:i = msg.x / 50;j = msg.y / 50;if (map[i][j] == 21){putimage(50 * i, 50 * j, &image[10]);map[i][j] = 0;}else{putimage(50 * i, 50 * j, &image[11]);map[i][j] = 21;}break;}}
}int main()
{initgraph(500, 500);inIt();while (1){draw();play();if (flag == -1){if (MessageBox(GetHWnd(), L"GAMEOVER", L"您输了!", MB_RETRYCANCEL) == IDRETRY){for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){map[i][j] = 0;}}inIt();}else{exit(0);}}else if (flag == 10 * 10 - 3)//3个雷{if (MessageBox(GetHWnd(), L"太厉害了", L"你赢了", MB_YESNO) == IDYES){for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){map[i][j] = 0;}}inIt();}else{exit(0);}}}system("pause");closegraph();return 0;
}

C初级_函数、分支、循环、图形库复习相关推荐

  1. 00x1 python分支循环

    三大结构 顺序 分支 循环 分支 分支的基本语法 if 条件表达式: 语句1 语句2 语句3 ...... 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句 ...

  2. nodejs-REPL/回调函数/事件循环

    REPL 回调函数 事件循环REPL----------------------------------------------------- Node.js REPL(Read Eval Print ...

  3. python变量/分支/循环/数组/列表/元组/序列

    最近比较流行python,于是我这种从不赶潮流的人也决定跟一把潮流.工作原因学习时间有限,好容易挤着时间看了一部分网上的视频,却被劝说没什么用处,我们就是靠java吃饭的.当然多学一种语言也不会有什么 ...

  4. mfc formview中的关闭视图函数_VC|API消息处理(回调函数+分支语句)与MFC中的消息映射函数...

    Windows程序不同于控制台程序,因为输入输出不再是scanf和printf那么简单了,而是通过窗口(包括对话框和控件)作为输入.输出的界面以及键盘.鼠标的各类输入事件. 用户在操作系统中的任何操作 ...

  5. 分支循环语句练习和友尽模拟器的综合应用

    目录 一.循环语句练习 1.计算 n的阶乘 2. 计算 1!+ 2!+ 3!+ -- + 10! 二.分支循环综合练习 3. 在一个有序数组中查找具体的某个数字n. 4. 编写代码,演示多个字符从两端 ...

  6. 如何用python画雪人_pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  7. python用for循环输出直角三角形_使用FOR循环语句在屏幕上输出一个由星号组成的直角三角形...

    题目要求: 请用C++的信息输出方式,使用循环语句在屏幕上输出一个由星号组成的直角三角形,形状如下: * ** *** **** ***** 要求: 完全使用C++的信息输出方式,即cout以及流插入 ...

  8. 用python画雪人-pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  9. Java(二)分支循环、数组、字符串、方法

    文章目录 一.分支循环 1.1 分支结构 1.2 循环结构 1.3 跳转语句 1.4 分支循环相关问题 1.4.1 switch是否能作用在byte上,是否能作用在long上,是否能作用在String ...

最新文章

  1. 别再一知半解啦!索引其实就这么回事!
  2. 你一定不能错过的pandas 1.0.0四大新特性
  3. Kruskal重构树
  4. OSX 挂载 NTFS 格式硬盘
  5. c语言中abc是什么类型,基金分为ABC三类,分别代表什么意思,哪一类适合普通投资者?...
  6. F5 IIS Log获取客户端源IP
  7. PHP 多维数组转json对象
  8. C++ :类占用空间计算方式
  9. DOM(二)——修改内容、属性、样式
  10. Windows2012R2版本区别
  11. Android 使用JSON格式与服务器交互 中文乱码问题解决
  12. python基础教程廖雪峰云-为什么看不懂廖雪峰的Python学习教程?
  13. 鸟哥私房菜linux就该这么学-学习记录
  14. 30个 CSS 样式常用的静态形状
  15. python自动化测试绕过手机验证码
  16. MacBook键盘锁定、按键失效问题
  17. 华为mate40Android,【猫哥爆料】史上最强Mate40官宣,坐实年度安卓机皇!
  18. 2022年测绘资质怎么办理及办理流程?
  19. 17 重定向(Redirect) vs 转发(Forward)
  20. Kaggle Lending Club Loan Data数据可视化分析与不良贷款预测

热门文章

  1. 滑动平均模型(MA)—tensorflow
  2. ubuntu 定时发送邮件
  3. 大数据如何助力营销(2)用户画像
  4. python魔法方法与函数_Python的魔法函数
  5. 计算机毕业设计ssm基于web的暗香小店系统的设计与实现80041系统+程序+源码+lw+远程部署
  6. 3D建模学习小妙招,每天两小时,半年变大咖
  7. BN层(Pytorch讲解)
  8. Ubuntu18.04配置carla0.9.11踩坑与解决方法总结,同时解决安装carla-ros-bridge遇到的问题,并复现OpenCDA成功与ros关联
  9. Windows Server AD域打印机
  10. Ubuntu16.04之ubuntu卡住noapic、nomodeset