Detailed tutorial of C/C + + game project: Gold Miner

      "Gold miner" is a very classic game. In the game, players can get gold through continuous mining, and finally break into the next level. In this process, there will be rocks, smoke and mice to make trouble, and even small mice carrying explosive bags. Players must overcome them in order to enter deeper mines.

The game is mainly played by continuously collecting underground gold and diamonds to get higher points. Only when you complete the task goal can you pass the corresponding level. The characters on the beach in the game screen are the players' characters. The dark brown part below is underground, and gold and diamonds are the items that players need to collect. The items in the four boxes on the right of the character are props that can be used in the game.

The dotted line in the picture is the detector in the game. The detector will constantly swing left and right. When it swings to the position of underground gold and diamonds, you only need to click anywhere in the pit to launch the exploration probe to collect these items. Of course, you must aim well before you shoot.

Of course, it is not so simple to successfully collect rich resources. In the underground pit, there will be all kinds of difficulties and obstacles to interfere with the player's collection. At this time, we will use various props on the right of the character. When stones are collected in the pit, the player can use explosive sticks to blow up these stones. When a large number of stones in the pit hinder the player's collection, you can drag them to the position of the stones in the pit with a bomb, which will blow up all the stones in the way at one time. When the smoke bucket in the pit is detonated and the underground situation cannot be seen clearly, we can use the electric fan, which will blow away all the smoke, so that players can clearly and thoroughly see the distribution of the pit. From time to time, there will be little mice in the pit to make trouble. Don't worry. We have rat poison to deal with these little things. As long as we drag the rat poison to the location of the mouse, we will eliminate these little troubles in an instant, so that players can collect the resources they want more smoothly.

Intense and exciting battle, relaxed and interesting playing methods, rich and diverse props, and exquisite and detailed pictures. This is the project "gold miner" we are going to complete today

Before that, I would like to explain to you that because this is a relatively large project, it will be difficult to show all the codes, including the participation of the database. Therefore, I cut the main part of the code to let you understand the difficulties and logical ideas of realizing this project. I hope you can understand
 

Well, don't say much. Let's start

First, we create a header file and put some structures and functions of enumeration types into it. This will make the whole project look more orderly and better understood. First, put the enumeration types into it

enum ATTR
{
	//Array subscript corresponding to the picture
	i_gold=1,
	i_money=3,
	i_role=5,
	i_stone=9,
	i_bk= i_stone+1,
	//Window size
	WIDTH = 1080,
	HEIGHT= 640,
	//Item quantity
	MINE_NUM=10,
}; 
enum TYPE
{
	//Item type
	GOLD,	//Nuggets
	MONEY,	//Purse
	STONE,	//stone
	//Swing direction
	LEFT,
	RIGHT,
	//Swing state
	M_LONG,
	M_NORMAL,
	M_SHORT,

};

Then put our old friend structure in

struct Role
{
	int x;		//Location of the map
	int y;
	int width;//Picture width and height
	int height;
	int coin;//Gold coins
};
struct Mine //goods
{
	int x;
	int y;
	int size;//Used to calculate collisions
	int flag;//Does the item exist
	int type;//Item type, purse, stone, bullion
	int gold;//value
};
//hook
struct Hook
{
	double x;//The starting coordinates of the rope are fixed
	double y;
	double endx;//Coordinates of end change
	double endy;
	int len;//Rope length
	int dir;//Swing direction
	double angle;//Swing angle
	double speed;//speed
	double vx;//Velocity component
	double vy;
	int swing;//Is it swinging
	int state;//Elongation state, elongation, normal, shortening
	int index;//Captured item subscript
};

OK, the next step is our main function main.Cpp. Remember to add the header file we wrote at the beginning and write the initialization function first

void GameInit()
{
	//Initialize random number seed
	srand(GetTickCount());
	//Initialize role data
	role.coin = 0;
	role.width = 140;
	role.height = 120;
	role.x = WIDTH / 2 - role.width / 2;//Center the character picture
	role.y = 0;
	//Load picture
	for (int i = 0; i < 10; i++)
	{
		char fileName[20];
		sprintf(fileName, "./images/%d.jpg", i);
		if (i <= 1)
		{
			loadimage(&img[i], fileName,73,62);
		}
		else
		{
			loadimage(&img[i], fileName);
		}	
	}
	loadimage(&img[i_bk], "./images/bk.jpg",WIDTH,HEIGHT-role.height);
	//Initialize item
	for (int i = 0; i < MINE_NUM; i++)
	{
		mine[i].flag = 1;
		mine[i].size = 60;
		mine[i].type = rand() % 3;
		mine[i].x=rand()%(WIDTH-mine[i].size);
		mine[i].y=rand()%(HEIGHT-role.height-100)+ role.height+ 50;
		mine[i].gold = rand()%600+rand()%200;
	}
	//Initialize hook
	hook.x = role.x+45;
	hook.y = role.y+100;
	hook.len = 50;
	hook.endx = hook.x;
	hook.endy=hook.y+hook.len;
	hook.angle = 0.0;
	hook.dir = RIGHT;
	hook.state = M_NORMAL;
	hook.vx = 0;
	hook.vy = 0;
	hook.speed = 5.0;
	hook.index = -1;
}

Then write our drawing function, which is relatively simple, that is, mapping

