[C / C++] Jumping Cat / C 게임 / C++ 게임 / C언어 게임 / 고양이 게임 만들기
2020. 6. 24. 14:56ㆍ🧑🏻💻/C & C++
C언어 / C++로 게임을 만들어 보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
// JUMPING CAT 취미 제작.
// Created by chanhhh
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <Windows.h>
#define CHARACTER_BOTTOM_Y 12 // 고양이 바닥값 설정
#define BARRICADE_BOTTOM_X 45 // 장애물 X축 값 설정
#define BARRICADE_BOTTOM_Y 25 // 장애물 Y축 값 설정
#define HEART_BOTTOM_X 45 // 하트 X축 값 설정
#define HEART_BOTTOM_Y 25 // 하트 Y축 값 설정
static bool heartHead = false; // 하트를 먹었을때 고양이 반응 설정
//system 함수를 사용해 cmd창의 cols와 lines를 설정합니다.
//title의 이름또한 변경 가능.
//자세한 내용은 https://chanhhh.tistory.com/5
void setConsoleView()
{
system("mode con:cols=140 lines=35");
system("title Jumping Cat ~. By Chanhhh");
}
//색상 넣기. setColor https://chanhhh.tistory.com/8
void setColor(int color, int bgcolor)
{
color &= 0xf;
bgcolor &= 0xf;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
(bgcolor << 4) | color);
}
// 좌표 이동
void cursorXY(int x, int y)
{
COORD pos;
pos.X = 2 * x; // x좌표는 y좌표 값의 2배.
pos.Y = y; // "ab = ㄱ" 과 같은 바이트를 차지 하기 때문 x:y = 1:2
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
//_kbhit를 사용하여 키가 눌렸는지 확인 할 수 있습니다.
int getKeyDown()
{
if (_kbhit() != 0)
{
return _getch();
}
return 0;
}
//고양이를 그려줍니다. Interface 단계.
void drawCH(int chY)
{
setColor(15, 0);
cursorXY(0, chY);
static bool movingLeg = true; // 다리가 움직이는것도 만들어 줍니다.
if (movingLeg)
{
printf(" ______ \n");
printf(" ________ \n");
printf(" __ __ \n");
printf(" __ _ \n");
}
else
{
printf(" _____ \n");
printf(" __________ \n");
printf(" __ __ \n");
printf(" __ \n");
}
if (heartHead) // 하트를 획득하였을때 반응입니다.
{
setColor(15, 0);
printf(" __ "); setColor(12, 0);printf("♥\n");
setColor(15, 0);
printf(" __ "); setColor(12, 0);printf(" ♥\n");
setColor(15, 0);
printf(" __ __ _ \n");
heartHead = false;
}
else
{
printf(" __ \n");
printf(" __ \n");
printf(" __ __ _ \n");
}
printf(" ___ __ __ __ \n");
printf(" _________ ________ \n");
printf(" ________ __ ___ _ \n");
printf(" _________ __ ___ _ \n");
printf(" _________ ________ \n");
printf(" __________ ______ \n");
printf(" ____ __________ \n");
printf(" ___ _________ \n");
if (movingLeg)
{
printf(" ___ ___ ___ \n");
printf(" ___ ___ ___ \n");
printf(" __ __ ___ \n");
printf(" __ __ ___ \n");
printf(" __ __ __ \n");
movingLeg = false;
}
else
{
printf(" ___ ___ ___ \n");
printf(" ___ ___ ___ \n");
printf(" __ __ ___ \n");
printf(" __ __ ___ \n");
printf(" __ __ __ \n");
movingLeg = true;
}
}
// 장애물을 그려줍니다
void drawBarricade(int BarricadeX)
{
setColor(14, 0);
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y);
printf("XX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 1);
printf("XXXX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 2);
printf("XX XXXX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 3);
printf("XX XX XXXX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 4);
printf("X XX XX XXX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 5);
printf("X X XX XX");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 6);
printf(" X X X");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 7);
printf(" X X");
cursorXY(BarricadeX, BARRICADE_BOTTOM_Y + 8);
printf(" X");
}
// 하트를 그려줍니다
void drawHeart(int HeartX)
{
setColor(12,0);
cursorXY(HeartX, HEART_BOTTOM_Y);
printf(" XXX XXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 1);
printf("XXXXXXX XXXXXXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 2);
printf("XXXXXXXXXXXXXXXXXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 3);
printf(" XXXXXXXXXXXXXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 4);
printf(" XXXXXXXXXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 5);
printf(" XXXXXXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 6);
printf(" XXX");
cursorXY(HeartX, HEART_BOTTOM_Y + 7);
printf(" X");
}
// 장애물을 넘지 못하였을때의 게임오버 입니다.
void drawGameOver(const int score)
{
setColor(15, 0);
system("cls");
int x = 18;
int y = 8;
cursorXY(x, y);
printf("============== Game Over. ==============");
cursorXY(x, y + 1);
printf("========== THNK U FOR PLAYING ==========");
cursorXY(x, y + 2);
printf("============== Cheer UP! ===============");
cursorXY(x, y + 5);
printf("SCORE : %d", score);
printf("\n\n\n\n\n\n\n\n\n\n");
system("pause");
}
// 장애물의 충돌효과 구별 기능입니다.
bool isCollision(const int BarricadeX, const int chY)
{
cursorXY(0, 0);
setColor(7, 0);
printf("BarricadeX : %d, chY : %d\r\n", BarricadeX, chY);
printf("Jumping Key : Z");
if (BarricadeX <= 8 && BarricadeX >= 4 &&
chY > 8)
{
return true;
}
return false;
}
// 하트의 충돌효과 입니다.
bool isHeartCollision(const int HeartX, const int chY)
{
cursorXY(0, 0);
printf("HeartX : %d, chY : %d", HeartX, chY);
if (HeartX <= 8 && HeartX >= 4 &&
chY > 8)
{
return true;
}
return false;
}
// 오프닝 이벤트 입니다.
int openingEvent(void)
{
bool tik = true;
srand((unsigned int)time(NULL));
while(1)
{
if (tik)
{
cursorXY((rand() % 300) / 2, rand() % 40);
printf("*");
Sleep(100);
tik = false;
}
else
{
cursorXY(27, 23);
printf("play the game ? press ENTER key ");
if (getKeyDown() == 13) { break; }
tik = true;
}
}
}
//메인 함수입니다.
int main()
{
setConsoleView();
openingEvent();
while (true)
{
bool isJumping = false;
bool isBottom = true;
bool isBarricate = true;
const int gravity = 3;
int chY = CHARACTER_BOTTOM_Y;
int BarricadeX = BARRICADE_BOTTOM_X;
int HeartX = HEART_BOTTOM_X;
int score = 0;
clock_t start, curr;
start = clock();
while (true)
{
if (isCollision(BarricadeX, chY))
break;
if (isCollision(HeartX, chY))
{
heartHead = true;
score += 10;
}
if (getKeyDown() == 'z' && isBottom)
{
isJumping = true;
isBottom = false;
}
if (isJumping)
{
chY -= gravity;
}
else
{
chY += gravity;
}
if (chY >= CHARACTER_BOTTOM_Y)
{
chY = CHARACTER_BOTTOM_Y;
isBottom = true;
}
if (isBarricate)
{
BarricadeX -= 2;
}
else
{
HeartX -= 2;
}
if (BarricadeX <= 0)
{
BarricadeX = BARRICADE_BOTTOM_X;
heartHead = false;
isBarricate = false;
}
if (HeartX <= 5)
{
HeartX = HEART_BOTTOM_X;
isBarricate = true;
}
if (chY <= 3)
{
isJumping = false;
}
drawCH(chY);
if (isBarricate) {
drawBarricade(BarricadeX);
}
else {
drawHeart(HeartX);
}
curr = clock();
if (((curr - start) / CLOCKS_PER_SEC) >= 1)
{
score++;
start = clock();
}
Sleep(60);
system("cls");
setColor(15, 0);
cursorXY(22, 0);
printf("Score : %d ", score);
}
drawGameOver(score);
}
system("pause");
return 0;
}
|
cs |
출처 및 참고. 그외 볼 만한 사이트
색상 변경하는 법 과(CMD 색상표)
'🧑🏻💻 > C & C++' 카테고리의 다른 글
[C] 자료구조 / DFS / 깊이 우선 탐색 / DepthFirstSearch. (0) | 2020.07.24 |
---|---|
[C] 2차원 배열 malloc / free / 메모리 할당과 해제 (0) | 2020.07.10 |
[C++] ConsoleColor / setColor() / 색 넣는 함수 / how to change color in cmd (0) | 2020.06.24 |
[C++] C++ (0) | 2020.06.24 |
[C] system()함수 / cmd 명령어 / 명령 프롬프트 / 명령 줄 인터프리터 (0) | 2020.06.23 |