一、新建项目
二、新建源文件
main.cpp和mining,cpp
三、新建头文件
mining.h
四、图片资源添加
添加完成后会在头文件里面生成一个.h头文件,用来调用资源
打开之后可以看到,对每一个资源文件进行了定义
在资源文件夹下回显示添加的资源
五、VS安装图形库
安装完成后重启VS之后就可以在项目中调用图形库的头文件-----> #include<graphics.h> //图形库的头文件
接下来是相关代码:
头文件部分:
mining.h文件
1 #include<time.h> //该种方式引用的头文件是c自带的头文件
2 #include<stdlib.h>
3 #include<graphics.h> //图形库的头文件
4
5 #define MAP_WIDTH 500 //定义地图宽度 宏定义方式 即MAP_WIDTH就等于550
6
7 #define MAP_HEIGHT 550 //定义地图的高度
8
9 #define EACH_SIZE 50 //每一个格子的大小
10
11 #define MAX_X (MAP_WIDTH/EACH_SIZE) //计算每一行有多少个
12
13 #define MAX_Y (MAP_HEIGHT/EACH_SIZE) //计算每一列有多少个
14
15 #define MINE_COUNT 20 //雷的个数
16
17 //1.初始化地图
18 void InitMap(); //定义一个函数 是一个模块 只做属于自己的事情
19
20 //2.实现雷的周围加一
21 void ChangeState(int x,int y);
22
23 //3.判断是否越界
24 int IsPosOk(int x, int y);
25
26 //4.贴图
27 void DrawMap();
28
29 //5.显示信息
30 void ShowInfo();
31
32 //6.实现鼠标点击 ** 还未实现
33 int IsOpenMine();
34
35 //7.进行递归翻开格子 ** 还未实现
36 void OpenZeroRecursively(int x,int y);
37
38 //8.翻开所有格子
39 void OpenAll();
40
41 //9.判断输赢 点击到地雷就输了 ** 还未实现
42 void RenGame();
源文件部分:
main.cpp
1 #include"mining.h"
2 #include<stdio.h>
3
4 int main()
5 {
6 initgraph(MAP_WIDTH, MAP_HEIGHT);//画出地图窗口
7
8 InitMap();//初始换函数
9
10 DrawMap();//贴图函数
11 getchar();
12
13 OpenAll();//翻开所有格子
14 DrawMap();//贴图
15
16 getchar();
17 return 0;
18 getchar();//防止结果闪退
19 }
mining.cpp
1 #include"mining.h" //这种方式引用的头文件是我们自己定义的
2 #include"resource.h"
3
4 int Map[MAX_X][MAX_Y]; //定义一个二维数组 制作地图
5
6 int nCountOpen; //打开格子的个数
7
8 int nCountFlag; //标记的个数
9
10 void InitMap() //第一个函数 初始化函数
11 {
12 //1.初始化数组
13 for (int i = 0; i < MAX_X; i++)
14 {
15 for (int j = 0; j < MAX_Y; j++)
16 {
17 Map[i][j] = 0;
18 }
19 }
20
21 nCountOpen = 0; //初始化
22
23 nCountFlag = 0; //初始化
24
25 //2.埋地雷---> 地雷是随机的
26
27 srand((unsigned int)time(0)); // 种下随机数种子
28
29 int x, y;
30
31 int nCount=0; //统计埋雷的个数
32
33 //开始埋雷
34 while (nCount<MINE_COUNT) //当前埋雷的个数 小于埋雷的最大个数 就一直循环
35 {
36 x = rand() % MAX_X; // ? %10==0~9 rand 获取随机数
37
38 y = rand() % (MAX_Y - 1) + 1; //
39
40 if (-1 == Map[x][y]) //-1 表示地雷
41 {//随机下标是一个地雷
42 continue; //跳过本次循环 不是结束循环(break)
43 }
44 Map[x][y] = -1; // 埋雷
45
46 nCount++; //埋雷的个数加一
47 }
48
49 //实现地雷九宫格周围加一
50 for (int i = 0; i < MAX_X; i++)
51 {
52 for (int j = 1; j < MAX_Y; j++) //因为第一行没有雷 我们是用来显示信息的 所以不能从0开始
53 {
54 if (-1 == Map[i][j]) //判断是不是一颗地雷 -1写在左边的原因-->左值 Map[i][j]=-1这种形式是错误的
55 {
56 ChangeState(i, j); //下标
57 }
58 }
59 }
60 }
61
62 void ChangeState(int x, int y) //第二个函数 实现雷的周围加一 九宫格范围
63 {
64 for (int i = x - 1; i <= x + 1; i++)
65 {
66 for (int j = y - 1; j <= y + 1; j++)
67 {
68 if (-1 == Map[i][j]||IsPosOk(i,j)==0 ) //这个位置是一颗地雷并且判断是否越界
69 {
70 continue; //跳出本次循环
71 }
72 Map[i][j]+=1; //和Map[i][j]++;是一样的
73 }
74 }
75 }
76
77 int IsPosOk(int x, int y) //第三个函数 判断当前的下标是不是越界了
78 {
79 //逻辑表达式的值 0和1
80 return (x >= 0 && x <= MAX_X&&y <= 1 && y < MAX_Y); //越界返回0 没越界返回1
81 }
82
83 void DrawMap() //第四个函数 对地图贴图贴图
84 {
85 IMAGE img;
86
87 for (int i = 0; i < MAX_X; i++)
88 {
89 for (int j = 1; j < MAX_Y; j++)
90 {
91 if (Map[i][j] < 9) //雷的周围1最大是8个不会超过九 小于9 说明格子没有被翻开
92 {
93 loadimage(&img, L"jpg", MAKEINTRESOURCE(IDR_JPG13), EACH_SIZE, EACH_SIZE); //L宽字节 jpg13是没有翻开的情况的图片
94 }
95 else //已经被翻开
96 { //翻开一个格子 让这个格子+10 表示已经被翻开
97 if (Map[i][j] >= 11 && Map[i][j] <= 18) //11~18表示1~8
98 {
99 loadimage(&img, L"JPG", MAKEINTRESOURCE(IDR_JPG1 + Map[i][j] - 11, EACH_SIZE, EACH_SIZE)); //通过这个算法 判断贴哪一张图片
100 }
101 else if (Map[i][j] == 9) //9-10==-1 -1是地雷
102 {
103 loadimage(&img, L"jpg", MAKEINTRESOURCE(IDR_JPG10), EACH_SIZE, EACH_SIZE); //贴地雷图片
104 }
105 else if (Map[i][j] == 10) //10-10==0 0表示空白
106 {
107 loadimage(&img, L"jpg", MAKEINTRESOURCE(IDR_JPG11), EACH_SIZE, EACH_SIZE); //贴空地图片
108 }
109 else
110 {
111 loadimage(&img, L"jpg", MAKEINTRESOURCE(IDR_JPG9), EACH_SIZE, EACH_SIZE); //贴标记图片
112 }
113 }
114 putimage(i*EACH_SIZE, j*EACH_SIZE, &img);
115 }
116 }
117 ShowInfo();
118 }
119
120 void ShowInfo() //第五个函数 显示信息
121 {
122 //埋雷的个数 打开的个数 标记的个数
123 //设置字体的样式
124 settextstyle(20, 20, L"wingding.ttf"); //字体样式标号
125
126 //背景颜色
127 setbkmode(TRANSPARENT);
128
129 //字体颜色
130 settextcolor(YELLOW);
131
132 //设置字体的位置
133 WCHAR szOpen[32];
134 WCHAR szFlag[32];
135 WCHAR szAllMine[32];
136
137 //字符串格式化
138 //与printf scanf类似
139 wsprintf(szAllMine, L"埋雷:%d", MINE_COUNT);//埋雷:20 把“埋雷”这个字符串放到szAllMine里面 格式化成字符串类型
140 wsprintf(szOpen, L"打开:%d", nCountOpen);
141 wsprintf(szFlag, L"标记:%d", nCountFlag);
142
143 //调整坐标
144 outtextxy(20, 20, szAllMine);
145 outtextxy(190, 20, szOpen);
146 outtextxy(350, 20, szFlag);
147
148 }
149
150
151
152
153
154
155 void OpenZeroRecursively(int x, int y) //第七个函数 进行递归翻开格子
156 {
157
158 }
159
160 void OpenAll() //第八个函数 翻开所有格子
161 {
162 for (int i = 0; i < MAX_X; i++)
163 {
164 for (int j=1;j<MAX_Y;j++)
165 {
166 if (Map[i][j] < 9)
167 {
168 Map[i][j] += 10;
169 }
170 }
171 }
172 }
173
174 void RenGame() //第九个函数 判断输赢
175 {
176
177 }
注:
设置字体样式:
目前实现的结果如下:
之后的以后有机会写好之后再补充
2019-03-20 13:09:47