28
테트리스 대전 플랫폼 V1.0 ©2014 STKim & Nerrtica in CAUCSE All rights reserved.

테트리스 플랫폼 V1.0

  • Upload
    -

  • View
    227

  • Download
    3

Embed Size (px)

Citation preview

Page 1: 테트리스 플랫폼 V1.0

테트리스대전플랫폼 V1.0

©2014 STKim & Nerrtica in CAUCSE

All rights reserved.

Page 2: 테트리스 플랫폼 V1.0

개요

대전형테트리스플랫폼은자동형테트리스플레이어구현을위해만들어진플랫폼이다.

이플랫폼은관리모듈과가상플레이어로구성되어있다.

Page 3: 테트리스 플랫폼 V1.0

테트리스대전플랫폼 테트리스플랫폼은다음의파일로구성된다.

TetrisBattlePlatform.c : 두함수를호출하면서테트리스게임이진행되도록도와주는메인플랫폼소스(관리모듈)

Tetrisbattle.h : 개발에필요한헤더파일로, 함수프로토타입선언과몇가지정의가있다.

다음의세개의파일에는각각 A_Player ( ) 함수가정의되어있다. PlayerRand.c (랜덤하게블록을둔다)

PlayerEasy.obj (똑똑이)

PlayerHard.obj (지니어스)

소스를보호하기위하여 PlayerEasy.c, PlayerHard.c 는제공되지않는다.

PlayerRand, PlayerEasy, PlayerHard 중하나만프로젝트에포함시켜야한다. 세개모두같은함수로정의되어있기때문이다.

Page 4: 테트리스 플랫폼 V1.0

개발환경구축하기

제공된소스또는 obj 파일로프로젝트를생성한다.

빈프로젝트를만든다.

TetrisBattlePlatform.c 와PlayerRand.c(A_Player) 파일을프로젝트안에넣는다.

자신의함수(B_Player)를추가할소스코드를추가한다. 이소스코드는 tetrisbattle.h 파일을include 해야한다.

Page 5: 테트리스 플랫폼 V1.0

가상플레이어가상플레이어는모두 3개가제공된다.

PlayerRand (랜덤하게둠)

PlayerEasy (괜찮음)

PlayerHard (잘함)

PlayerRand는이해를위해넣은것이므로대결할필요는없다.

PlayerEasy도생각보다잘한다. PlayerEasy을이기면 PlayerHard와대결한다.

PlayerHard도이기면 PlayerMania를개별적으로제공받을수있다.

Page 6: 테트리스 플랫폼 V1.0

모듈인터페이스

A_Player ( ) 는왼쪽에서테트리스를수행하며, B_Player( ) 는오른쪽에서수행한다.

따라서컴퓨터가왼쪽에서, 내가만든모듈이오른쪽에서진행한다고가정한다.

그래서제공되는모듈은모두 A_Player 함수로정의되어있고, 학생이만드는모듈은B_Player( ) 함수로정의하여만들면된다.

B_Player( ) 함수는 PlayerRand.c 의소스코드를참고한다.

Page 7: 테트리스 플랫폼 V1.0

모듈인터페이스모듈인터페이스

void B_Player (char tetrisBoard[25][12], int thisBlock, intnextBlock, int stage, int* location, int* rotation)

tetrisBoard : 현재의전체블록현황 thisBlock : 현재선택된블록의모양(내려오는것)

nextBlock : 다음번에나올블록을미리보여줌Stage2부터는다음턴의블록을알려주지않으므로, nextBlock의값이 -1로제공된다.

stage : 스테이지(1~3의값)

location : 리턴하는블록의위치 rotation : 리턴하는블록의회전상태

Page 8: 테트리스 플랫폼 V1.0

모듈인터페이스

tetrisBoard : 플레이어의현재블록판상태. 복사된값이기때문에바꿔도실제게임판에는적용되지않는다.

테트리스판의크기인 20*10보다배열의크기가크다.

이는알고리즘을예외처리없이편하게짜기위함이다.

tetrisBoard 배열의구성은다음페이지에그림으로설명되어있다.

Page 9: 테트리스 플랫폼 V1.0

테트리스대전

. . .

양사이드와바닥은 1로채워져있다.

[24][0]

[4][0]

실제화면에보이는부분,

실제로플레이하는부분

게임오버판정을수월하게하기위한빈부분.

화면에는출력되지않는다.

(*location) == 0

Page 10: 테트리스 플랫폼 V1.0

모듈인터페이스

모듈인터페이스

