파일분할된거 걍 한군데다 복붙해논거임



게임오버만 구현 안돼있음  


처음 게임짜본거니 극혐코딩이라도 이해점 ㅋㅋ





#ifndef __HEADER_H__

#define __HEADER_H__


#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<Windows.h>

#include<string.h>

#include<stdlib.h>

#include<time.h>


#define LEFT   75      // 좌측방향키

#define RIGHT  77      // 우측방향키

#define UP     72      // 위쪽방향키

#define DOWN   80   // 아래방향키

#define SPACE  32   // 스페이스바


#define DELAY  300


#define X (p->x)

#define Y (p->y)


#define RIGHT_BOUND 11

#define FLOOR_BOUND 20


int pix[22][12];


typedef struct

{

int x, y;

}XYPOS;


typedef struct

{

int **block;//2원배열 블록 동적할당을 위함.

int Xlen;

int Ylen;

}Block;


#endif


#ifndef __CHECK_SHOCK_H__

#define __CHECK_SHOCK_H__


int CheckShockLeft(XYPOS *,Block);

int CheckShockRight(XYPOS *, Block);

int CheckShockDown(XYPOS *, Block);

int CheckShockSuperDown(XYPOS *, Block);

int CheckShockTurn(XYPOS *, Block);

int CheckShockLeftTurn(XYPOS *, Block);

int CheckShockRightTurn(XYPOS *, Block);

int CheckShock4dLeftTurn(XYPOS *, Block);

int CheckShock4dRightTurn(XYPOS *, Block);


#endif


#ifndef __MAKING_BLOCK_H__

#define __MAKING_BLOCK_H__


void MakeCrossBlock(void);

void MakeSquareBlock(void);

void MakeStickBlock(void);

void MakeNNBlock(void);

void MakeRNBlock(void);

void MakeLLBlock(void);

void MakeRLBlock(void);


#endif


#ifndef __MOVING_H__

#define __MOVING_H__


void MoveSuperDown(XYPOS*, Block);

void MoveDown(XYPOS*, Block);

void MoveLeft(XYPOS*, Block);

void MoveRight(XYPOS*, Block);

void Move3dTurn(XYPOS*, Block);

void Move3dTurnSwap(XYPOS*, Block, int*);

void Move4dTurn(XYPOS*, Block);

void Move4dTurnSwap(XYPOS*, Block, int*);


#endif


#ifndef __PRINT_FUNCTION_H__

#define __PRINT_FUNCTION_H__


void InitializeScreen(void);

void PrintAllScreen(void);

void DeleteLine(void);


#endif







#include "Header.h"

#include "CheckShock.h"

#include "MakingBlock.h"

#include "Moving.h"

#include "Printfunc.h"


int main(void)

{

int selectBlock;

InitializeScreen();

PrintAllScreen();


while (!_kbhit())

{

if (_getch())

break;

}


while (1)

{

srand((int)time(NULL));

switch (selectBlock = rand() % 7)

{

case 1:

MakeSquareBlock();

break;

case 2:

MakeCrossBlock();

break;

case 3:

MakeStickBlock();

break;

case 4:

MakeNNBlock();

break;

case 5:

MakeRNBlock();

break;

case 6:

MakeLLBlock();

break;

case 0:

MakeRLBlock();

break;

}

DeleteLine();

}


putchar('\n');

return 0;

}








#include "Header.h"

#include "Printfunc.h"

#include "Moving.h"

#include "CheckShock.h"


void MakeCrossBlock(void)

{

int i, j;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);

X = -2;

Y = 4; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 3);

c.block[0] = (int*)malloc(sizeof(int) * 3);

c.block[1] = (int*)malloc(sizeof(int) * 3);

c.block[2] = (int*)malloc(sizeof(int) * 3);//배열할당


c.block[0][0] = 0; c.block[0][1] = 1; c.block[0][2] = 0;

c.block[1][0] = 1; c.block[1][1] = 1; c.block[1][2] = 1;

c.block[2][0] = 0; c.block[2][1] = 0; c.block[2][2] = 0;

c.Xlen = 3;

c.Ylen = 3;

// {0,1,0}

// {1,1,1}

// {0,0,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for ( ; X < DOWN; )

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move3dTurn(p, c);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block[2]);

free(c.block);

free(p);

}

void MakeSquareBlock(void)

{

int i, j;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);

X = -2;

Y = 5; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 2);

c.block[0] = (int*)malloc(sizeof(int) * 2);

c.block[1] = (int*)malloc(sizeof(int) * 2);

//배열할당


c.block[0][0] = 1; c.block[0][1] = 1;

c.block[1][0] = 1; c.block[1][1] = 1;


c.Xlen = 2;

c.Ylen = 2;

// {0,1,0}

// {1,1,1}

// {0,0,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block);

free(p);

}

void MakeNNBlock(void)

{

int i, j;

int turnSwap = 0;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);


X = -3;

Y = 5; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 3);

c.block[0] = (int*)malloc(sizeof(int) * 3);

c.block[1] = (int*)malloc(sizeof(int) * 3);

c.block[2] = (int*)malloc(sizeof(int) * 3);//배열할당


c.block[0][0] = 1; c.block[0][1] = 0; c.block[0][2] = 0;

c.block[1][0] = 1; c.block[1][1] = 1; c.block[1][2] = 0;

c.block[2][0] = 0; c.block[2][1] = 1; c.block[2][2] = 0;


c.Xlen = 3;

c.Ylen = 3;

// {1,0,0}

// {1,1,0}

// {0,1,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move3dTurnSwap(p, c, &turnSwap);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block[2]);

