[Bricks Run] 벽돌 피하기_C언어 게임Project2021. 8. 22. 18:00
목차
⭐ Code [Bricks Run]
//!주의!레거시 콘솔 사용 필수
//Bricks Run
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
#define WIDTH 30
#define HEIGHT 20
#define GREEN1 2
#define RED1 4
const float AddSpeed = 0.5f;
typedef struct
{
int x;
int y;
int act;
}Bricks;
typedef struct
{
int x;
}Player;
typedef struct
{
int x;
}
Coin;
typedef struct
{
char name[64];
int score;
}PlayerData;
Bricks bricks[WIDTH];
Player player;
Player player2;
int score;
char name[64];
Coin coin;
void removeCursor(int num);
void gotoxy(int x, int y);
void textcolor(int fg_color, int bg_color);
int isKeyDown(int key);
void cls(int text_color, int bg_color);
void Intro();
int GameStart();
void GameRun();
void GameRun2();
void ShowScore();
void CreateCoins();
void GetCoin();
int PlayerContainsCoin();
void CreateBricks();
void MoveBricks();
void DeleteBricks();
int PlayerContainsBricks();
int Player2ContainsBricks();
void MovePlayer();
void MovePlayer2();
void PrintMap();
void PrintMap2();
void EraseMap();
void EraseMap2();
void GameOver();
int Result();
int SortData(const void* a, const void* b);
void main()
{
char key;
cls(8, 14);
Intro();
do
{
if (GameStart())
GameRun();
else
GameRun2();
GameOver();
} while (Result());
}
void removeCursor(int num)
{
CONSOLE_CURSOR_INFO curInfo;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
curInfo.bVisible = num;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
}
void gotoxy(int x, int y)
{
COORD pos = { 2 * x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void textcolor(int fg_color, int bg_color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), fg_color | bg_color << 4);
}
int isKeyDown(int key)
{
return ((GetAsyncKeyState(key) & 0x8000) != 0);
}
void cls(int text_color, int bg_color)
{
char cmd[100];
system("cls");
sprintf(cmd, "COLOR %x%x", bg_color, text_color);
system(cmd);
}
void Intro()
{
removeCursor(0);
while (1)
{
printf("┌────────────────────────────┐\n");
printf("│ BRICKS RUN │\n");
printf("│ │\n");
printf("│ 하늘에서 떨어지는 │\n");
printf("│ 벽돌들을 피해서 │\n");
printf("│ 최대한 오래 살아남아라! │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ 조작법 │\n");
printf("│ [1P] [2P] │\n");
printf("│ LEFT : 왼쪽 화살표 LEFT : F1 │\n");
printf("│ RIGHT : 오른쪽 화살표 RIGHT : F3키 │\n");
printf("│ │\n");
printf("│ !주의! 1P는 왼쪽 끝, 2P는 오른쪽 끝에서 시작 │\n");
printf("└────────────────────────────┘\n");
Sleep(400);
system("cls");
printf("┌────────────────────────────┐\n");
printf("│ BRICKS RUN │\n");
printf("│ │\n");
printf("│ 하늘에서 떨어지는 │\n");
printf("│ 벽돌들을 피해서 │\n");
printf("│ 최대한 오래 살아남아라! │\n");
printf("│ - Press Any Key To START - │\n");
printf("│ │\n");
printf("│ 조작법 │\n");
printf("│ [1P] [2P] │\n");
printf("│ LEFT : 왼쪽 화살표 LEFT : F1 │\n");
printf("│ RIGHT : 오른쪽 화살표 RIGHT : F3키 │\n");
printf("│ │\n");
printf("│ !주의! 1P는 왼쪽 끝, 2P는 오른쪽 끝에서 시작 │\n");
printf("└────────────────────────────┘\n");
Sleep(400);
system("cls");
if (_kbhit())
break;
}
system("cls");
}
int GameStart()
{
srand((int)malloc(NULL));
char c;
score = 0;
removeCursor(0);
system("cls");
Num_of_Player:
printf("┌────────────────────────────┐\n");
printf("│ │\n");
printf("│ <플레이어 수 선택> │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ ┌──────┐ ┌──────┐ │\n");
printf("│ │ 1Player │ │ 2Player │ │\n");
printf("│ │ │ │ │ │\n");
printf("│ │ Press 1 │ │ Press 2 │ │\n");
printf("│ └──────┘ └──────┘ │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ │\n");
printf("│ │\n");
printf("└────────────────────────────┘\n");
while (1)
{
if (_kbhit())
{
c = _getch();
if (c == 49) {
PrintMap();
return 1;
}
else if (c == 50) {
PrintMap2();
return 0;
}
else
{
system("cls");
goto Num_of_Player;
}
}
}
}
void GameRun()
{
CreateCoins();
while (!(PlayerContainsBricks()))
{
Sleep(100 * AddSpeed);
EraseMap();
CreateBricks();
MoveBricks();
DeleteBricks();
MovePlayer();
PrintMap();
if (PlayerContainsCoin())
{
GetCoin();
CreateCoins();
}
score += 1;
ShowScore();
}
}
void GameRun2()
{
CreateCoins();
player2.x = WIDTH - 1;
while (!(PlayerContainsBricks() || Player2ContainsBricks()))
{
Sleep(100 * AddSpeed);
EraseMap();
CreateBricks();
MoveBricks();
DeleteBricks();
MovePlayer();
MovePlayer2();
PrintMap2();
if (PlayerContainsCoin())
{
GetCoin();
CreateCoins();
}
score += 1;
ShowScore();
}
player.x = 0;
player2.x = WIDTH - 2;
}
void ShowScore()
{
gotoxy(WIDTH + 1, 1);
printf("┌───────┐");
gotoxy(WIDTH + 1, 2);
printf("│SCORE : %05d │", score);
gotoxy(WIDTH + 1, 3);
printf("└───────┘");
}
void CreateCoins()
{
int i;
coin.x = rand() % WIDTH;
}
void GetCoin()
{
score += 100;
}
int PlayerContainsCoin()
{
if (player.x == coin.x)
return TRUE;
else
return FALSE;
if (player2.x == coin.x)
return TRUE;
else
return FALSE;
}
void CreateBricks()
{
int i;
for (i = 0; i < WIDTH; i++)
{
if (!bricks[i].act)
{
bricks[i].x = rand() % WIDTH;
bricks[i].y = HEIGHT + 1;
bricks[i].act = TRUE;
return;
}
}
}
void MoveBricks()
{
int i;
for (i = 0; i < WIDTH; i++)
{
if (bricks[i].act)
{
bricks[i].y--;
}
}
}
void DeleteBricks()
{
int i;
for (i = 0; i < WIDTH; i++)
{
if (bricks[i].act && bricks[i].y < 0)
{
bricks[i].act = FALSE;
}
}
}
int PlayerContainsBricks()
{
int i;
for (i = 0; i < WIDTH; i++)
{
if ((bricks[i].act) && (bricks[i].y == 0) && (bricks[i].x == player.x))
{
for (i = 0; i < WIDTH; i++)
{
bricks[i].act = FALSE;
}
player.x = 0;
return TRUE;
}
}
return FALSE;
}
int Player2ContainsBricks()
{
int i;
for (i = 0; i < WIDTH; i++)
{
if ((bricks[i].act) && (bricks[i].y == 0) && (bricks[i].x == player2.x))
{
for (i = 0; i < WIDTH; i++)
{
bricks[i].act = FALSE;
}
player2.x = WIDTH - 2;
return TRUE;
}
}
return FALSE;
}
void MovePlayer()
{
if (isKeyDown(VK_LEFT))
player.x -= 1;
if (isKeyDown(VK_RIGHT))
player.x += 1;
if (player.x < 0)
player.x = 0;
if (player.x > WIDTH - 1)
player.x = WIDTH - 1;
}
void MovePlayer2()
{
if (isKeyDown(VK_F1))
player2.x -= 1;
if (isKeyDown(VK_F3))
player2.x += 1;
if (player2.x < 0)
player2.x = 0;
if (player2.x > WIDTH - 1)
player2.x = WIDTH - 1;
}
void PrintMap()
{
system("cls");
int i;
for (i = 0; i < WIDTH; i++)
{
if (bricks[i].act)
{
gotoxy(bricks[i].x, HEIGHT - bricks[i].y);
printf("■");
}
}
gotoxy(coin.x, HEIGHT);
printf("%c%c", 0xA8, 0xE7);
gotoxy(player.x, HEIGHT);
printf("%c%c", 0xA1, 0xE3);
gotoxy(0, HEIGHT + 1);
for (i = 0; i < WIDTH; i++)
printf("▤");
}
void PrintMap2()
{
system("cls");
int i;
for (i = 0; i < WIDTH; i++)
{
if (bricks[i].act)
{
gotoxy(bricks[i].x, HEIGHT - bricks[i].y);
printf("■");
}
}
gotoxy(coin.x, HEIGHT);
printf("%c%c", 0xA8, 0xE7);
gotoxy(player.x, HEIGHT);
printf("%c%c", 0xA1, 0xE3);
gotoxy(player2.x, HEIGHT);
printf("%c%c", 0xA1, 0xE2);
gotoxy(0, HEIGHT + 1);
for (i = 0; i < WIDTH; i++)
printf("▤");
}
void EraseMap()
{
int i;
gotoxy(coin.x, HEIGHT);
printf(" ");
gotoxy(player.x, HEIGHT);
printf(" ");
}
void EraseMap2()
{
int i;
gotoxy(coin.x, HEIGHT);
printf(" ");
gotoxy(player.x, HEIGHT);
printf(" ");
gotoxy(player2.x, HEIGHT);
printf(" ");
}
void GameOver()
{
int i;
system("cls");
removeCursor(1);
gotoxy(WIDTH / 3, HEIGHT / 3);
printf("┌──────────────────────┐");
gotoxy(WIDTH / 3, (HEIGHT / 3) + 1);
printf("│ │");
gotoxy(WIDTH / 3, (HEIGHT / 3) + 2);
printf("│ GAME OVER │");
gotoxy(WIDTH / 3, (HEIGHT / 3) + 3);
printf("│ ENTER THE NAME : │");
gotoxy(WIDTH / 3, (HEIGHT / 3) + 4);
printf("│ │");
gotoxy(WIDTH / 3, (HEIGHT / 3) + 5);
printf("└──────────────────────┘");
gotoxy((WIDTH / 3) + 15, (HEIGHT / 3) + 3);
scanf("%s", name);
if (name[0] == 0)
strcpy(name, "UNKNOWN");
}
int Result()
{
PlayerData data_array[100] = { 0 };
PlayerData data;
FILE* ifile;
FILE* ofile;
int i, j;
char c;
strcpy(data.name, name);
data.score = score;
ofile = fopen("player_data.txt", "a");
system("cls");
fprintf(ofile, "%s %d\n", data.name, data.score);
fclose(ofile);
ifile = fopen("player_data.txt", "r");
for (i = 0; !feof(ifile); i++)
{
fscanf(ifile, "%s %d", &data_array[i].name, &data_array[i].score);
}
fclose(ifile);
i -= 2;
qsort(data_array, i + 1, sizeof(PlayerData), SortData);
printf(" NAME\t\t SCORE\n");
printf("================================================\n");
for (j = 0; j <= i; j++)
{
printf("%2d %-13s %05d\n", j + 1, data_array[j].name, data_array[j].score);
}
removeCursor(0);
printf("\n");
printf("다시 하시겠습니까? (O/X)");
while (1)
{
if (_kbhit())
{
c = _getch();
if ((c == 79) || (c == 111)) {
return TRUE;
}
else if ((c == 88) || (c == 120)) {
return FALSE;
}
else
{
Sleep(400);
}
}
}
}
int SortData(const void* a, const void* b)
{
const PlayerData* c = (PlayerData*)a;
const PlayerData* d = (PlayerData*)b;
return d->score - c->score;
}
1. 제목 : Bricks Run (벽돌 피하기)
2. 기능 :
(1) 인트로 화면, 아무 키나 누르면 넘어감
(2) 1, 2인 Play 선택 가능 (1P : 방향키, 2P : F1 F3키 이용)
(3) 1을 누르면 1P, 2를 누르면 2P 모드 선택 (다른 버튼 누를 시 그대로 대기)
(4) 플레이어 수 설정 후 바로 플레이 시작
(5) 1P는 왼쪽 끝, 2P는 오른쪽 끝에서 시작
(6) 생존하는 시간 동안 점수 증가, AddSpeed변수로 벽돌 속도 증가
(7) 랜덤한 위치에 생성되는 코인 획득 시 점수 100점 증가
(8) 떨어지는 벽돌에 닿을 시 게임 오버
(9) 2P 모드의 경우, 둘 중 하나라도 벽돌에 닿으면 게임 오버
(11) 게임 오버 창에서 이름 입력
(12) 이름 입력 후 이전 플레이어와 점수가 기록된 순위표 확인
(13) o 입력 시 다시 1P 2P 선택 창으로 이동, x 입력 시 게임 종료
3. 실행 화면
<1Player 선택 시>
<2Player 선택 시>
<게임 오버>
<o입력 시>
<x입력 시>
728x90
반응형
LIST
'Project' 카테고리의 다른 글
Todo리스트_JavaScript/HTML/CSS (2) | 2023.08.31 |
---|---|
넷플릭스 화면 디자인_HTML/CSS (0) | 2023.08.30 |
혼밥러 탈출을 위한 매칭 & 키오스크 서비스 (0) | 2023.08.22 |
Java swing kiosk project (4) | 2022.01.09 |
@kdj :: Childev'note
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!