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