๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ‍๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€

[C++/Game] Google Dino ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

( ์›๋ณธ ) https://blog.naver.com/glass_sh/222643161325

 

[C++/Game] Google Dino ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

Google Chrome Easter Egg - Dino game ์ธํ„ฐ๋„ท์ด ๋Š๊ธฐ๋ฉด ๋‚˜ํƒ€๋‚˜๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ์˜ ์ด์Šคํ„ฐ์—๊ทธ ๊ฒŒ์ž„์ด๋‹ค! ...

blog.naver.com


Google Chrome Easter Egg - Dino game

์ธํ„ฐ๋„ท์ด ๋Š๊ธฐ๋ฉด ๋‚˜ํƒ€๋‚˜๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ์˜ ์ด์Šคํ„ฐ์—๊ทธ ๊ฒŒ์ž„์ด๋‹ค!

ํฌ๋กฌ ์ฃผ์†Œ์ฐฝ์— chrome://dino ๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ”Œ๋ ˆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

c++๊ณผ c๋ฅผ ์ด์šฉํ–ˆ๊ณ , ์•„๋ž˜ ๊ธ€์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

โ€‹

https://eskeptor.tistory.com/159

 

[C++] Google ๊ณต๋ฃก ๊ฒŒ์ž„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

ํฌ๋กฌ์—์„œ ์ธํ„ฐ๋„ท์ด ๋Š๊ฒผ์„ ๋•Œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๋ฃก ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. Flappy Bird ๊ฒŒ์ž„์ฒ˜๋Ÿผ ํ‚ค ํ•˜๋‚˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ํ‚ฌ๋ง ํƒ€์ž„์šฉ ๊ฒŒ์ž„์ด์ฃ . (์œ„์˜ ๊ณต๋ฃก ๊ฒŒ์ž„์€ Space Bar ํ•˜๋‚˜ ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•ฉ๋‹ˆ

eskeptor.tistory.com

 

#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;

#define PRINT(STR) {cout << STR << endl;}

const int KEY_ESC = 27;
const int KEY_SPACE = 32;

const int MAX_JUMP = 8; // ์ตœ๋Œ€ ์ ํ”„๋†’์ด
const int Y_BASE = 15; // ๊ณต๋ฃก์˜ ์ดˆ๊ธฐ y์ถ•
const int Y_COL = 4; // y์ถ• ์ถฉ๋Œ๊ธฐ์ค€
const int TR_COL = 7; // ๋‚˜๋ฌด ์ถฉ๋Œ x์ถ•

const int TR_START = 50; // ๋‚˜๋ฌด ์ƒ์„ฑ ์œ„์น˜
const int TR_END = -6; // ๋‚˜๋ฌด ์‚ฌ๋ผ์ง€๋Š” ์œ„์น˜
const int SLEEP = 35; // ๊ฒŒ์ž„ ๊ฐฑ์‹  ์ฃผ๊ธฐ

// ํ‚ค ์ž…๋ ฅ ๊ฐ์ง€
int GetKey() {
	if (_kbhit() != 0) { // ํ‚ค๊ฐ€ ๋ˆŒ๋ ธ์„ ๋•Œ 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ
		return _getch(); // ์ฝ์€ ๋ฌธ์ž ๋ฐ˜ํ™˜
	}
	return 0;
}

// ์ปค์„œ ์ˆจ๊ธฐ๊ธฐ ( ๊นœ๋นก์ž„ ์ œ๊ฑฐ, ํฌ๊ธฐ ์ž‘๊ฒŒ)
void CursorSet() {
	CONSOLE_CURSOR_INFO cursorInfo = { 0, };
	cursorInfo.dwSize = 1;
	cursorInfo.bVisible = FALSE;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
}

// ์ปค์„œ ์œ„์น˜ ์„ค์ •
void SetKeyCursor(int _nX, int _nY) {
	COORD cursorPos = { (SHORT)_nX, (SHORT)_nY };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
}

๊ฐ€์žฅ ๋จผ์ € ํ‚ค ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๋Š” ํ•จ์ˆ˜, ๊นœ๋นก์ด๋Š” ์ปค์„œ๋ฅผ ์ˆจ๊ธฐ๋Š” ํ•จ์ˆ˜,

๊ทธ๋ฆฌ๊ณ  ์ปค์„œ ์œ„์น˜ ์„ค์ • ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

โ€‹

// ๊ณต๋ฃก ๊ทธ๋ฆฌ๊ธฐ
void Dino(int Y) {
	static bool bFootToggle = false;
	SetKeyCursor(0, Y_BASE - Y);
	PRINT("  $$$$$");
	PRINT("  $$$");
	PRINT("  $$");
	PRINT("$$$$$");
	if(bFootToggle){ PRINT("   $"); }
	else{ PRINT(" $"); }
	bFootToggle = !bFootToggle;
}

// ๋‚˜๋ฌด ๊ทธ๋ฆฌ๊ธฐ
void Tree(int X) {
	if (X >= 0) {
		SetKeyCursor(X, Y_BASE);
		PRINT("   โ– ");
		SetKeyCursor(X, Y_BASE + 1);
		PRINT("โ–  โ– ");
		SetKeyCursor(X, Y_BASE + 2);
		PRINT("โ– โ– โ– ");
		SetKeyCursor(X, Y_BASE + 3);
		PRINT(" โ– ");
		SetKeyCursor(X, Y_BASE + 4);
		PRINT(" โ– ");
	}
	else if (X >= -2) {
		X = 0;
		SetKeyCursor(X, Y_BASE);
		PRINT(" โ– ");
		SetKeyCursor(X, Y_BASE + 1);
		PRINT(" โ– ");
		SetKeyCursor(X, Y_BASE + 2);
		PRINT("โ– โ– ");
		SetKeyCursor(X, Y_BASE + 3);
		PRINT("โ– ");
		SetKeyCursor(X, Y_BASE + 4);
		PRINT("โ– ");
	}
	else if (X >= -4) {
		X = 0;
		SetKeyCursor(X, Y_BASE);
		PRINT("โ– ");
		SetKeyCursor(X, Y_BASE + 1);
		PRINT("โ– ");
		SetKeyCursor(X, Y_BASE + 2);
		PRINT("โ– ");
	}
}

// ๋ฐ”๋‹ฅ ๊ทธ๋ฆฌ๊ธฐ
void Floor(int base) {
	SetKeyCursor(base, Y_BASE + 5);
	PRINT("ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก");
}

// ์ ์ˆ˜ํŒ ๊ทธ๋ฆฌ๊ธฐ
void ScorePad(int score) {
	SetKeyCursor(20, 0);
	cout << "Score : " << score;
}

์œ„์˜ ํ•จ์ˆ˜๋“ค์€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ์š”์†Œ๋“ค!!

๊ณต๋ฃก๊ณผ ๋‚˜๋ฌด, ๋ฐ”๋‹ฅ, ์ ์ˆ˜ํŒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.

โ€‹

// ๊ฒŒ์ž„ ๊ด€๋ฆฌ ํ•จ์ˆ˜
void GameStart() {
	int nScore = 0;
	int nKey = -1;
	int YPos = 0;
	int TreePos = TR_START;

	bool IsJumpping = false; // ์ ํ”„ ์ค‘์ธ๊ฐ€
	bool IsJumpped = false; // ์ ํ”„ํ•˜์—ฌ ์ตœ๊ณ  ์ง€์ ์— ์˜ฌ๋ž๋Š”๊ฐ€
	bool IsCollision = false; // ๋‚˜๋ฌด์™€ ์ถฉ๋Œํ•˜์˜€๋Š”๊ฐ€

	while (true) {
		cout << "[ DINO GAME ]";
		ScorePad(nScore);

		nKey = GetKey();
		switch(nKey) {
		case KEY_ESC:
			exit(0);
		case KEY_SPACE:
			IsJumpping = true;
			break;
		default:
			break;
		}

		// ์ ํ”„ ์ค‘์ผ ๋•Œ
		if (IsJumpping) {
			if (YPos < MAX_JUMP && IsJumpped == false) { // ์˜ฌ๋ผ๊ฐ€๋Š” ์ค‘
				YPos++;
			}
			if (IsJumpped && YPos == 0) { // ์ตœ๊ณ ์ง€์  ๋„๋‹ฌ ํ›„ ์ ํ”„ ๋
				IsJumpped = false;
				IsJumpping = false;
			}
			else if (IsJumpped) { // ์ตœ๊ณ ์ง€์  ์ฐ์€ ํ›„ ๋‚ด๋ ค์˜ฌ๋•Œ
				YPos--;
				cout << "\n\n\n\n\t jump!!!!";
			}
			else if (YPos == MAX_JUMP) { // ์ตœ๊ณ ์ง€์  ์ฐ์„ ๋•Œ!
				IsJumpped = true;
			}
			
		}
		// ์ ํ”„ ์ค‘์ด ์•„๋‹ ๋•Œ
		else {
			if (YPos > 0) {
				YPos--;
			}
		}

		if (TreePos > TR_END) {
			TreePos -= 2;
		}
		else {
			TreePos = TR_START;
		}

		// ์ถฉ๋Œ
		if (TreePos < TR_COL - 1) {
			if (YPos<Y_COL - 1 && TreePos>TR_END + 1) {
				IsCollision = true;
			}
		}

		Tree(TreePos);
		Dino(YPos);
		Floor(0);

		Sleep(SLEEP);

		system("cls");

		if (IsCollision) {
			cout << endl << endl << "\t -- Game Over --\n";
			cout << "\t Score : " << nScore << endl << endl;
			system("pause");
			return;
		}

		else {
			nScore += 1;
		}
	}
}

int main() {
	while (true) {
		CursorSet();
		GameStart();
	}
}

๋งˆ์ง€๋ง‰์œผ๋กœ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๊ณผ ์ ํ”„, ์ถฉ๋Œ, mainํ•จ์ˆ˜ ๋ถ€๋ถ„์ด๋‹ค.

โ€‹

[ ์™„์„ฑ๋ณธ ]

 

๊ณต๋ฃก๊ฒŒ์ž„^-^!!

๋‚ด ๊ณต๋ฃก ์ข€ ์˜น์กธํ•œ๋ฐ ๊ทธ๋ž˜๋„ ๊ท€์—ฌ์›Œ์„œ ๋งˆ์Œ์— ๋“ ๋‹ค. ์ ํ”„ ๋ถ€๋ถ„์ด ์ข€ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ ์žฌ๋ฐŒ์—ˆ๋‹ค

=์„ ==์œผ๋กœ ์ž˜๋ชป์จ์„œ ์ฒ˜์Œ์— ๊ณต๋ฃก์ด ๋ง‰ ๋‚ ์•„๋‹ค๋…”๋‹ค...^^ ๊ฒจ์šฐ ์ฐพ์•„์„œ ๊ณ ์นจ

โ€‹