void Player_1 (char tetrisBoard[25][12], int thisBlock,

int nextBlock, int stage, int* location, int* rotation)

thisBlock : 현재선택된블록의모양(내려오는것)

nextBlock : 다음번에나올블록을미리보여줌 (이를활용하면더똑똑해짐)

블록의종류와값은다음과같다.

블록의값은각각0 1 2 3

4 5 6

이다.

Page 11: 테트리스 플랫폼 V1.0

모듈인터페이스

현재스테이지 스테이지는총 3종류이며, 시간이지날수록어려워진다.

1 스테이지(400블록) : 가장기본적인모드이다.

2 스테이지(300블록) : 다음턴의블록값을알려주지않는다.

3 스테이지(300블록) : 바닥에서 5턴마다한줄씩블록이올라온다.

스테이지3의빈칸의위치는랜덤하게정해진다.

Page 12: 테트리스 플랫폼 V1.0

모듈인터페이스

location : 블록을놓을위치.

0~9 사이의값을넣어야한다. 가장왼쪽을 1로하지않게주의한다. (전페이지그림참고)

rotation : 블록의회전값.

location과 rotation의값을함수내에서계산하여리턴해야한다.

Page 13: 테트리스 플랫폼 V1.0

모듈인터페이스

Player 함수가리턴해야하는값은다음과같다. 블록을놓을위치 (X좌표)

위치의기준은각블록의제일왼쪽으로한다.

블록의위치는배열을벗어나서는안된다.

블록의위치가배열을벗어날경우관리모듈에서임의로블록의위치를변경할수있다.

Page 14: 테트리스 플랫폼 V1.0

모듈인터페이스

블록의회전여부

각블록의회전상태와값은

오른쪽그림과같다.

회전값이 0~3을벗어났을경우,

관리모듈에서임의로회전값을

변경할수있다.

회전했을경우에도마찬가지로

위치의기준은블록의가장왼쪽

으로한다.

(그림의검정빈칸은신경쓰지

않아도된다.)

0 1 2 3

Page 15: 테트리스 플랫폼 V1.0

관리모듈

TetrisBattlePlatform.c

최종적으로는, 만들어진두플레이어를관리모듈에넣고대전을하게된다.

이때, 관리모듈은양플레이어에게공평하게똑같은블록을던진다.

관리모듈A 플레이어 B 플레이어

Page 16: 테트리스 플랫폼 V1.0

관리모듈

테트리스판의크기는가로 10 * 세로 20이다.

관리모듈의판정순서는다음과같다.

블록을입력된위치에놓는다.

완성된줄을삭제한다.

테트리스판위쪽으로벗어난블록이있다면, 해당플레이어는게임오버된다.

한줄을완성할경우해당줄이삭제되며점수가주어된다.

한번에여러줄을삭제할경우추가점수가주어진다.

여러번연속으로줄을삭제할경우에는콤보가쌓이며, 콤보수에비례하여추가점수가주어진다.

Page 17: 테트리스 플랫폼 V1.0

관리모듈

게임오버판별

완성된줄을삭제하는판정이끝난후, 테트리스판의제일윗줄을벗어난블록이있다면게임오버로판단한다.

실제화면에는보이지않음

Page 18: 테트리스 플랫폼 V1.0

관리모듈

승패판별 3 스테이지가모두종료되거나, 두플레이어가모두게임오버된시점에양쪽의점수를비교한다.

점수가높은쪽이승리하게된다.

점수공식 현재점수 score, 이번턴에없앤줄의수 line, 콤보수

combo

𝑠𝑐𝑜𝑟𝑒 +=𝑙𝑖𝑛𝑒(𝑙𝑖𝑛𝑒+1)

2× 𝑐𝑜𝑚𝑏𝑜

한꺼번에줄을많이없애거나콤보를이을수록높은점수를얻을수있지만, 그만큼위험성이높아짐.

안정성 VS 고득점

Page 19: 테트리스 플랫폼 V1.0

관리모듈

다음과같은상황은불가능하다.

블록의 X좌표만입력받아바닥을만날때까지단순히아래로내려가기만하므로, 소위말하는끼워넣기, Wall-Kick(T스핀류) 등은불가능하다.

이번턴의블록

Page 20: 테트리스 플랫폼 V1.0

관리모듈

블록이나오는것은완벽한랜덤이아니다.

각종류의테트리스블록이각 1개씩, 총 7개가들어있는가방에서블록을꺼내는방식이라고생각하면된다.

