举报

easyx展示图片自己电脑可以显示 别人黑屏

0

以下是我用c语言写的扫雷游戏的完整代码,我将图片放在了程序的根目录,我自己电脑一切正常,将代码发给别人,也给他安了easyx并将图片放在了他创建程序的根目录,但是运行就不显示图片。(他们的环境也是vs2022)

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>

#define ROW 10
#define COL 10
#define MINE 10
#define SIZE 50

int count = 0;	//点的格子数
int map[ROW+2][COL+2];
IMAGE img[12];	//img存放12张图片

//初始化棋盘
void initboard()
{
	int i;
	int j;
	
	for (i = 0; i < ROW+2; i++)
	{
		for (j = 0; j < COL+2; j++)
		{
			map[i][j]=0;
		}
	}
	
	srand((unsigned int)time(NULL));

	int flag=0;
	while (flag < MINE)
	{		
		int r = rand() % ROW+1;
		int c = rand() % COL+1;

		//布雷
		if (map[r][c] == 0)
		{
			map[r][c] = -1;
			flag++;
		}
	}

	//根据周边8格雷数填充数组
	for (i = 1; i <= ROW; i++)
		{
			for (j = 1; j <= COL; j++)
			{
				if (map[i][j] != -1)
				{
					int m=0;
					int n=0;

					for (m=i-1;m<=i+1;m++)
					{
						for (n=j-1;n<=j+1;n++)
						{
							if (map[m][n] == -1)
							{
								map[i][j]++;
							}
						}
					}
				}
			}
		}
	
	//数组值全+20变成空白图片
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			map[i][j] += 20;
		}
	}
}

//打印棋盘
void printboard()
{
	int i;
	int j;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			printf("%3d", map[i][j]);
			if (map[i][j] == -1)						//雷图片
			{
				putimage((i-1)*SIZE,(j-1)*SIZE,&img[9]);
			}
			else if (map[i][j]>=0&&map[i][j]<=8)		//数字图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);
			}
			else if (map[i][j] >= 19 && map[i][j] <= 28)	//空白图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);
			}
			else if (map[i][j] >30)	//旗子图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);
			}
		}
		printf("\n");
	}

}

//加载图片
void loadimg()
{
	loadimage(&img[0],L"0.jpg",SIZE,SIZE);
	loadimage(&img[1], L"1.jpg", SIZE, SIZE);
	loadimage(&img[2], L"2.jpg", SIZE, SIZE);
	loadimage(&img[3], L"3.jpg", SIZE, SIZE);
	loadimage(&img[4], L"4.jpg", SIZE, SIZE);
	loadimage(&img[5], L"5.jpg", SIZE, SIZE);
	loadimage(&img[6], L"6.jpg", SIZE, SIZE);
	loadimage(&img[7], L"7.jpg", SIZE, SIZE);
	loadimage(&img[8], L"8.jpg", SIZE, SIZE);
	loadimage(&img[9], L"9.jpg", SIZE, SIZE);	//雷
	loadimage(&img[10], L"10.jpg", SIZE, SIZE);	//空白
	loadimage(&img[11], L"11.jpg", SIZE, SIZE);	//旗子

}

//递归展开一片
void open(int r,int c)
{
	map[r][c] -= 20;
	count++;

	for (int m = r - 1; m <= r + 1; m++)
	{
		for (int n = c - 1; n <= c + 1; n++)
		{
			if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
			{
				if (map[m][n] >= 19 && map[m][n] <= 28)
				{
					if (map[m][n] != 20)
					{
						map[m][n] -= 20;
						count++;
					}
					else
					{
						open(m, n);
					}
				}
			}
		}

	}
}

//鼠标操作
int play()
{
	MOUSEMSG msg = { 0 };
		int r;
		int c;

	while (1)
	{
		msg = GetMouseMsg();
		
		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:	//扫雷 19~28
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				if (map[r][c] == 20)	//点的位置是0
				{
					open(r,c);
				}
				else
				{
					map[r][c] -= 20;	//-1~8
					count++;
				}
				
			}
			return map[r][c];
			break;
		case WM_RBUTTONDOWN:	//标雷或取消标记
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;

			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				map[r][c] += 50;
			}
			else if (map[r][c] > 30)
			{
				map[r][c] -= 50;
			}
			return map[r][c];
			break;

		}
	}
}



int main()
{
	//打开一个图形窗口
	HWND hwnd = initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);

	initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);

	loadimg();
	initboard();
	

	while (1)
	{
		printboard();
		if (play() == -1)
		{
			printboard();
			MessageBox(hwnd, L"你输了", L"", MB_OK);
			break;
		}
		if (ROW * COL - MINE == count)
		{
			printboard();
			MessageBox(hwnd, L"你赢了", L"", MB_OK);
			break;
		}
	}
	return 0;
}
ava
🤪

