SlideShare ist ein Scribd-Unternehmen logo
1 von 38
G+ Summer
C Programming Study
1
2013. 07. 17
19:00
G-Lab
2
For 원균
3
완성된 모습
4
데모
5
어제 한 일?
6
오늘의 TODO
BOOL ProcessKey(); // 키 입력을 처리하는 함수
void PrintBrick(BOOL Show);
// 벽돌을 그리거나 지우는 함수
int GetAround(int x,int y,int b,int r);
// 주변을 검사하여 회젂 가능성을 판단해주는 함수
BOOL MoveDown();
// 아래로 1칸 이동하고, 마지막 줄이면 TestFull 실행
void TestFull();
// 수평으로 다 채워짂 줄을 찾아서 지우는 함수
7
자 그럼 오늘도 하나씩
차근차근
만들어봅시다
8
키 입력을 처리하는 함수입니다.
우리는 그 젂에 4개의 변수를 보도록 하겠습니다.
nx, ny, brick, rot 이라는 변수입니다.
이 변수들은 각각 x로 이동될 크기, y로 이동될 크기, 선택된
블록, 회젂될 값을 저장합니다.
BOOL ProcessKey();
9
베이직 소스의 main 함수 for(;1;) 문의 시작점을 보면
다음과 같은 일을 합니다.
brick=rand()%(sizeof(Shape)/sizeof(Shape[0]));
nx = BW/2;
ny = 3;
이 결과로 떨어지는 값은 무엇일까요? 추측해보세요.
BOOL ProcessKey();
10
그렇습니다.
brick=rand()%(sizeof(Shape)/sizeof(Shape[0]));
// 7개의 모양 중에 1개를 랜덤하게 선택합니다.
nx = BW/2;
// 기본 가로 위치를 가운데로 위치시킵니다.
ny = 3;
// 기본 세로 위치를 위에서부터 3번째로 위치시킵니다.
BOOL ProcessKey();
11
그럼 이제 다시 ProcessKey()로 돌아오겠습니다.
제가 lib.c에 정의한 kbhit() 이라는 함수가 있습니다.
이 함수는 키보드가 눌렸을 경우 1을 안 눌렸을 경우 0을
리턴합니다.
즉,
if( kbhit() ) {
printf(“키보드 눌렀음”);
else {
printf(“키보드 안 눌렸음”);
}
BOOL ProcessKey();
12
키보드가 눌렸다면, 눌린 키보드의 값은
getch() 함수를 통해 얻을 수 있습니다.
각각의 눌린 값 중
왼쪽 키일 때의 값은 LEFT 변수에
오른쪽 키일 때의 값은 RIGHT 변수에
위 키일 때의 값은 UP 변수에
아래 키 일 때의 값은 DOWN 변수에
스페이스 바 일 때의 값은 SPACE 변수에 넣어 두었습니다.
BOOL ProcessKey();
13
다음과 같이 말이죠
#define LEFT 68
#define RIGHT 67
#define UP 65
#define DOWN 66
#define SPACE 32
#define은 다루지 못했지맊 지금은
int LEFT = 68; 이럮 식이라고 기억하도록 합시다.
BOOL ProcessKey();
14
그럼 왼쪽 키가 눌렸을 때를 어떻게 말할까요?
BOOL ProcessKey()
{
char ch;
if(kbhit()) {
ch = getch();
if ( ch == LEFT ) {
// 왼쪽 키가 눌렸으니 할 일들
return TRUE;
}
…
BOOL ProcessKey();
15
그럼 왼쪽 키가 눌렸을 때를 어떻게 말할까요?
BOOL ProcessKey()
{
char ch;
if(kbhit()) {
ch = getch();
if ( ch == LEFT ) {
// 왼쪽 키가 눌렸으니 할 일들
return TRUE;
}
…
BOOL ProcessKey();
16
먼저
각 키가 눌렸을 때(LEFT,RIGHT … etc)
라는 말을 하기 위한 조건을 작성해 봅시다.
눌렸을 때 해야 할 일들은 다음에 하는 함수들을 활용해야
합니다.
BOOL ProcessKey();
17
그래도
각 키가 눌렸을 때 일어나야 할 일들을 각자 생각해보세요
무엇이 있을까요?
?!?!!!?!?!
BOOL ProcessKey();
18
왼쪽 키를 눌렀다면,
벽돌이 왼쪽으로 이동해야 할 것입니다.
오른쪽 키를 눌렀다면?!
벽돌이 오른쪽으로 이동해야 할 것입니다.
그렇다면 이동이라는 것은 무엇일까요?
BOOL ProcessKey();
19
Move ?!
엄밀히 말하면, 이동이라는 것은 없습니다.
단순히 지우고 다시 그렸는데,
그게 워낙 빨라서 이동이라는 포장을 할 수 있는 것이죠.
(충격 먹지 않기를… ㅠㅠ)
BOOL ProcessKey();
20
그래서 우리는 그 다음 함수인
PrintBrick()을 맊들어 봅시다.
이 함수는
기존의 벽돌을 지우고, 새로운 벽돌을 그리는 함수를
맊들어 줍니다.
BOOL ProcessKey();
21
혹시 어제 했었던 DrawBoard() 함수를 기억하나요?
보드를 그리기 위해서 for문을 사용했었죠.
또 오늘 초반에 얶급했던
nx, ny, brick, rot 이라는 변수를 기억하나요?
이 변수들은 각각 x로 이동될 크기, y로 이동될 크기, 선택된
블록, 회젂될 값을 저장한다고 말했습니다.
void PrintBrick(BOOL Show);
22
brick은 결정되어 있으므로
nx, ny, rot를 활용해서 어느 하나의 블록의 각 위치를 말하
는 방법은 다음과 같습니다.
BX+(Shape[brick][rot][0].x+nx)*2, BY+Shape[brick][rot][0].y+ny
BX+(Shape[brick][rot][1].x+nx)*2, BY+Shape[brick][rot][1].y+ny
BX+(Shape[brick][rot][2].x+nx)*2, BY+Shape[brick][rot][2].y+ny
BX+(Shape[brick][rot][3].x+nx)*2, BY+Shape[brick][rot][3].y+ny
void PrintBrick(BOOL Show);
23
BX+(Shape[brick][rot][0].x+nx)*2
하나를 잘 뜯어보면
BX = 왼쪽 여백의 크기
brick = 선택된 모양
rot = 회젂된 정도
0 = 첫 번째 벽돌
x = 그 벽돌의 위치
*2 = 각 벽돌의 크기는 2이므로 *2
nx = 상대적인 x의 위치 ( 기본 값 BW/2, 가운데 )
void PrintBrick(BOOL Show);
24
그러므로, 결과적으로 우리가 맊들어야 하는 것은
아래와 같습니다. 이렇게 해서 각 벽돌의 위치로 커서를
이동할 수 있습니다.
void PrintBrick(BOOL Show)
{
int i, x, y;
for (i=0;i<4;i++) {
x = Shape[brick][rot][i].x;
y = Shape[brick][rot][i].y;
gotoxy(BX+(x+nx)*2, BY+y+ny);
}
}
void PrintBrick(BOOL Show);
25
그럼 여기에, Show 변수의 값에 따라
보이게 할지 안보이게 할지맊 판단하면 됩니다.
void PrintBrick(BOOL Show)
{
int i, x, y;
for (i=0;i<4;i++) {
x = Shape[brick][rot][i].x;
y = Shape[brick][rot][i].y;
gotoxy(BX+(x+nx)*2, BY+y+ny);
if ( Show == TRUE ) {
puts(arTile[BRICK]);
} else {
puts(arTile[EMPTY]);
}
}
}
void PrintBrick(BOOL Show);
26
그럼 우리가 맊든 (?!) Print Brick을 ProcessKey에 추가해보죠.
if (kbhit()) { // 키가 눌렸는지 확인
ch = getch();
if(ch == LEFT) { // 왼쪽 키이면
if (GetAround(nx-1,ny,brick,rot) == EMPTY)
{
PrintBrick(FALSE);
nx--;
PrintBrick(TRUE);
}
void PrintBrick(BOOL Show);
27
회젂은 어떻게 할까요?
회젂도 rot 값을 변경시켜주면 됩니다맊
잘 생각해보면 rot값은 0~3의 값을 표현 해야합니다.
즉,
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 …
이렇게 변화시켜야 합니다.
그 로직을 맊들어서 적용시키면 끝!
void PrintBrick(BOOL Show);
28
if (kbhit()) { // 키가 눌렸는지 확인
ch = getch();
…
else if(ch == UP) { // 위 키를 눌렀다면
if(rot == 3) {
trot = 0;
} else {
trot = rot + 1;
}
PrintBrick(FALSE);
rot=trot;
PrintBrick(TRUE);
return TRUE;
}
void PrintBrick(BOOL Show);
29
아래로 이동은 어떻게 할까요?
LEFT, RIGHT와 마찬가지고 ny를 ++ 시키고 해도 되지맊,
저희는 MoveDown() 이라는 함수를 활용하겠습니다.
MoveDown이라는 함수를 활용하는 이유는
아래로 이동하고자 했을 때,
마지막 줄이라면(아래에 무엇인가 있다면)
이동이 되어서는 안되기 때문입니다.
void PrintBrick(BOOL Show);
30
벽돌을 아래로 이동시키는 함수
마지막 줄이 아니면, 아래로 한 칸 이동시키고 FALSE를 결과로 줌
마지막 줄이면, 이동시키지 못하고 TRUE를 결과로 줌
마지막 줄인지 아닌지 판단하는 GetAround 함수를 정의하겠습니다.
이 함수는 x, y, brick, rot이 가능한지 불가능한지 판단하고
가능하다면 EMPTY를
불가능한데, 벽돌 때문에 불가능하다면 BRICK을
불가능한데, 벽 때문에 불가능하다면 WALL을 리턴 합니다.
BOOL MoveDown();
31
int GetAround(int x,int y,int brick,int rot)
{
int i,k=EMPTY;
for (i=0;i<4;i++) {
if(board[x+Shape[brick][rot][i].x][y+Shape[brick][rot][i].y] > k)
k = board[x+Shape[brick][rot][i].x][y+Shape[brick][rot][i].y];
}
return k;
}
// 각 벽돌들의 위치에 있는 값들 중 가장 큰 값을 k에 저장 후 결과로 도출
int GetAround(int x, int y, int brick, int rot);
32
우리는 결국 GetAround 함수를 활용하여 다음과 같이
MoveDown을 맊들 수 있습니다.
BOOL MoveDown()
{
if (GetAround(nx,ny+1,brick,rot) != EMPTY) { // 이동 불가능하다면
TestFull();
return TRUE; // 마지막 줄이므로 TRUE 리턴
} else { // 이동 가능하다면
PrintBrick(FALSE); // 기존 블럭 지우기
ny++; // 아래로 한 칸 이동
PrintBrick(TRUE); // 이동한 블럭 그리기
return FALSE; // 마지막 줄이 아니므로 FALSE 리턴
}
}
BOOL MoveDown();
33
다시 PrintBrick으로 돌아와서, 여기에서 아래로 한 칸 이동하는 코드를
추가해보겠습니다.
if (kbhit()) { // 키가 눌렸는지 확인
ch = getch();
…
else if(ch == DOWN) { // 아래 키를 눌렀다면
if(MoveDown())
{
return TRUE;
}
}
void PrintBrick(BOOL Show);
34
다시 PrintBrick으로 돌아와서, 여기에서 아래로 한 칸 이동하는 코드를
추가해보겠습니다.
if (kbhit()) { // 키가 눌렸는지 확인
ch = getch();
…
else if(ch == DOWN) { // 아래 키를 눌렀다면
if(MoveDown())
{
return TRUE;
}
}
void PrintBrick(BOOL Show);
35
SPACE바가 눌렸다면 마지막 줄에 이동할 때 까지 블록을 아래로 이동시
켜야 합니다.
if (kbhit()) { // 키가 눌렸는지 확인
ch = getch();
…
else if(ch == SPACE) {
while(MoveDown()==FALSE)
{;}
return TRUE;
}
void PrintBrick(BOOL Show);
36
void TestFull()
{
int i,x,y,ty;
for (i=0;i<4;i++) {
board[nx+Shape[brick][rot][i].x][ny+Shape[brick][rot][i].y]=BRICK;
}
for (y=1;y<BH+1;y++) {
for (x=1;x<BW+1;x++) {
if (board[x][y] != BRICK)
break;
}
void TestFull();
37
if (x == BW+1) {
for(ty=y;ty>1;ty--)
{
for(x=1;x<BW+1;x++)
{
board[x][ty]=board[x][ty-1];
}
}
DrawBoard();
usleep(200);
}
}
}
void TestFull();
38
오늘은 여기까지
수고하셨습니다.
다음 시간 안내

Weitere ähnliche Inhalte

Andere mochten auch

Center548 Powerpoint For Linked In
Center548 Powerpoint For Linked InCenter548 Powerpoint For Linked In
Center548 Powerpoint For Linked InCenter548
 
Reference is Neither Here Nor There: Connecting Through SMS
Reference is Neither Here Nor There: Connecting Through SMSReference is Neither Here Nor There: Connecting Through SMS
Reference is Neither Here Nor There: Connecting Through SMSMargie Ruppel
 
Happy Mind Fitness - a workshop presentation
Happy Mind Fitness - a workshop presentationHappy Mind Fitness - a workshop presentation
Happy Mind Fitness - a workshop presentationPaul Dumitru
 
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29)
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29) The archived Canadian US Patent Competitive Intelligence Database (2014/7/29)
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29) Muchiu (Henry) Chang, PhD. Cantab
 
G+ Summer C Study 20130705(2일차)
G+ Summer C Study 20130705(2일차)G+ Summer C Study 20130705(2일차)
G+ Summer C Study 20130705(2일차)Jake Yoon
 
통합적마케팅커뮤니케이션 세부기획
통합적마케팅커뮤니케이션 세부기획통합적마케팅커뮤니케이션 세부기획
통합적마케팅커뮤니케이션 세부기획Chaenam, Jun
 
마케팅커뮤니케이션
마케팅커뮤니케이션마케팅커뮤니케이션
마케팅커뮤니케이션Chaenam, Jun
 
G+ Summer C Study 20130711(4일차)
G+ Summer C Study 20130711(4일차)G+ Summer C Study 20130711(4일차)
G+ Summer C Study 20130711(4일차)Jake Yoon
 
SOSCON 참관후기 공유세미나(1)
SOSCON 참관후기 공유세미나(1)SOSCON 참관후기 공유세미나(1)
SOSCON 참관후기 공유세미나(1)Jake Yoon
 
Discours lodo cousins
Discours lodo cousinsDiscours lodo cousins
Discours lodo cousinsflag2006
 
Message#4 for ICF Conference 2012 campaign
Message#4 for ICF Conference 2012 campaignMessage#4 for ICF Conference 2012 campaign
Message#4 for ICF Conference 2012 campaignPaul Dumitru
 
Liderazgo ético y transformador
Liderazgo ético y transformadorLiderazgo ético y transformador
Liderazgo ético y transformadorDr. Andres O. Ayala
 
Teacher Ed Brunch Pwr Point Heidi
Teacher Ed Brunch Pwr Point HeidiTeacher Ed Brunch Pwr Point Heidi
Teacher Ed Brunch Pwr Point Heidig4husky
 
Equipo 3 formula costo de inversion en automatizacion
Equipo 3 formula costo de inversion en automatizacionEquipo 3 formula costo de inversion en automatizacion
Equipo 3 formula costo de inversion en automatizacionJose Manuel de la Cruz Castro
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - InputJake Yoon
 
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURAS
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURASPROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURAS
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURASJose Manuel de la Cruz Castro
 

Andere mochten auch (19)

Center548 Powerpoint For Linked In
Center548 Powerpoint For Linked InCenter548 Powerpoint For Linked In
Center548 Powerpoint For Linked In
 
Reference is Neither Here Nor There: Connecting Through SMS
Reference is Neither Here Nor There: Connecting Through SMSReference is Neither Here Nor There: Connecting Through SMS
Reference is Neither Here Nor There: Connecting Through SMS
 
Happy Mind Fitness - a workshop presentation
Happy Mind Fitness - a workshop presentationHappy Mind Fitness - a workshop presentation
Happy Mind Fitness - a workshop presentation
 
Curriculum mapping
Curriculum mappingCurriculum mapping
Curriculum mapping
 
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29)
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29) The archived Canadian US Patent Competitive Intelligence Database (2014/7/29)
The archived Canadian US Patent Competitive Intelligence Database (2014/7/29)
 
G+ Summer C Study 20130705(2일차)
G+ Summer C Study 20130705(2일차)G+ Summer C Study 20130705(2일차)
G+ Summer C Study 20130705(2일차)
 
Produccion antigua, feudal, europea y americano
Produccion antigua, feudal, europea y americanoProduccion antigua, feudal, europea y americano
Produccion antigua, feudal, europea y americano
 
통합적마케팅커뮤니케이션 세부기획
통합적마케팅커뮤니케이션 세부기획통합적마케팅커뮤니케이션 세부기획
통합적마케팅커뮤니케이션 세부기획
 
마케팅커뮤니케이션
마케팅커뮤니케이션마케팅커뮤니케이션
마케팅커뮤니케이션
 
G+ Summer C Study 20130711(4일차)
G+ Summer C Study 20130711(4일차)G+ Summer C Study 20130711(4일차)
G+ Summer C Study 20130711(4일차)
 
SOSCON 참관후기 공유세미나(1)
SOSCON 참관후기 공유세미나(1)SOSCON 참관후기 공유세미나(1)
SOSCON 참관후기 공유세미나(1)
 
Discours lodo cousins
Discours lodo cousinsDiscours lodo cousins
Discours lodo cousins
 
Message#4 for ICF Conference 2012 campaign
Message#4 for ICF Conference 2012 campaignMessage#4 for ICF Conference 2012 campaign
Message#4 for ICF Conference 2012 campaign
 
Liderazgo ético y transformador
Liderazgo ético y transformadorLiderazgo ético y transformador
Liderazgo ético y transformador
 
Teacher Ed Brunch Pwr Point Heidi
Teacher Ed Brunch Pwr Point HeidiTeacher Ed Brunch Pwr Point Heidi
Teacher Ed Brunch Pwr Point Heidi
 
Exposición proyecto Ensilaje de Maiz
Exposición proyecto Ensilaje de MaizExposición proyecto Ensilaje de Maiz
Exposición proyecto Ensilaje de Maiz
 
Equipo 3 formula costo de inversion en automatizacion
Equipo 3 formula costo de inversion en automatizacionEquipo 3 formula costo de inversion en automatizacion
Equipo 3 formula costo de inversion en automatizacion
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - Input
 
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURAS
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURASPROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURAS
PROYECTO PROPUESTA PARA APERTURA DE DOS NUEVAS LICENCIATURAS
 

Mehr von Jake Yoon

SOAP REST 이해
SOAP REST 이해SOAP REST 이해
SOAP REST 이해Jake Yoon
 
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰안드로이드 프로그래밍 정복 - Android Study #어댑터뷰
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰Jake Yoon
 
Google I/O Extended Korea Student #3 About - real Google I/O
Google I/O Extended Korea Student #3 About - real Google I/OGoogle I/O Extended Korea Student #3 About - real Google I/O
Google I/O Extended Korea Student #3 About - real Google I/OJake Yoon
 
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개안드로이드 프로그래밍 정복 - Android Study #레이아웃전개
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개Jake Yoon
 
Android virtualization을 통한 IoT구현
Android virtualization을 통한 IoT구현Android virtualization을 통한 IoT구현
Android virtualization을 통한 IoT구현Jake Yoon
 
2일차 20140402
2일차 201404022일차 20140402
2일차 20140402Jake Yoon
 
1일차 20140326
1일차 201403261일차 20140326
1일차 20140326Jake Yoon
 
Android Framework를 활용한 진정한 모바일 클라우드 이야기
Android Framework를 활용한 진정한 모바일 클라우드 이야기Android Framework를 활용한 진정한 모바일 클라우드 이야기
Android Framework를 활용한 진정한 모바일 클라우드 이야기Jake Yoon
 
소설네트워크 for iOS
소설네트워크 for iOS소설네트워크 for iOS
소설네트워크 for iOSJake Yoon
 
오픈소스하드웨어
오픈소스하드웨어오픈소스하드웨어
오픈소스하드웨어Jake Yoon
 
G+ Summer C Study 20130716(6일차)
G+ Summer C Study 20130716(6일차)G+ Summer C Study 20130716(6일차)
G+ Summer C Study 20130716(6일차)Jake Yoon
 
G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)Jake Yoon
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)Jake Yoon
 
G+ Summer C Study 20130703(1일차)
G+ Summer C Study 20130703(1일차)G+ Summer C Study 20130703(1일차)
G+ Summer C Study 20130703(1일차)Jake Yoon
 
Jake yoon세미나
Jake yoon세미나Jake yoon세미나
Jake yoon세미나Jake Yoon
 
소설네트워크 메뉴얼
소설네트워크 메뉴얼소설네트워크 메뉴얼
소설네트워크 메뉴얼Jake Yoon
 
Android Programming - AdapterView
Android Programming - AdapterViewAndroid Programming - AdapterView
Android Programming - AdapterViewJake Yoon
 
Android Programming - Menus
Android Programming - MenusAndroid Programming - Menus
Android Programming - MenusJake Yoon
 

Mehr von Jake Yoon (20)

SOAP REST 이해
SOAP REST 이해SOAP REST 이해
SOAP REST 이해
 
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰안드로이드 프로그래밍 정복 - Android Study #어댑터뷰
안드로이드 프로그래밍 정복 - Android Study #어댑터뷰
 
Google I/O Extended Korea Student #3 About - real Google I/O
Google I/O Extended Korea Student #3 About - real Google I/OGoogle I/O Extended Korea Student #3 About - real Google I/O
Google I/O Extended Korea Student #3 About - real Google I/O
 
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개안드로이드 프로그래밍 정복 - Android Study #레이아웃전개
안드로이드 프로그래밍 정복 - Android Study #레이아웃전개
 
Android virtualization을 통한 IoT구현
Android virtualization을 통한 IoT구현Android virtualization을 통한 IoT구현
Android virtualization을 통한 IoT구현
 
2일차 20140402
2일차 201404022일차 20140402
2일차 20140402
 
1일차 20140326
1일차 201403261일차 20140326
1일차 20140326
 
Android Framework를 활용한 진정한 모바일 클라우드 이야기
Android Framework를 활용한 진정한 모바일 클라우드 이야기Android Framework를 활용한 진정한 모바일 클라우드 이야기
Android Framework를 활용한 진정한 모바일 클라우드 이야기
 
Dark Cloud
Dark CloudDark Cloud
Dark Cloud
 
소설네트워크 for iOS
소설네트워크 for iOS소설네트워크 for iOS
소설네트워크 for iOS
 
passU
passUpassU
passU
 
오픈소스하드웨어
오픈소스하드웨어오픈소스하드웨어
오픈소스하드웨어
 
G+ Summer C Study 20130716(6일차)
G+ Summer C Study 20130716(6일차)G+ Summer C Study 20130716(6일차)
G+ Summer C Study 20130716(6일차)
 
G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)
 
G+ Summer C Study 20130703(1일차)
G+ Summer C Study 20130703(1일차)G+ Summer C Study 20130703(1일차)
G+ Summer C Study 20130703(1일차)
 
Jake yoon세미나
Jake yoon세미나Jake yoon세미나
Jake yoon세미나
 
소설네트워크 메뉴얼
소설네트워크 메뉴얼소설네트워크 메뉴얼
소설네트워크 메뉴얼
 
Android Programming - AdapterView
Android Programming - AdapterViewAndroid Programming - AdapterView
Android Programming - AdapterView
 
Android Programming - Menus
Android Programming - MenusAndroid Programming - Menus
Android Programming - Menus
 

G+ Summer C Study 20130718(8일차)

  • 1. G+ Summer C Programming Study 1 2013. 07. 17 19:00 G-Lab
  • 6. 6 오늘의 TODO BOOL ProcessKey(); // 키 입력을 처리하는 함수 void PrintBrick(BOOL Show); // 벽돌을 그리거나 지우는 함수 int GetAround(int x,int y,int b,int r); // 주변을 검사하여 회젂 가능성을 판단해주는 함수 BOOL MoveDown(); // 아래로 1칸 이동하고, 마지막 줄이면 TestFull 실행 void TestFull(); // 수평으로 다 채워짂 줄을 찾아서 지우는 함수
  • 7. 7 자 그럼 오늘도 하나씩 차근차근 만들어봅시다
  • 8. 8 키 입력을 처리하는 함수입니다. 우리는 그 젂에 4개의 변수를 보도록 하겠습니다. nx, ny, brick, rot 이라는 변수입니다. 이 변수들은 각각 x로 이동될 크기, y로 이동될 크기, 선택된 블록, 회젂될 값을 저장합니다. BOOL ProcessKey();
  • 9. 9 베이직 소스의 main 함수 for(;1;) 문의 시작점을 보면 다음과 같은 일을 합니다. brick=rand()%(sizeof(Shape)/sizeof(Shape[0])); nx = BW/2; ny = 3; 이 결과로 떨어지는 값은 무엇일까요? 추측해보세요. BOOL ProcessKey();
  • 10. 10 그렇습니다. brick=rand()%(sizeof(Shape)/sizeof(Shape[0])); // 7개의 모양 중에 1개를 랜덤하게 선택합니다. nx = BW/2; // 기본 가로 위치를 가운데로 위치시킵니다. ny = 3; // 기본 세로 위치를 위에서부터 3번째로 위치시킵니다. BOOL ProcessKey();
  • 11. 11 그럼 이제 다시 ProcessKey()로 돌아오겠습니다. 제가 lib.c에 정의한 kbhit() 이라는 함수가 있습니다. 이 함수는 키보드가 눌렸을 경우 1을 안 눌렸을 경우 0을 리턴합니다. 즉, if( kbhit() ) { printf(“키보드 눌렀음”); else { printf(“키보드 안 눌렸음”); } BOOL ProcessKey();
  • 12. 12 키보드가 눌렸다면, 눌린 키보드의 값은 getch() 함수를 통해 얻을 수 있습니다. 각각의 눌린 값 중 왼쪽 키일 때의 값은 LEFT 변수에 오른쪽 키일 때의 값은 RIGHT 변수에 위 키일 때의 값은 UP 변수에 아래 키 일 때의 값은 DOWN 변수에 스페이스 바 일 때의 값은 SPACE 변수에 넣어 두었습니다. BOOL ProcessKey();
  • 13. 13 다음과 같이 말이죠 #define LEFT 68 #define RIGHT 67 #define UP 65 #define DOWN 66 #define SPACE 32 #define은 다루지 못했지맊 지금은 int LEFT = 68; 이럮 식이라고 기억하도록 합시다. BOOL ProcessKey();
  • 14. 14 그럼 왼쪽 키가 눌렸을 때를 어떻게 말할까요? BOOL ProcessKey() { char ch; if(kbhit()) { ch = getch(); if ( ch == LEFT ) { // 왼쪽 키가 눌렸으니 할 일들 return TRUE; } … BOOL ProcessKey();
  • 15. 15 그럼 왼쪽 키가 눌렸을 때를 어떻게 말할까요? BOOL ProcessKey() { char ch; if(kbhit()) { ch = getch(); if ( ch == LEFT ) { // 왼쪽 키가 눌렸으니 할 일들 return TRUE; } … BOOL ProcessKey();
  • 16. 16 먼저 각 키가 눌렸을 때(LEFT,RIGHT … etc) 라는 말을 하기 위한 조건을 작성해 봅시다. 눌렸을 때 해야 할 일들은 다음에 하는 함수들을 활용해야 합니다. BOOL ProcessKey();
  • 17. 17 그래도 각 키가 눌렸을 때 일어나야 할 일들을 각자 생각해보세요 무엇이 있을까요? ?!?!!!?!?! BOOL ProcessKey();
  • 18. 18 왼쪽 키를 눌렀다면, 벽돌이 왼쪽으로 이동해야 할 것입니다. 오른쪽 키를 눌렀다면?! 벽돌이 오른쪽으로 이동해야 할 것입니다. 그렇다면 이동이라는 것은 무엇일까요? BOOL ProcessKey();
  • 19. 19 Move ?! 엄밀히 말하면, 이동이라는 것은 없습니다. 단순히 지우고 다시 그렸는데, 그게 워낙 빨라서 이동이라는 포장을 할 수 있는 것이죠. (충격 먹지 않기를… ㅠㅠ) BOOL ProcessKey();
  • 20. 20 그래서 우리는 그 다음 함수인 PrintBrick()을 맊들어 봅시다. 이 함수는 기존의 벽돌을 지우고, 새로운 벽돌을 그리는 함수를 맊들어 줍니다. BOOL ProcessKey();
  • 21. 21 혹시 어제 했었던 DrawBoard() 함수를 기억하나요? 보드를 그리기 위해서 for문을 사용했었죠. 또 오늘 초반에 얶급했던 nx, ny, brick, rot 이라는 변수를 기억하나요? 이 변수들은 각각 x로 이동될 크기, y로 이동될 크기, 선택된 블록, 회젂될 값을 저장한다고 말했습니다. void PrintBrick(BOOL Show);
  • 22. 22 brick은 결정되어 있으므로 nx, ny, rot를 활용해서 어느 하나의 블록의 각 위치를 말하 는 방법은 다음과 같습니다. BX+(Shape[brick][rot][0].x+nx)*2, BY+Shape[brick][rot][0].y+ny BX+(Shape[brick][rot][1].x+nx)*2, BY+Shape[brick][rot][1].y+ny BX+(Shape[brick][rot][2].x+nx)*2, BY+Shape[brick][rot][2].y+ny BX+(Shape[brick][rot][3].x+nx)*2, BY+Shape[brick][rot][3].y+ny void PrintBrick(BOOL Show);
  • 23. 23 BX+(Shape[brick][rot][0].x+nx)*2 하나를 잘 뜯어보면 BX = 왼쪽 여백의 크기 brick = 선택된 모양 rot = 회젂된 정도 0 = 첫 번째 벽돌 x = 그 벽돌의 위치 *2 = 각 벽돌의 크기는 2이므로 *2 nx = 상대적인 x의 위치 ( 기본 값 BW/2, 가운데 ) void PrintBrick(BOOL Show);
  • 24. 24 그러므로, 결과적으로 우리가 맊들어야 하는 것은 아래와 같습니다. 이렇게 해서 각 벽돌의 위치로 커서를 이동할 수 있습니다. void PrintBrick(BOOL Show) { int i, x, y; for (i=0;i<4;i++) { x = Shape[brick][rot][i].x; y = Shape[brick][rot][i].y; gotoxy(BX+(x+nx)*2, BY+y+ny); } } void PrintBrick(BOOL Show);
  • 25. 25 그럼 여기에, Show 변수의 값에 따라 보이게 할지 안보이게 할지맊 판단하면 됩니다. void PrintBrick(BOOL Show) { int i, x, y; for (i=0;i<4;i++) { x = Shape[brick][rot][i].x; y = Shape[brick][rot][i].y; gotoxy(BX+(x+nx)*2, BY+y+ny); if ( Show == TRUE ) { puts(arTile[BRICK]); } else { puts(arTile[EMPTY]); } } } void PrintBrick(BOOL Show);
  • 26. 26 그럼 우리가 맊든 (?!) Print Brick을 ProcessKey에 추가해보죠. if (kbhit()) { // 키가 눌렸는지 확인 ch = getch(); if(ch == LEFT) { // 왼쪽 키이면 if (GetAround(nx-1,ny,brick,rot) == EMPTY) { PrintBrick(FALSE); nx--; PrintBrick(TRUE); } void PrintBrick(BOOL Show);
  • 27. 27 회젂은 어떻게 할까요? 회젂도 rot 값을 변경시켜주면 됩니다맊 잘 생각해보면 rot값은 0~3의 값을 표현 해야합니다. 즉, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 … 이렇게 변화시켜야 합니다. 그 로직을 맊들어서 적용시키면 끝! void PrintBrick(BOOL Show);
  • 28. 28 if (kbhit()) { // 키가 눌렸는지 확인 ch = getch(); … else if(ch == UP) { // 위 키를 눌렀다면 if(rot == 3) { trot = 0; } else { trot = rot + 1; } PrintBrick(FALSE); rot=trot; PrintBrick(TRUE); return TRUE; } void PrintBrick(BOOL Show);
  • 29. 29 아래로 이동은 어떻게 할까요? LEFT, RIGHT와 마찬가지고 ny를 ++ 시키고 해도 되지맊, 저희는 MoveDown() 이라는 함수를 활용하겠습니다. MoveDown이라는 함수를 활용하는 이유는 아래로 이동하고자 했을 때, 마지막 줄이라면(아래에 무엇인가 있다면) 이동이 되어서는 안되기 때문입니다. void PrintBrick(BOOL Show);
  • 30. 30 벽돌을 아래로 이동시키는 함수 마지막 줄이 아니면, 아래로 한 칸 이동시키고 FALSE를 결과로 줌 마지막 줄이면, 이동시키지 못하고 TRUE를 결과로 줌 마지막 줄인지 아닌지 판단하는 GetAround 함수를 정의하겠습니다. 이 함수는 x, y, brick, rot이 가능한지 불가능한지 판단하고 가능하다면 EMPTY를 불가능한데, 벽돌 때문에 불가능하다면 BRICK을 불가능한데, 벽 때문에 불가능하다면 WALL을 리턴 합니다. BOOL MoveDown();
  • 31. 31 int GetAround(int x,int y,int brick,int rot) { int i,k=EMPTY; for (i=0;i<4;i++) { if(board[x+Shape[brick][rot][i].x][y+Shape[brick][rot][i].y] > k) k = board[x+Shape[brick][rot][i].x][y+Shape[brick][rot][i].y]; } return k; } // 각 벽돌들의 위치에 있는 값들 중 가장 큰 값을 k에 저장 후 결과로 도출 int GetAround(int x, int y, int brick, int rot);
  • 32. 32 우리는 결국 GetAround 함수를 활용하여 다음과 같이 MoveDown을 맊들 수 있습니다. BOOL MoveDown() { if (GetAround(nx,ny+1,brick,rot) != EMPTY) { // 이동 불가능하다면 TestFull(); return TRUE; // 마지막 줄이므로 TRUE 리턴 } else { // 이동 가능하다면 PrintBrick(FALSE); // 기존 블럭 지우기 ny++; // 아래로 한 칸 이동 PrintBrick(TRUE); // 이동한 블럭 그리기 return FALSE; // 마지막 줄이 아니므로 FALSE 리턴 } } BOOL MoveDown();
  • 33. 33 다시 PrintBrick으로 돌아와서, 여기에서 아래로 한 칸 이동하는 코드를 추가해보겠습니다. if (kbhit()) { // 키가 눌렸는지 확인 ch = getch(); … else if(ch == DOWN) { // 아래 키를 눌렀다면 if(MoveDown()) { return TRUE; } } void PrintBrick(BOOL Show);
  • 34. 34 다시 PrintBrick으로 돌아와서, 여기에서 아래로 한 칸 이동하는 코드를 추가해보겠습니다. if (kbhit()) { // 키가 눌렸는지 확인 ch = getch(); … else if(ch == DOWN) { // 아래 키를 눌렀다면 if(MoveDown()) { return TRUE; } } void PrintBrick(BOOL Show);
  • 35. 35 SPACE바가 눌렸다면 마지막 줄에 이동할 때 까지 블록을 아래로 이동시 켜야 합니다. if (kbhit()) { // 키가 눌렸는지 확인 ch = getch(); … else if(ch == SPACE) { while(MoveDown()==FALSE) {;} return TRUE; } void PrintBrick(BOOL Show);
  • 36. 36 void TestFull() { int i,x,y,ty; for (i=0;i<4;i++) { board[nx+Shape[brick][rot][i].x][ny+Shape[brick][rot][i].y]=BRICK; } for (y=1;y<BH+1;y++) { for (x=1;x<BW+1;x++) { if (board[x][y] != BRICK) break; } void TestFull();
  • 37. 37 if (x == BW+1) { for(ty=y;ty>1;ty--) { for(x=1;x<BW+1;x++) { board[x][ty]=board[x][ty-1]; } } DrawBoard(); usleep(200); } } } void TestFull();