7종류의블록이한번씩나오면, 블록을가방에넣고다시뽑는다.

이런방식으로어느정도의공정함을보장한다.

블록순서의경우의수= 7!

Page 21: 테트리스 플랫폼 V1.0

관리모듈

관리모듈은다음과같이출력한다.

호출결과를상단에표시한다.

블록의상태를표시한다.

가장마지막에내린블록은점선블록으로표시한다.

양쪽의현재스코어를표시한다.

Page 22: 테트리스 플랫폼 V1.0

가상플레이어

자신이 PlayerRand을이길수있다면다음레벨의플레이어와대결해야한다.

이를위하여다음과같이한다.

PlayerRand.c 를제거한다.

더높은 player의 obj 파일을프로젝트에추가한다.

Page 23: 테트리스 플랫폼 V1.0

대전

두사람이대전을할경우

한사람은 A_Player ( )로, 다른사람은B_Player ( )로한다. 다른이름으로하더라도무관하며, 이때에는관리모듈의함수호출부분을수정해야한다.

두사람의 obj 파일을가져와프로젝트에합친다.

실행하고결과를기록한다.

Page 24: 테트리스 플랫폼 V1.0

대전

비정상종료메모리등의문제로모듈이비정상종료할때패배로기록한다.

누구때문에비정상종료했는지는다음을확인한다.A_Player( ) 함수를호출하기전에 “A Start”를, 호출한후에 “A End”를화면에표시한다. B도마찬가지이다.

따라서 A Start 만있고 A End가없으면 A_Player 때문에비정상종료한것이다. B도마찬가지이다.

5턴이내에프로그램이비정상종료되면무효로한다.(대결불가)

Page 25: 테트리스 플랫폼 V1.0

개발용모드

본인의플레이어함수의테스트를위해다음과같은것들이주어진다.(tetrisbattle.h 참조) 예제플레이어함수

상대플레이어에해당함수를넣고테스트할수있다.

DEBUG 모드 프로그램의실행속도를빠르게하기위해기본적으로관리모듈은테트리스의진행상태를화면에출력하지않는다.

이경우본인의 AI가제대로작동하고있는지알수없어어떻게수정을해야할지막막할수있다.

이를위해 DEBUG 모드로프로그램을실행할수있게선택할수있다.

Page 26: 테트리스 플랫폼 V1.0

개발용모드 DEBUG 모드

관리모듈의코드에서 #define _DEBUG_ 문장을사용하면DEBUG 모드로프로그램을실행할수있다. 불필요하면해당라인을주석처리한다.

DEBUG 모드로프로그램실행시두플레이어의테트리스판상태를일정간격(DEBUGSTEP에정의한)으로계속진행할지 prompt 한다. 이는많은블록을짧은시간에진행시키기위함이다. 따라서초기에는 1로, 나중에는 50 이상으로설정한다.

출력간격을바꾸려면 DISPLAYSTEP의값을변경한다. DISPLAYSTEP 간격으로블록진행상황을출력한다.

DISPLAYSTEP 을 1로정의하면모든블록마다판을출력한다. 시간절약을위하여 5 이상으로설정할수있다.

본인의 AI가어떻게게임을플레이하고있는지직접확인하고, 문제점을찾아고칠수있다.

Page 27: 테트리스 플랫폼 V1.0

개발용모드본인의플레이어함수의테스트를위해다음과같은것들이주어진다. 미리짜여진함수

int placeBlock (char tetrisBoard[25][12], int thisBlock, intlocation, int rotation)

테트리스판과블록, 위치, 회전값을인자로넣어실행하면테트리스판에입력된정보로블록을놓고저장한다.

리턴값은블록을넣은 y위치이다. y위치의기준은블록의가장위쪽으로한다.

void checkGameEnd (char tetrisBoard[25][12], char* isDead)

테트리스판과 char 변수주소값을인자로넣어실행하면 게임오버여부를판별해게임오버라면 isDead가가리키는곳에 1을, 아니라면 0을저장한다.

Page 28: 테트리스 플랫폼 V1.0

주의사항

플랫폼은두플레이어의판의상황, 블록내림, 랜덤한블록의생성등을만든다.

플랫폼소스는수정해서는안된다. 설사자신의편의를위해수정하더라도대결에서는표준으로제공된플랫폼을써야한다.

표준이아닌플랫폼을사용하여생기는문제는본인책임이다.

본플랫폼은업데이트될수있다. 항상공지사항을확인하여업데이트된내용을확인한다.