讲个故事: 今天看到一个扫雷题。
想起了很久之前的一个图形程序,把文件夹翻出来看了看
下面不需要解释了吧,看参数就知道是什么
最上面是图形库加载
#include<graphics.h>
#include<MMSystem.h>
#include<stdlib.h>
//有很奇怪的bug 第一个头文件要放MMS前面
#pragma comment(lib,"winmm.lib")
int main() {
initgraph(529, 576);
loadimage(0, "007.jpg");//加载窗口上
mciSendString("play 123.mp3 ", 0, 0, 0);
//循环播放加上repeat
// mciSendString("play 123.mp3 repeat", 0, 0, 0);
system("pause");
closegraph();
return 0;
}
可以复制一下试一试,如果你试了,恭喜你,基本上你会失败
1.去装一个easyX图形库
需要可以自行下载,也可以私信
2.关闭STL检查/或者百度一下报错函数的格式
注:1.图片大小不能过大,会直接黑屏
2.转成jpg 不是改后缀!!!
3.歌曲图片不能用汉字命名
演示:
文件夹:
补充几个函数,图形程序经常用到
随机数种子
#include<time.h>
srand(time(0)) 要随机写下这个就好了直接rand是一个伪随机
在0-->n-1(n为任意数)随机 rand()%n
对结果在加上常数k就可以实现在任意区间进行随机取数
是否随机?看数据
srand(time(0));
int n=100000;
while(n--)
{
int num;
num=rand()%5+5;
a[num]++;
cout<<num<<endl;
//Sleep(500);
}
for(int i=5;i<=9;i++)
{
cout<<a[i]<<" \t";
}
perfect!!!
实现扫雷的话,操作
生成图形界面
initgraph(10 * 50, 10 * 50);//行10 宽50 列10 宽50
输出image
putimage((j - 1) * 50, (i - 1) * 50, &img[0]);
在(j-1,i-1)处输出图片 值得注意 此处顺序与数组相反
图形操作基本都是这样
获取鼠标信息(照写就好)
目标数组:
IMAGE img[100]; //图像类数组
存入图片:
loadimage(&img[0], L"100.jpg", 50, 50);
你以为成功了,只是个半成品(doge)
演示效果:(虽然说勉勉强强能VAN……)
调试代码:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<cstdio>
#include<time.h>
#include<graphics.h>
using namespace std;
const int LINE = 12;
const int COL= 12;
//10*10
#define NUM 10;//雷的数量
#define SIZE 50;
int map[LINE][COL];
IMAGE img[100];
int i, j, k;
//初始化
void initiative()
{
srand(time(0));//保证每次随机
fill(map[0], map[0] + 12 * 12, 0);
//随机取雷
int n = NUM;
while (n)
{
int x = rand() % 10+1;
int y = rand() % 10+1;
if (!map[i][j])//避免重复
{
map[x][y] = -1;
n--;
}
}
//遍历数组附近的雷的数量
//(i,j)周围坐标(i-1,j-1) (i-1, j) (i-1)(j+1)
// ( i,j-1) ( i, j) ( i)(j+1)
// (i+1,j-1) (i+1, j) (i+1)(j+1)
for (i = 1; i <=10; i++)
{
for (j = 1; j <=10; j++)
{
if (map[i][j] != -1)//本格不是雷
{
int sum = 0;//越界没有关系 扩大数组就能解决
//用if写太lowl
for (int x = i - 1;x <= i + 1; x++)
{
for (int y = j - 1;y <= j + 1; y++)
{
if (map[x][y] == -1)
sum++;
}
}
map[i][j] = sum;
}
}
}
for (i = 1; i <= 10; i++)
{
for (j = 1; j <= 10; j++)
{
map[i][j] += 20;
}
}
}
//绘图
void paint()
{
//打印
//格子
//数字
// 旗帜
//雷
for (i = 1; i <= 10; i++)
{
for (j = 1; j <= 10; j++)
{
if (map[i][j] >= 0 && map[i][j] <= 8)
putimage((j - 1) * 50, (i - 1) * 50, &img[map[i][j]]);
else if (map[i][j] == -1)
putimage((j - 1) * 50, (i - 1) * 50, &img[9]);
else if (map[i][j] >=19&& map[i][j] <=28)
putimage((j - 1) * 50, (i - 1) * 50, &img[11]);
else //标记
{
putimage((j - 1) * 50, (i - 1) * 50, &img[10]);
}
}
//cout << endl;
}
}
//操作与规则
int op()
{
MOUSEMSG msg = { 0 };
int x, y;
msg = GetMouseMsg();
x = msg.x / 50 + 1;
y = msg.y / 50 + 1;
if (msg.uMsg == WM_LBUTTONDOWN)//左键
{
// cout << x << " " << y << "" << endl;
if(map[y][x]>=19&&map[y][x]<=28)
map[y][x] -= 20;
return map[x][y];
}
else if (msg.uMsg == WM_RBUTTONDOWN)
{
//旗帜标记
//连点取消
if (map[y][x] >= 19 && map[y][x] <= 28)
map[y][x] += 100;
else if (map[y][x] > 40)
map[y][x] -= 100;
return map[x][y];
}
}
void load()
{
loadimage(&img[0], L"100.jpg", 50, 50);
loadimage(&img[1], L"1.jpg", 50, 50);
loadimage(&img[2], L"2.jpg", 50, 50);
loadimage(&img[3], L"3.jpg", 50, 50);
loadimage(&img[4], L"4.jpg", 50, 50);
loadimage(&img[5], L"5.jpg", 50, 50);
loadimage(&img[6], L"6.jpg", 50, 50);
loadimage(&img[7], L"7.jpg", 50, 50);
loadimage(&img[8], L"8.jpg", 50, 50);
loadimage(&img[9], L"9.jpg", 50, 50);//雷
loadimage(&img[10], L"10.jpg", 50, 50);//旗帜
loadimage(&img[11], L"0.jpg", 50, 50);//未解开
}
int main()
{
initgraph(10 * 50, 10 * 50);
putimage((j - 1) * 50, (i - 1) * 50, &img[0]);
//测试用
//system("pause");
load();
initiative();
while (1)
{
paint();
int t=op();
if (t == -1)
break;
}
}
图片资源及教程:
在这里右键点开文件夹进入
把图片放进去就好了