2024-3-28

您好,您的程序运行完美,发给别人的时候,一定记得把12张图片一起放到exe目录下就可以了,我修改了一下下这个扫雷运行完美 -  智慧志恒  2024-5-28
举报
您的扫雷程序运行完美,小小改动了一下下,发给朋友时记得把12张图片一起发,图片放到exe目录中 -  智慧志恒  2024-5-28
举报
举报
0
// easyx1ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

//int main()
//{
//    std::cout << "Hello World!\n";
//}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>

#define ROW 10  //行数10行
#define COL 10  //列数10列
#define MINE 10  //雷数量10
#define SIZE 50   //每个格子的长宽为50*50像素

int count = 0;	//点的格子数,已经点开的格子数量
int map[ROW + 2][COL + 2];  //数据为12*12
IMAGE img[12];	//img存放12张图片

//初始化棋盘
void initboard()
{
	int i;
	int j;
	//map数组赋值0
	for (i = 0; i < ROW + 2; i++)
	{
		for (j = 0; j < COL + 2; j++)
		{
			map[i][j] = 0;
			printf("%d,%d=%d\n",j,i, map[j][i]);
		}
	}
	//srand()函数用来设置算法的种子,time(NULL)返回当前的时间,先调用srand(time(NULL))是把当前的时间作为种子,是程序每次运行产生不同的随机数序列。
	srand((unsigned int)time(NULL));
	
	//flag小于雷数量就布雷
	int flag = 0;
	while (flag < MINE)//当flag=MINE时布雷完成
	{
		int r = rand() % ROW + 1;  //随机数0-9,加一得到1-10的随机数;
		int c = rand() % COL + 1;  //随机数0-9,加一得到1-10的随机数;

		//布雷
		if (map[r][c] == 0)
		{
			map[r][c] = -1;
			flag++;
			printf("%d,%d=%d\n",c,r, map[r][c]);

		}
	}

	//根据周边8格雷数填充数组
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			if (map[i][j] != -1)
			{
				int m = 0;
				int n = 0;

				for (m = i - 1; m <= i + 1; m++)
				{
					for (n = j - 1; n <= j + 1; n++)
					{
						if (map[m][n] == -1)
						{
							map[i][j]++;
						}
					}
				}
			}
		}
	}

	//数组值全+20变成空白图片
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			map[i][j] += 20;
		}
	}
}

//打印棋盘
void printboard()
{
	int i;
	int j;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			printf("%3d,%d=%d",i,j, map[j][i]);
			printf("  ");
			if (map[i][j] == -1)						//雷图片
			{

				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);
			}
			else if (map[i][j] >= 0 && map[i][j] <= 8)		//数字图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);

			}
			else if (map[i][j] >= 19 && map[i][j] <= 28)	//空白图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);
			}
			else if (map[i][j] > 30)	//旗子图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);
			}
		}
		printf("\n");
	}

}

//加载图片
void loadimg()
{
	loadimage(&img[0], L"10.jpg", SIZE, SIZE);
	loadimage(&img[1], L"1.jpg", SIZE, SIZE);
	loadimage(&img[2], L"2.jpg", SIZE, SIZE);
	loadimage(&img[3], L"3.jpg", SIZE, SIZE);
	loadimage(&img[4], L"4.jpg", SIZE, SIZE);
	loadimage(&img[5], L"5.jpg", SIZE, SIZE);
	loadimage(&img[6], L"6.jpg", SIZE, SIZE);
	loadimage(&img[7], L"7.jpg", SIZE, SIZE);
	loadimage(&img[8], L"8.jpg", SIZE, SIZE);
	loadimage(&img[9], L"9.jpg", SIZE, SIZE);	//雷
	loadimage(&img[10], L"0.jpg", SIZE, SIZE);	//空白
	loadimage(&img[11], L"11.jpg", SIZE, SIZE);	//旗子

}

//递归展开一片
void open(int r, int c)
{
	printf("jin ru da kai open \n");
	printf("%d,%d=%d\n", c, r, map[r][c]);
	map[r][c] -= 20;
	printf("%d,%d=%d\n", c, r, map[r][c]);
	count++;

	for (int m = r - 1; m <= r + 1; m++)
	{
		for (int n = c - 1; n <= c + 1; n++)
		{
			if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
			{
				if (map[m][n] >= 19 && map[m][n] <= 28)
				{
					if (map[m][n] != 20)
					{
						
						map[m][n] -= 20;
						count++;
					}
					else
					{
						printf("kai shi da kai");
						printf("%3d,%d=%d", n, m, map[m][n]);
						open(m, n);
					}
				}
			}
		}

	}
}