void Gamedraw()
{
	BeginBatchDraw();
	//Set background color
	setbkcolor(GREEN);
	cleardevice();
	putimage(0, role.height, &img[i_bk]);
	//Transparent map two pictures, one mask image and one original image
	putimage(role.x, role.y, &img[i_role-1],SRCAND);//Mask graph
	putimage(role.x, role.y, &img[i_role],SRCPAINT);//Original drawing
		//Draw hook
	setlinestyle(PS_SOLID, 5);
	setlinecolor(BROWN);
	line(hook.x, hook.y, hook.endx, hook.endy);
	//Draw items
	for (int i = 0; i < MINE_NUM; i++)
	{
		if (mine[i].flag)
		{
			switch (mine[i].type)
			{
			case GOLD:
				putimage(mine[i].x, mine[i].y, &img[i_gold-1],SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_gold],SRCPAINT);
				break;
			case MONEY:
				putimage(mine[i].x, mine[i].y, &img[i_money-1], SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_money], SRCPAINT);
				break;
			case STONE:
				putimage(mine[i].x, mine[i].y, &img[i_stone-1], SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_stone], SRCPAINT);
				break;
			}
		}
	}
	//Draw score
	char s[30];
	sprintf(s, "Gold coins:%d", role.coin);
	settextstyle(50, 0, "Blackbody");
	outtextxy(50, 50, s);
	EndBatchDraw();
}

The function of hook swing and how to swing the hook is mainly to make it not swing to the sky

//Hook swing
void hookRock()
{
	if (hook.state == M_NORMAL)
	{
		if (hook.dir == RIGHT)
		{
			hook.angle++;
		}
		else
		{
			hook.angle--;
		}
		if (hook.angle > 80)
		{
			hook.dir = LEFT;
		}
		else if (hook.angle < -80)
		{
			hook.dir = RIGHT;
		}
		hook.endx = hook.x + sin(π / 180 * hook.angle) * hook.len;
		hook.endy = hook.y + cos(π / 180 * hook.angle) * hook.len;
	}
}
int distance(struct Hook hook)
{
	double dis=sqrt((hook.x-hook.endx)* (hook.x - hook.endx) + (hook.y-hook.endy) * (hook.y - hook.endy));
	return dis <= hook.len;
}
void keyControl()
{
	//Lengthen by space
	if (GetAsyncKeyState(VK_SPACE) && hook.state == M_NORMAL)
	{
		hook.state = M_LONG;
		hook.vx = sin(π / 180 * hook.angle) * hook.speed;
		hook.vy = cos(π / 180 * hook.angle) * hook.speed;
	}

	if (hook.endx <= 0 || hook.endx >= WIDTH || hook.endy >= HEIGHT)
	{
		hook.state = M_SHORT;
	}	
	if (hook.state == M_LONG)
	{
		hook.endx += hook.vx;
		hook.endy += hook.vy;
	}
	else if (hook.state == M_SHORT)
	{
		hook.endx -= hook.vx;
		hook.endy -= hook.vy;
		//If it is shortened to the original length, it will stop shortening and judge whether the distance between the starting point and the end is equal to the length
		if (distance(hook))
		{
			hook.state = M_NORMAL;
		}
	}
}

Next is our grab function, which is also relatively simple

​
void grap()
{
	//Find out which item you're grabbing
	for (int i = 0; i < MINE_NUM; i++)
	{
		if (mine[i].flag &&
			hook.endx > mine[i].x && hook.endx<mine[i].x + mine[i].size &&
			hook.endy>mine[i].y && hook.endy < mine[i].y + mine[i].size)
		{
			hook.index = i;//Save the subscript of the caught item
			break;
		}
	}
	if (hook.index != -1)
	{
		hook.state = M_SHORT;
		mine[hook.index].x = hook.endx-mine[hook.index].size/2;
		mine[hook.index].y = hook.endy- mine[hook.index].size / 2;
		if (distance(hook))
		{
			hook.state = M_NORMAL;
			mine[hook.index].flag = 0;
			role.coin += mine[hook.index].gold;
			hook.state = M_NORMAL;
			hook.index = -1;
		}
	}
}

​

Finally, our main function

int main()
{
	initgraph(WIDTH,HEIGHT,1);
	GameInit();

	while (1)
	{
		printf("%lf,%lf vxy(%lf,%lf)\n", hook.endx, hook.endy,hook.vx,hook.vy);
		hookRock();
		Gamedraw();
		keyControl();   
		grap();
	}
	closegraph();
	return 0;
}

This is the main code of our "gold miner". Some people will ask. It doesn't seem to be much. It's really good from the code, but there are a lot of things involved in this project, including the database. Considering that some students can't understand it, I won't put it here. Interested students can go in to get the source code and study by themselves. Finally, what I want to say is, In fact, it's OK to write a game project. It's mainly to sort out the initialization function and update function. It's easy to understand it when packaged. Well, I hope you can get the knowledge and happiness you want here. I also hope you can pay attention to the UP master. Thank you very much!!!

                                                        

  In the follow-UP, the UP master will release more project source codes and learning materials. I hope you can continue to pay attention. If you have any questions, you can reply and leave a message. I'll try my best to answer them. If you want C/C + + learning materials and the source code of other projects, you can add group [1083227756] to understand. If you want to be interested in the future development of programmers, you can also add group chat. You can also focus on the WeChat official account: Fox's encoding time, and hope to learn progress with you!!!


Click the link below to join the group to get learning materials and project materials faster  


Enter the group to receive learning materials and project source material packagehttps://jq.qq.com/?_wv=1027&k=sttR3REF

Tags: C C++ Blockchain Bitcoin Digital Currency

Posted on Mon, 08 Nov 2021 01:52:42 -0500 by spartan789