⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 天空下降的游戏源代码
💻 CPP
字号:
#include <Windows.h>
#include <Stdlib.h>
#include <Stdio.h>
#include <Conio.h>

enum Direction
{
	Left,
	Right,
};

struct Apple
{
	int Xpos;
	int Ypos;
	BOOL Falling;
}Apple[500];

struct Hero
{
	int Xpos;
	int Ypos;
	Direction Direction;
	int Frame;
}Hero;

CHAR _Apple[9][11] =
{
	"   ## ####",
	"  # # #  #",
	"   ### ## ",
	" ######## ",
	"#   #   # ",
	"#       # ",
	" #     #  ",
	" #  #  #  ",
	"  ## ##   ",
};

CHAR Hero_RightA[26][20] =
{
	"      #####        ",
	"     #     #       ",
	"    #       #      ",
	"   #       # #     ",
	"   #       # ##    ",
	"   #           #   ",
	"   #           #   ",
	"   #    #    ##    ",
	"    #    ## #      ",
	"     #     #       ",
	"     #######       ",
	"     #     #       ",
	"     #  #  #       ",
	"     ##  # #       ",
	"     ##  # #       ",
	"     ##  # #       ",
	"     #######       ",
	"      #  ##        ",
	"      ### #        ",
	"      #   #        ",
	"      #   #        ",
	"      ######       ",
	"      #     #      ",
	"      #     #      ",
	"      #######      ",
};

CHAR Hero_RightB[26][20] =
{
	"      #####        ",
	"     #     #       ",
	"    #       #      ",
	"   #       # #     ",
	"   #       # ##    ",
	"   #           #   ",
	"   #           #   ",
	"   #    #    ##    ",
	"    #    ## #      ",
	"     #     #       ",
	"     #######       ",
	"     #     #       ",
	"     #   ###       ",
	"    ##      ##     ",
	"   # #  #    #     ",
	"   # #  ##  # #    ",
	"    ######### #    ",
	"     #      ##     ",
	"    #       # ###  ",
	"   #    #    #   # ",
	"  # ## ### ##    # ",
	" #    ##  #     ## ",
	" ##     #  #  ##   ",
	"   ##   #   ##     ",
	"     ###           ",
};

CHAR Hero_LeftA[26][20] = 
{
	"        #####      ",
	"       #     #     ",
	"      #       #    ",
	"     # #       #   ",
	"    ## #       #   ",
	"   #           #   ",
	"   #           #   ",
	"    ##    #    #   ",
	"      # ##    #    ",
	"       #     #     ",
	"       #######     ",
	"       #     #     ",
	"       #  #  #     ",
	"       # #  ##     ",
	"       # #  ##     ",
	"       # #  ##     ",
	"       #######     ",
	"        ##  #      ",
	"        # ###      ",
	"        #   #      ",
	"        #   #      ",
	"       ######      ",
	"      #     #      ",
	"      #     #      ",
	"      #######      ",
};

CHAR Hero_LeftB[26][20] = 
{
	"        #####      ",
    "       #     #     ",
	"      #       #    ",
	"     # #       #   ",
	"    ## #       #   ",
	"   #           #   ",
	"   #           #   ",
	"    ##    #    #   ",
	"      # ##    #    ",
	"       #     #     ",
	"       #######     ",
	"       #     #     ",
	"       ###   #     ",
	"     ##      ##    ",
	"     #    #  # #   ",
	"    # #  ##  # #   ",
	"    # #########    ",
	"     ##      #     ",
	"  ### #       #    ",
	" #   #    #    #   ",
	" #    ## ### ## #  ",
	" ##     #  ##    # ",
	"   ##  #  #     ## ",
	"     ##   #   ##   ",
	"           ###     ",
};

int Score;

void Draw_Hero()
{
	for(int Y = 0; Y < 26; Y ++)
	{
	for(int X = 0; X < 20; X ++)
	{
		COORD Pos;

		Pos.X = X + Hero.Xpos;
		Pos.Y = Y + Hero.Ypos;

		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

		switch(Hero.Direction)
		{
		case Left:
			if(Hero.Frame == 0)
				printf("%c", Hero_LeftA[Y][X]);
			else
				printf("%c", Hero_LeftB[Y][X]);
			break;
		case Right:
			if(Hero.Frame == 0)
				printf("%c", Hero_RightA[Y][X]);
			else
				printf("%c", Hero_RightB[Y][X]);
			break;
		}
	}
	}
}

