VS2022 EGE 游戏开发之跨年滑雪小游戏

本文介绍了如何使用VS2022开发一款跨年滑雪小游戏,讲解了游戏中的鼠标操作处理和雪花飘落的实现细节,包括结构体定义、随机初始化和循环更新等关键代码部分。
摘要由CSDN通过智能技术生成

hello大家好,2022年就要结束了,在最后一天,我给大家带来了一个跨年滑雪游戏!

给孩子一个三连吧……

OK!进入正片

老样子,先把代码放上

#include<time.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define _CRT_SECURE_NO_WARNINGS
#define WIDTH				1320
#define HEIGHT				700
#define INTERVAL		40
#define ROW					HEIGHT/INTERVAL+1
#define COL					WIDTH/INTERVAL
#define NUM					25
enum TOOLS {
	SPACE,
	TREE,
	FLAG
};
enum DIR {
	UP,
	DOWN,
	LEFT,
	RIGHT,
	UPLEFT,
	UPRIGHT,
	DOWNLEFT,
	DOWNRIGHT
};
struct Player {
	int x, y;
	DIR dir;
} player;
struct Snow {
	int x, y;
	int speed;
	int type;
} snow[NUM];
IMAGE flag;
IMAGE tree;
IMAGE scroll;
IMAGE rabbit;
IMAGE person;
IMAGE Rpacket;
IMAGE firecracker;
IMAGE snowflake[4];
MOUSEMSG msg;
int map[ROW][COL];
bool prize[3] = { false,false,false };
int score = 0, count = 0, t=180, pyl=0;
void initSnowflake(int i) {
	snow[i].x = rand() % (WIDTH - 35);
	snow[i].y = rand() % 35 - 70;
	snow[i].speed = rand() % 5 + 1;
	snow[i].type = rand() % 4;
}
void Init() {
	srand(time(0));
	loadimage(&person, "人.png", 45, 45);
	loadimage(&scroll, "卷轴.png", 170, 145);
	loadimage(&rabbit, "兔子.png", 100, 100);
	loadimage(&firecracker, "鞭炮.png", 100, 130);
	loadimage(&Rpacket, "红包.png", HEIGHT, HEIGHT);
	loadimage(&flag, "红旗.png", INTERVAL, INTERVAL);
	loadimage(&tree, "松树.png", INTERVAL, INTERVAL);
	loadimage(&snowflake[0], "雪花1.png", 35, 35);
	loadimage(&snowflake[1], "雪花2.png", 35, 35);
	loadimage(&snowflake[2], "雪花3.png", 35, 35);
	loadimage(&snowflake[3], "雪花4.png", 35, 35);
	player.x = 0;
	player.y = INTERVAL * 6;
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			int r = rand() % 100 + 1;
			if (r <= 98) map[i][j] = SPACE;
			else if (r <= 99) map[i][j] = FLAG;
			else map[i][j] = TREE;
		}
	}
	for (int i = 0; i < NUM; i++) {
		initSnowflake(i);
	}
}
void Draw() {
	setbkcolor(WHITE);
	cleardevice();
	setbkmode(TRANSPARENT);
	settextcolor(RED);
	settextstyle(155, 0, "华文行楷");
	int spaceH = (HEIGHT - textheight("2023 新年快乐")) / 2;
	int spaceV = (WIDTH - textwidth("2023 新年快乐")) / 2;
	outtextxy(spaceV, spaceH, "2023 新年快乐");
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			switch (map[i][j]) {
			case TREE:
				putimage(j * INTERVAL, i * INTERVAL + pyl, &tree, SRCAND);
				break;
			case FLAG:
				putimage(j * INTERVAL, i * INTERVAL + pyl, &flag, SRCAND);
				break;
			case SPACE:
				break;
			}
		}
	}
	for (int i = 0; i < NUM; i++) {
		putimage(snow[i].x, snow[i].y, &snowflake[snow[i].type], SRCAND);
	}
	putimage(player.x, player.y, &person, SRCAND);
	putimage((WIDTH - 170) / 2, 0, &scroll, SRCAND);
	putimage(0, 0, &firecracker, SRCAND);
	putimage(WIDTH - 100, 0, &firecracker, SRCAND);
	putimage(WIDTH - 100, HEIGHT - 100, &rabbit, SRCAND);
	char ch[100];
	settextstyle(35, 0, "华文行楷");
	sprintf_s(ch, "剩余时间:%d s    分数:%d", t, score);
	spaceV = (WIDTH - textwidth(ch)) / 2;
	outtextxy(spaceV, 0, ch);
}
void Hit() {
	int dx = player.x, dy = player.y;
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			int mx = j * INTERVAL;
			int my = i * INTERVAL;
			if (dx >= mx && dx <= mx + INTERVAL && dy >= my && dy <= my + INTERVAL) {
				switch (map[i][j]) {
				case SPACE:
					break;
				case FLAG:
					score += 10;
					break;
				case TREE:
					score -= 15;
					break;
				}
				map[i][j] = SPACE;
			}
			else if (mx >= dx && mx <= dx + INTERVAL && my >= dy && my <= dy + INTERVAL) {
				switch (map[i][j]) {
				case SPACE:
					break;
				case FLAG:
					score += 10;
					break;
				case TREE:
					score -= 15;
					break;
				}
				map[i][j] = SPACE;
			}
		}
	}
}
void movePlayer() {
	if (player.dir == UPLEFT && player.x - 10 >= 0 && player.y - 10 >= 0) {
		player.y -= 10;
		player.x -= 10;
	}
	else if (player.dir == UPRIGHT && player.x + 45 + 10 <= WIDTH && player.y - 10 >= 0) {
		player.y -= 10;
		player.x += 10;
	}
	else if (player.dir == DOWNLEFT && player.x - 10 >= 0 && player.y + 45 + 10 <= HEIGHT) {
		player.y += 10;
		player.x -= 10;
	}
	else if (player.dir == DOWNRIGHT && player.x + 45 + 10 <= WIDTH && player.y + 45 + 10 <= HEIGHT) {
		player.y += 10;
		player.x += 10;
	}
	else if (player.dir == UP && player.y - 10 >= 0) {
		player.y -= 10;
	}
	else if (player.dir == DOWN && player.y + 45 + 10 <= HEIGHT) {
		player.y += 10;
	}
	else if (player.dir == LEFT && player.x - 10 >= 0) {
		player.x -= 10;
	}
	else if (player.dir == RIGHT && player.x + 45 + 10 <= WIDTH) {
		player.x += 10;
	}
}
void keyDown() {
	if (_kbhit()) {
		switch (_getch()) {
		case 72:
			//上
			player.dir = UP;
			break;
		case 80:
			//下
			player.dir = DOWN;
			break;
		case 75:
			//左
			player.dir = LEFT;
			break;
		case 77:
			//右
			player.dir = RIGHT;
			break;
		case 's':
			char reStart = _getch();
			break;
		}
		movePlayer();
	}
}
void Renew() {
	for (int i = 1; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			map[i - 1][j] = map[i][j];
		}
	}
	for (int j = 0; j < COL; j++) {
		int r = rand() % 100 + 1;
		if (r <= 98) map[ROW - 1][j] = SPACE;
		else if (r <= 99) map[ROW - 1][j] = FLAG;
		else map[ROW - 1][j] = TREE;
	}
}
int main() {
	HWND hwnd=initgraph(WIDTH, HEIGHT);
	mciSendString("open 1.mp3", 0, 0, 0);
	mciSendString("play 1.mp3 repeat", 0, 0, 0);
	Init();
	DWORD t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7=0, t8=0;
	BeginBatchDraw();
	while (t>0) {
		PeekMouseMsg(&msg);
		if (msg.mkLButton) {
			if (msg.x < player.x && msg.y < player.y) player.dir = UPLEFT;
			else if (msg.x > player.x && msg.y < player.y) player.dir = UPRIGHT;
			else if (msg.x < player.x && msg.y > player.y) player.dir = DOWNLEFT;
			else if (msg.x > player.x && msg.y > player.y) player.dir = DOWNRIGHT;
			else if (msg.x < player.x) player.dir = LEFT;
			else if (msg.x > player.x + 45) player.dir = RIGHT;
			else if (msg.y < player.y) player.dir = UP;
			else if (msg.y > player.y + 45) player.dir = DOWN;
		}
		Draw();
		Hit();
		keyDown();
		if (pyl <= -INTERVAL) {
			Renew();
			pyl = 0;
		}
		if (t1 - t2 >= 10) {
			pyl--;
			t2 = t1;
		}
		if (t3 - t4 >= 50) {
			for (int i = 0; i < NUM; i++) {
				snow[i].y += snow[i].speed;
				if (snow[i].y >= HEIGHT) {
					initSnowflake(i);
				}
			}
			t4 = t3;
		}
		if (t5 - t6 >= 1000) {
			t--;
			t6 = t5;
		}
		if (t7 - t8 >= 35) {
			movePlayer();
			t8 = t7;
		}
		t1 = GetTickCount();
		t3 = GetTickCount();
		t5 = GetTickCount();
		t7 = GetTickCount();
		FlushBatchDraw();
	}
	FlushBatchDraw();
	MessageBox(hwnd, "游戏结束!", "温馨提示", MB_OK);
	return 0;
}