//鼠标操作
int play()
{
	MOUSEMSG msg = { 0 };
	int r;
	int c;

	while (1)
	{
		msg = GetMouseMsg();

		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:	//扫雷 19~28
			printf("%5d\n%5d\n", msg.x, msg.y);
			r = msg.x / SIZE + 1;

			c = msg.y / SIZE + 1;
			printf("%5d\n%5d\n", r, c);
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				if (map[r][c] == 20)	//点的位置是0
				{
					open(r, c);
				}
				else
				{
					map[r][c] -= 20;	//-1~8
					count++;
					//char count1_char = count;

					printf("%d\n", count);

				}

			}
			return map[r][c];
			break;
		case WM_RBUTTONDOWN:	//标雷或取消标记
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;

			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				map[r][c] += 50;
				printf("%d,%d=%d\n", c, r, map[r][c]);
				printf("qi zi\n");
			}
			else if (map[r][c] > 30)
			{
				map[r][c] -= 50;
				printf("%d,%d=%d\n", c, r, map[r][c]);
				printf("qu xiao qi zi\n", c, r, map[r][c]);
			}
			return map[r][c];
			break;
		case WM_MBUTTONDOWN:
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;
			printf("66666\n");
			int a = 0;
			int b = 0;
			int mine11 = 0;
			for (a = r-1; a <= r + 1; a++)
			{
				for (b = c-1; b <= c + 1; b++)
				{
					if (map[a][b] > 30)
					{
						mine11++;
					}
				}
			}
			printf("jinrujisuan mine11\n");
			printf("%d\n",mine11);
			if (mine11 < map[r][c])
			{
				HWND hWnd = GetActiveWindow();
				MessageBox(hWnd, L"请确认排出雷的数量是否正确", L"", MB_OK);
				return map[r][c];
				break;
				//THIS.msg("标志数小于雷数");
			}
			for (int m = r - 1; m <= r + 1; m++)
			{
				printf("jin ru zhongjiananjian\n");
				for (int n = c - 1; n <= c + 1; n++)
					{
					printf("jin ru xun huan2\n");
					if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
					{

						if (map[m][n] >= 19 && map[m][n] <= 28)
						{
						//if (map[m][n] == 19|| map[m][n] == 20)//思考中
						//{
						map[m][n] -= 20;
						count++;
						printf("fa xian lei zhongjian\n");
						printf("%3d,%d=%d", n, m, map[m][n]);
						if (map[m][n] == -1) {
							return map[m][n];
							break;
						}
						//}
						//else {



						//}

						;
					}
					else
					{
						printf("else\n");
						if (map[m][n] <= 8 && map[m][n] >= 0)
						{

							printf("wu lei zhongjian\n");
							printf("%3d,%d=%d", n, m, map[m][n]);
							//map[m][n] -= 20;
							//count++;
							printf("%3,%=%\n", n, m, map[m][n]);

						}
					}
				}
			}

		}
			return map[r][c];
			break;
		}

		
	}
}



int main()
{
	//打开一个图形窗口
	HWND hwnd = initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);
	//hwnd;
	//initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);//显示控制台

	loadimg();//加载图片
	initboard();//初始化棋盘


	while (1)
	{
		printboard();
		if (play() == -1)
		{
			printboard();
			MessageBox(hwnd, L"你输了", L"", MB_OK);
			break;
		}
		if (ROW * COL - MINE == count)
		{
			printboard();
			MessageBox(hwnd, L"你赢了", L"", MB_OK);
			break;
		}
	}
	return 0;
}
ava
智慧志恒

2024-5-28

修改了一下,排出雷后在数字上点击鼠标中间键就能把所有的值为0的无雷区域打开,如果数字是3,该区域只排出了2个雷,还会提示数量不对,程序里面插入了好多用于调试查看的printf行,可以删除。 -  智慧志恒  2024-5-28
举报
举报
0

先照https://blog.csdn.net/u014546553/article/details/53538407的步骤调整下项目设置(调整的是Release配置) 然后下拉Debug选择Release配置进行生成(VS窗口顶上绿三角左边那个) 生成后发给你的朋友 然后让他把图片放到程序同目录下运行

或者让你朋友把图片放到程序目录上一级的项目目录上 

举报
0

你说的根目录是指,比如?   如果是 VS 打开项目代码运行的话要放到与 main.c 同目录下试试

ava
xiongfj ◑◑

2024-3-30

技术讨论社区