파일분할된거 걍 한군데다 복붙해논거임
게임오버만 구현 안돼있음
처음 게임짜본거니 극혐코딩이라도 이해점 ㅋㅋ
#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];
}
코드가너무길어서 다안들어가노;
재미 느낄 때 더더더더 해보시라능.. 테트리스 했으니까 이번엔 슈팅게임 어때
아예 다르지는 않겠지만 슈팅게임은 한 화면에 등장하는 물체들이 많고 + 그 물체들이 쏘는 총알들을 생각하면 더 재미있게 할 수 있을듯... 코드는 자세히 보지 않았지만 저렇게 다 함수로 최대한 나누려고 하는 것만으로도 충분한듯 더더 해보셈
pastebin에 올려서 주소 알려주세요. 디씨는 게시판이 틀려 먹은 게 \n 같은 거 쓰면 n 으로 바꿔 버려서 소스 올려도 의미 없음.
http://pastebin.com/4tWZUKzk
다음에는 C++로 만들어볼건데 아직 실시간처리를 제대로 할줄몰라서 슈팅게임이 가능할진모르겠음; 한번도전은해봐야지 ㅋㅋ
슈팅게임이면 간단한 AI? 도 들어가는거 아닌가 ㅋㅋ 난이도 급상승하겟네
ㅋㅋ 그 책중에 슈팅게임알고리즘 이라고 일본 슈팅게임쪽의 거장(?) 비슷한 아저씨가 쓴거 있는데 관심있으면 봐바
코드 읽어봤는데 회전 버그 100% 있다. 역시 버그 없는 테트리스 짰을 리가 없지... 내가 조언한 대로 블럭을 맵 배열에 쓰는 건 내려놨을 때만 쓰고 그 전 까지는 블럭의 종류와 블럭의 좌표, 각도로부터 그냥 화면 상으로만 블럭을 표시하는 구조로 바꿔라. 지금 코드는 회전 버그 있음.
간단히 설명해서 ㅗ 블럭이 닿기 직전에 회전하면 회전이 가능하다고 판단될 경우 ㅗ 밑의 바로 세 칸의 블럭이 소실됨. 물론 회전이 가능할 경우에 말이야.
근데 CheckShock 코드는 왜 안 올림? 그걸 올려야 화길히 버그가 있는지 알 수 있는데.
화길히 => 확실히
내가생각하기엔 버그 절대 없는데 ㅋㅋㅋ checkshock 올려줄게 기달
버그있네 ㅋㅋㅋㅋㅋㅋ 미안 깝쳣다 땅에닿기진적에 돌리면 이상해져 ㅠ