free(c.block);

free(p);

}

void MakeRNBlock(void)

{

int i, j;

int turnSwap = 0;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);


X = -3;

Y = 4; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 3);

c.block[0] = (int*)malloc(sizeof(int) * 3);

c.block[1] = (int*)malloc(sizeof(int) * 3);

c.block[2] = (int*)malloc(sizeof(int) * 3);//배열할당


c.block[0][0] = 0; c.block[0][1] = 0; c.block[0][2] = 1;

c.block[1][0] = 0; c.block[1][1] = 1; c.block[1][2] = 1;

c.block[2][0] = 0; c.block[2][1] = 1; c.block[2][2] = 0;


c.Xlen = 3;

c.Ylen = 3;

// {0,0,1}

// {0,1,1}

// {0,1,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move3dTurnSwap(p, c, &turnSwap);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block[2]);

free(c.block);

free(p);

}

void MakeLLBlock(void)

{

int i, j;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);


X = -3;

Y = 4; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 4);

c.block[0] = (int*)malloc(sizeof(int) * 4);

c.block[1] = (int*)malloc(sizeof(int) * 4);

c.block[2] = (int*)malloc(sizeof(int) * 4);

c.block[3] = (int*)malloc(sizeof(int) * 4);//배열할당


c.block[0][0] = 0; c.block[0][1] = 1; c.block[0][2] = 0; c.block[0][3] = 0;

c.block[1][0] = 0; c.block[1][1] = 1; c.block[1][2] = 0; c.block[1][3] = 0;

c.block[2][0] = 0; c.block[2][1] = 1; c.block[2][2] = 1; c.block[2][3] = 0;

c.block[3][0] = 0; c.block[3][1] = 0; c.block[3][2] = 0; c.block[3][3] = 0;

c.Xlen = 4;

c.Ylen = 4;

// {0,1,0,0}

// {0,1,0,0}

// {0,1,1,0}

// {0,0,0,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move4dTurn(p, c);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block[2]);

free(c.block[3]);

free(c.block);

free(p);

}

void MakeRLBlock(void)

{

int i, j;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);


X = -3;

Y = 4; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 4);

c.block[0] = (int*)malloc(sizeof(int) * 4);

c.block[1] = (int*)malloc(sizeof(int) * 4);

c.block[2] = (int*)malloc(sizeof(int) * 4);

c.block[3] = (int*)malloc(sizeof(int) * 4);//배열할당


c.block[0][0] = 0; c.block[0][1] = 0; c.block[0][2] = 1; c.block[0][3] = 0;

c.block[1][0] = 0; c.block[1][1] = 0; c.block[1][2] = 1; c.block[1][3] = 0;

c.block[2][0] = 0; c.block[2][1] = 1; c.block[2][2] = 1; c.block[2][3] = 0;

c.block[3][0] = 0; c.block[3][1] = 0; c.block[3][2] = 0; c.block[3][3] = 0;

c.Xlen = 4;

c.Ylen = 4;

// {0,0,1,0}

// {0,0,1,0}

// {0,1,1,0}

// {0,0,0,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move4dTurn(p, c);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록 한칸아래 생성


Sleep(DELAY);//중력 딜레이

system("cls");

PrintAllScreen();

}

else

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] == 1)

pix[X + i][Y + j] = -2;

}

}//블록 고정

break;

}

}//중력


free(c.block[0]);

free(c.block[1]);

free(c.block[2]);

free(c.block[3]);

free(c.block);

free(p);

}

void MakeStickBlock(void)

{

int i, j;

int turnSwap = 0;

XYPOS * p = (XYPOS*)malloc(sizeof(XYPOS) * 1);

X = -4;

Y = 4; //좌표초기화


Block c;

c.block = (int**)malloc(sizeof(int) * 4);

c.block[0] = (int*)malloc(sizeof(int) * 4);

c.block[1] = (int*)malloc(sizeof(int) * 4);

c.block[2] = (int*)malloc(sizeof(int) * 4);

  c.block[3] = (int*)malloc(sizeof(int) * 4);//배열할당


c.block[0][0] = 0; c.block[0][1] = 1; c.block[0][2] = 0; c.block[0][3] = 0;

c.block[1][0] = 0; c.block[1][1] = 1; c.block[1][2] = 0; c.block[1][3] = 0;

c.block[2][0] = 0; c.block[2][1] = 1; c.block[2][2] = 0; c.block[2][3] = 0;

c.block[3][0] = 0; c.block[3][1] = 1; c.block[3][2] = 0; c.block[3][3] = 0;

c.Xlen = 4;

c.Ylen = 4;

// {0,1,0,0}

// {0,1,0,0}

// {0,1,0,0}

// {0,1,0,0}

//블록 형태지정 및 배열길이정보 입력


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}

}//블록의 형태를 좌표에 삽입


system("cls");

PrintAllScreen();




for (; X < DOWN;)

{

if (_kbhit())

{

switch (_getch())

{

case DOWN:

MoveDown(p, c);

break;

case LEFT:

MoveLeft(p, c);

break;

case RIGHT:

MoveRight(p, c);

break;

case UP:

Move4dTurnSwap(p, c, &turnSwap);

break;

case SPACE:

MoveSuperDown(p, c);

break;

}

}



else if (CheckShockDown(p, c) == 1) //바닥충돌검사 & 중력

{

for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = 0;

}

}//블록 제거


X++;


for (i = 0; i < c.Xlen; i++)

{

for (j = 0; j < c.Ylen; j++)

{

if (pix[X + i][Y + j] >= 0)

pix[X + i][Y + j] = c.block[i][j];

}