void Erase_Hero()
{
	for(int Y = 0; Y < 26; Y ++)
	{
	for(int X = 0; X < 20; X ++)
	{
		COORD Pos;

		Pos.X = X + Hero.Xpos;
		Pos.Y = Y + Hero.Ypos;

		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

		printf(" ");
	}
	}
}

void Update_Hero()
{
	if(kbhit())
	{
		CHAR Ch = getch();

		switch(Ch)
		{
		case 77:
			Erase_Hero();

			Hero.Direction = Right;

			if(Hero.Xpos < 298)
				Hero.Xpos += 4;

			if(Hero.Frame == 0)
				Hero.Frame = 1;
			else
				Hero.Frame = 0;

			Draw_Hero();
			break;
		case 75:
			Erase_Hero();

			Hero.Direction = Left;

			if(Hero.Xpos > 0)
				Hero.Xpos -= 4;

			if(Hero.Frame == 0)
				Hero.Frame = 1;
			else
				Hero.Frame = 0;

			Draw_Hero();
			break;
		case 27:
			exit(0);
			break;
		}
	}
}

void Draw_Apple(int Xpos, int Ypos)
{
	for(int Y = 0; Y < 9; Y ++)
	{
	for(int X = 0; X < 11; X ++)
	{
		COORD Pos;

		Pos.X = X + Xpos;
		Pos.Y = Y + Ypos;

		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

		printf("%c", _Apple[Y][X]);
	}
	}
}

void Erase_Apple(int Xpos, int Ypos)
{
	for(int Y = 0; Y < 9; Y ++)
	{
	for(int X = 0; X < 11; X ++)
	{
		COORD Pos;

		Pos.X = X + Xpos;
		Pos.Y = Y + Ypos;

		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

		printf(" ");
	}
	}
}

void Update_Apples()
{
	for(int i = 0; i < 500; i ++)
	{
		if(Apple[i].Falling)
		{
			if(Apple[i].Ypos < 72)
			{
				Erase_Apple(Apple[i].Xpos, Apple[i].Ypos);
				Apple[i].Ypos ++;
				Draw_Apple(Apple[i].Xpos, Apple[i].Ypos);

				if(Apple[i].Ypos >= Hero.Ypos)
				{
					if(Apple[i].Xpos >= Hero.Xpos &&
						Apple[i].Xpos + 11 <= Hero.Xpos + 20)
					{
						Score ++;

						if(Score >= 10)
						{
							MessageBox(NULL, "*** [ Congratulations!!! ] *** You collected 10 apples! You win! (:", NULL,
								MB_OK);

							exit(0);
						}
					}
				}
			}
			else
			{
				Erase_Apple(Apple[i].Xpos, Apple[i].Ypos);
				Apple[i].Falling = FALSE;

				Apple[i + 1].Falling = TRUE;
				Apple[i + 1].Xpos = rand() % 289;
				Apple[i + 1].Ypos = 0;
			}
		}
	}
}

void main()
{
	srand(GetTickCount());

	CONSOLE_CURSOR_INFO CursorInfo;

	CursorInfo.bVisible = FALSE;
	CursorInfo.dwSize = 1;

	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CursorInfo);

	COORD Size;

	Size.X = 320;
	Size.Y = 100;

	SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Size);
	
	Hero.Xpos = 0;
	Hero.Ypos = 72;
	Hero.Direction = Right;
	Hero.Frame = 0;

	Draw_Hero();

	Apple[0].Falling = TRUE;
	Apple[0].Xpos = rand() % 289;
	Apple[0].Ypos = 0;

	Draw_Apple(Apple[0].Xpos, Apple[0].Ypos);

	while(TRUE)
	{
		Update_Hero();

		static DWORD TickCount = GetTickCount();

		if(GetTickCount() - TickCount > 50)
		{
			Update_Apples();
			TickCount = GetTickCount();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -