zerofunc

프로젝트 1- 푸쉬푸쉬게임 본문

IT/프로젝트

프로젝트 1- 푸쉬푸쉬게임

0penster 2013. 11. 30. 00:22

이 프로젝트를 시작으로 내가 했었던

큰 프로젝트들을 올릴것이다.

이 프로젝트는 바로 어렸을때 아빠, 엄마 폰으로하던 추억의 '푸쉬푸쉬' 게임이다!

이걸 만들게 된 이유는 기능반 때문인데

기능반에서 1차를 떨어졌지만 2차과제로 하루만에 푸쉬푸쉬 게임을 만드는 것이었다.

이걸 만드느라 12시간 동안 코딩해서 허리가 뿌러질뻔했다.

다행히 2차를 합격해서 지금은 기능반에서 코딩을하며 노예로 지내는중이다 ^오^


시작전

* 알아야할것

enum, 함수, 매크로 함수, 전역변수 - 지역변수의 개념, API함수, 이중배열

#pragma once

#include <stdio.h>

#include <conio.h>

#include <Windows.h>

#include <time.h>

 

#define ESC 27

#define LEFT 75

#define RIGHT 77

#define UP 72

#define DOWN 80

 

enum {//색깔의 상수화

BLACK,

D_BLUE,

D_GREEN,

D_SKYBLUE,

D_RED,

D_VIOLET,

D_YELLOW,

GRAY,

D_GRAY,

BLUE,

GREEN,

SKYBLUE,

RED,

VIOLET,

YELLOW,

WHITE,

};

 

//전역변수 선언

int g_PX,g_PY;//캐릭터위치

int g_step;//걸음

int g_push; //공움직인횟수

int g_Box;//박스안에넣은양

int Menu_Flag=1;

char map[14][20]= {//

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,2,0,0,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,0,0,2,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,0,0,2,0,2,0,1,1,1,1,1,1,1,1,1,1},

{1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1},

{1,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,3,3,1},

{1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,3,3,1},

{1,1,1,1,1,0,1,1,1,0,1,5,1,1,0,0,3,3,1},

{1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

};//

char r_map[14][20]={};

//함수선언

void SetColor(int,int); //색표현

void SetCursor(bool); //커서 표시

void gotoxy(int,int);//좌표이동

void Map();//맵

void PlayerEraser();//플레이어 지우기

void PlayerDraw();//플레이어 그리기

void PlayerAction();//플레이어 이동

void MapDraw(int,int);//맵 그리기

void ClearMessage();//게임 끝 

int StageClearCheck(void);//스테이지 끝났는지 체크

void BarDraw();// 메뉴바

void INTRO();//인트로 화면

void Copy();//맵 복사

//main

void main(){

system("mode con: cols=70 lines=22"); //콘솔창크기

SetCursor(false);

Copy();

while(1){

 

if(Menu_Flag) {INTRO();};

PlayerAction();

BarDraw();

if(StageClearCheck()){

ClearMessage();

 

}

}

}

 

 

//함수정의

void SetColor(int color , int bgcolor ) //텍스트 색깔 바꾸는 함수

{

color &= 0xf;

bgcolor &= 0xf ;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (bgcolor << 4) | color );

}

 

void SetCursor(bool bVisible) //커서를 숨기거나 보여주는 함수

{

CONSOLE_CURSOR_INFO ConsoleCursor;

ConsoleCursor.bVisible = bVisible // true 보임, false 안보임

ConsoleCursor.dwSize = 1; // 커서사이즈

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ConsoleCursor); // 설정

}

 

void gotoxy(int x,int y){//커서위치

COORD Cur;

Cur .X=x*2;//가로 두배

Cur .Y=y

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);

}

void Copy(){ //맵복사

int x,y;

for(y=0;y<14;y++){

for(x=0;x<20;x++){

r_map[y][x] = map[y][x];

}

}

}

void INTRO(){

 

int x=12,y=3;

g_PX=11,g_PY=10;//캐릭터위치

g_step=0;//걸음

g_push=0; //공움직인횟수

g_Box=0;//박스안에넣은양

int x_,y_; //맵초기화

for(y_=0;y_<14;y_++){

for(x_=0;x_<20;x_++){

map[y_][x_] = r_map[y_][x_];

}

}

system("cls");

SetColor(YELLOW,0);

gotoxy(x,y);printf("┌─────────┐");

gotoxy(x,y+1); printf("P U S H P U S H ");

gotoxy(x,y+2); printf("└─────────┘");

SetColor(BLUE,0);

gotoxy(x,y+15);

printf("Welcome to PUSH PUSH !!");

SetColor(15,0);

gotoxy(x+2,y+16);

printf("Press And Key...");

getch();

system("cls");

Menu_Flag=0;

PlayerDraw();

Map();

 

}

void BarDraw(){

int x =23;

int y =0;

SetColor(YELLOW,0);

gotoxy(x,y);printf("┌────────┐");

gotoxy(x,y+1); printf("P U S H P U S H");

gotoxy(x,y+2); printf("└────────┘");

SetColor(YELLOW,0);

gotoxy(x, 6); printf("M O V E : %d", g_step); //플레이어 움직인 횟수

gotoxy(x, 7); printf("P U S H : %d", g_push); //박스 움직인 횟수

gotoxy(x,8); printf("C L E A R : %d",g_Box);

SetColor(10,0);

gotoxy(x, 13); puts(": UP");

gotoxy(x, 14); puts(": DOWN");

gotoxy(x, 15); puts(": LEFT"); //각종 키 설명

gotoxy(x, 16); puts(": RIGHT");

gotoxy(x, 17); puts("ESC : MENU");

}

void Map(){

int x,y;

 

//플레이어 시작위치 10,11

for(y=0;y<14;y++){

for(x=0;x<20;x++){

gotoxy(x,y);

MapDraw(x,y);

}

}

 

}

int StageClearCheck(void) //스테이지 클리어 확인

{

if(g_Box==6)

return 1;

else

return 0;

}

void ClearMessage(){ //게임클리어시

char ch;

SetColor(YELLOW,0);

gotoxy(2,10);

Sleep(15);

printf(" S");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" T");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" A");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" G");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" E");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" C");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" L");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" E");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" A");

Sleep(15);

SetColor(rand()%14+1,0);

printf(" R");

Sleep(15);

printf(" !");

Sleep(50);

gotoxy(1,19);

printf("게임을 종료하시겠습니까? (y/n)");

ch=getch();

switch (ch)

{

case 'y' :

exit(0);

break

case 'n' :

Menu_Flag=1;

break

default:

break

}

getch();

}

void MapDraw(int x, int y){ //맵그리기

char data;

data = map[y][x];

switch(data){

case 0://0빈칸 123목표 4채워진목표

SetColor(BLACK,0);

printf(" ");

break

case 1 :

SetColor(D_SKYBLUE,0);

printf("");

break

case 2:

SetColor(GREEN,0);

printf("");

 

break

case 3:

SetColor(YELLOW,0);

printf("");

break

case 4:

SetColor(GREEN,0);

printf("");

default:

break

 

}

}

 

void PlayerDraw(){//플레이어 그리기

gotoxy(g_PX,g_PY);

SetColor(RED,0);

printf("");

}

 

void PlayerEraser(){ //플레이어 흔적지우기

gotoxy(g_PX,g_PY);

printf(" ");

}

void PlayerAction(){ //플레이어의 움직임을 계산하는 함수

int dx=0, dy=0;

bool tab_block=false

char dir;

if(kbhit()){

dir=getch();

switch (dir)

{

case ESC :

system("cls");

Menu_Flag=1; //메뉴로감

break

case LEFT :

dx--;

break

case RIGHT :

dx++;

break

case UP :

dy--;

break

case DOWN :

dy++;

break

default :

break

}

if(map[g_PY+dy][g_PX+dx]!=1 ){//앞이벽이아니고

if(map[g_PY+dy][g_PX+dx]==2){//앞이공일때

if(map[g_PY+dy*2][g_PX+dx*2] ==0 || map[g_PY+dy*2][g_PX+dx*2] ==3){ // 빈곳이거나 빈목표일때

 

//앞앞에 공을 만듬

if(map[g_PY+dy*2][g_PX+dx*2]==3){ //앞이 공이고 앞앞이 목표일땐

 

map[g_PY+dy*2][g_PX+dx*2]=4;//앞앞에 채워진목표를그리고

g_Box++;

map[g_PY + dy][g_PX + dx] = 0;//앞에 빈칸을그린다

}

else{//앞이 공이고 앞앞이 빈곳일때

map[g_PY + dy*2][g_PX + dx*2] = 2;//앞앞에 고을그리고

map[g_PY + dy][g_PX + dx] = 0;//앞은 빈칸

}

 

g_push++;

}

else return

}

 

else if(map[g_PY+dy][g_PX+dx]==4){ //앞이 체워진목표이고

if (map[g_PY + dy*2][g_PX + dx*2] == 0){//앞앞이빈곳일때;

map[g_PY + dy*2][g_PX + dx*2] = 2;//앞앞에 공을두고

map[g_PY + dy][g_PX + dx] = 3;//앞에 목표를둔다

}

else if(map[g_PY + dy*2][g_PX + dx*2]==3){ //앞앞이목표일때

map[g_PY + dy*2][g_PX + dx*2] = 4;//앞앞에 채워진목표를두고

map[g_PY + dy][g_PX + dx] = 3;//앞은 목표를둔다

}

else return

g_push++;

}

Map();//맵을 다시그림

PlayerEraser();

if(dx||dy){

g_step++; //걸음수

g_PX += dx; //이동

g_PY += dy;}

PlayerDraw();

}

else {

if(map[g_PY + dy][g_PX + dx]!=2){//벽이면 리턴

}

 

return

}


}

 

 

}


한번한번 프로젝트를 할때마다 느끼는 거지만 아직 배울것도 많다는 것과

오류 하나하나 고칠때마다 실력이 쌓이는걸 몸으로 느끼고

나도 이런걸 할수 있구나 하고 자신감이 생긴다.

이번 프로젝트를 시작으로 점점 큰 프로젝트들을 진행할 예정이다

 

'IT > 프로젝트' 카테고리의 다른 글

프로젝트 3 - 공튀기기  (0) 2013.11.30
프로젝트 2 - 도서목록  (0) 2013.11.30
Comments