头文件不多讲,今天主要说一下重点内容!

1.鼠标操作:

     鼠标操作一般用MOUSEMSG类型定义

     有些小盆友定义了,但是调用时显示未定义,问题出在没有接收鼠标信息上

     鼠标信息有两种方法接收

             1.bool PeekMouseMsg(MOUSEMSG *pMsg, bool bRemoveMsg = true);

             比如你定义了MOUSEMSG msg;那函数中要用PeekMouseMsg(&msg);传入鼠标指针参数

             2.MOUSEMSG GetMouseMsg();

             这个函数我个人不喜欢用,因为它是一个阻塞函数,意思就是要等待有新信息才会结束

             这个函数直接msg=GetMouseMsg():就好啦!

2.雪花的飘落

       雪花可以用结构体来完成

        struct Snow {
            int x, y;//坐标
            int speed;//下降速度
            int type;//类型(我有4种雪花图片,只有1种的小盆友们不用定义哦)
        } snow[25];

        然后再定义一个初始化雪花的函数,这里建议不要把所有雪花在函数中同时初始化

        void initSnowflake(int i) {
            snow[i].x = rand() % (WIDTH - 35);//x坐标随机初始化
            snow[i].y = rand() % 35 - 70;//y坐标随机初始化
            snow[i].speed = rand() % 5 + 1;//速度初始化
            snow[i].type = rand() % 4;//类型初始化(没有多种雪花的小盆友们不用写)
        }

        在初始化Init函数中用循环初始化

        for (int i = 0; i < NUM; i++) {
                initSnowflake(i);
        }

        每次打印时判断是否出屏幕
        if (snow[i].y >= HEIGHT) {
                initSnowflake(i);//这个i是需要循环的哦
        }

        雪花落下用循环处理

        for (int i = 0; i < NUM; i++) {
                snow[i].y += snow[i].speed;
        }

程序就解释到这儿,资源加粉丝,私信我就好啦!byebye

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++小盆友

你的鼓励将是我创作的最大动力呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值