IT쇼 콘솔 게임부분으로 나가게 되어서 "CPU_KINGDOM" 이란 이름으로 3학년, 2학년 친구들과 프로젝트를 진행했다.
총괄을 맡으면서 할 일이 많아서 조금 힘들긴 했지만 완성된 작품을 보니 뿌듯했다 ~~
내가 원하는 게임예제가 아예 없었다. 나와있는 코드들은 내가 눌러서 이동이 아닌 자동으로 움직이다 게임이 끝나는
예제 딱 하나밖에 없어서 내가 직접 만들어야 했다. ㅠㅠㅠ
1학년때 방과후로 잠깐배운것 빼곤 배운적이 없는데 2년뒤 C를 하려니 머리가 지끈지끈 ㅠㅠㅠ
그래도 틈틈이 한 결과 완성품을 만들었따~~
코드를 공유하려고 한다.
pushpull.c
#include "pushpull.h"
#include <conio.h>
#include<windows.h>
// _getch() value of ESC key
#define MAGIC_KEY 224
#define ESC 27
#define A 65
#define a 97
#define L 76
#define l 108
#define ENTER 13
void menu_draw(void);
void game_fun(void);
void start_game(void);
char key;
char t_name1[20];
char t_name2[20];
int x = 40;
int y = 11;
int win = 0;
int win_lose = 0;
int input = 0;
enum MENU
{
GAMESTART = 0,
RULE,
EXIT
};
enum KEYBOARD
{
UP = 72,
LEFT = 75,
RIGHT = 77,
DOWN = 80
};
// 게임 시작 메인 함수
void pushpull() {
system("cls");
while (1) {
switch (game()) {
case GAMESTART:
x = 40;
start_game();
break;
case RULE:
menu_draw();
break;
case EXIT:
main();
break;
}
}
return 0;
}
// 게임 설명 함수
void menu_draw() {
system("cls");
gotoxy(37, 5);
printf("★★★★★★★★★★ 줄다리기 ★★★★★★★★★");
printf("★");
gotoxy(37, 7);
printf("★ A키와 L키를 마구마구 연타!! ★");
gotoxy(37, 9);
printf("★ 줄을 가장 빨리 자기쪽으로 당기는 게임입니다! ★");
gotoxy(37, 11);
printf("★ 단판 승부! ★");
gotoxy(37, 13);
printf("★ 아무키나 눌러서 메뉴화면으로 돌아가세요 ★");
gotoxy(37, 15);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★");
char kk = _getch();
}
// 게임 메인화면 함수
void main_show() {
system("cls");
gotoxy(36, 10);
printf("★★★★★★★★★★ 줄다리기 ★★★★★★★★★★");
gotoxy(28, 10);
printf("●");
gotoxy(27, 11);
printf("\|/");
gotoxy(28, 12);
printf(" |");
gotoxy(28, 13);
printf("/\");
gotoxy(90, 10);
printf(" ●");
gotoxy(89, 11);
printf("\|/");
gotoxy(90, 12);
printf(" |");
gotoxy(90, 13);
printf("/\");
gotoxy(56, 13);
printf("게임 시작");
gotoxy(56, 15);
printf("게임 방법");
gotoxy(56, 17);
printf("게임 종료");
}
// 메뉴 선택 커서 함수
enum MENU game(){
int y = 0;
while (1){
main_show();
if (y <= 0)
{
y = 0;
}
else if (y >= 6)
{
y = 2;
}
gotoxy(53, 13 + y);
printf(">");
input = _getch();
if (input == MAGIC_KEY)
{
switch (_getch())
{
case UP:
gotoxy(53, 13 + y);
printf(" ");
y = y - 2;
break;
case DOWN:
gotoxy(53, 13 + y);
printf(" ");
y = y + 2;
break;
}
}
else if (input == 13)
{
switch (y)
{
case 0:
return GAMESTART;
case 2:
return RULE;
case 4:
return EXIT;
}
}
}
}
// 줄다리기 그려주는 함수
void line(int x, int y)
{
system("cls");
int i, line[21] = { 0 };
line[10] = 1;
line[4] = 2;
line[16] = 2;
gotoxy(31, 13);
for (i = 0; i < 78; i++)
printf(" ");
gotoxy(28, 8);
printf("%s", t_name1);
gotoxy(86, 8);
printf("%s", t_name2);
gotoxy(30, 10);
printf("●");
gotoxy(29, 11);
printf("\|/");
gotoxy(30, 12);
printf(" |");
gotoxy(30, 13);
printf("/\");
gotoxy(87, 10);
printf(" ●");
gotoxy(86, 11);
printf("\|/");
gotoxy(87, 12);
printf(" |");
gotoxy(87, 13);
printf("/\");
gotoxy(42, 2);
printf("움직이지 않는다면 한영키를 바꿔보세요!");
// x,y함수로 line그려줌 x =40, y = 11
gotoxy(x, y);
for (i = 0; i < 21; i++)
if (line[i] == 0)
printf("□");
else if (line[i] == 1)
printf("■");
else
printf("◆");
gotoxy(58, 8);
printf("기준점");
gotoxy(60, 10);
printf("▼");
gotoxy(60, 12);
printf("▲");
gotoxy(45, 19);
printf("메뉴로 돌아가려면 ESC를 눌러주세요\n");
char end = _getch();
if (end == ESC) {
pushpull();
}
}
void start_game() {
system("cls");
gotoxy(47, 10);
printf("시작 전 팀 이름을 정해주세요!\n");
gotoxy(47, 12);
printf("첫번째 팀 이름입력 후 엔터!> ");
scanf_s("%s", &t_name1, 20);
gotoxy(47, 14);
printf("두번째 팀 이름입력 후 엔터!> ");
scanf_s("%s", &t_name2, 20);
// 이름 입력 후 화면 지우기
system("cls");
//line 그려줌
line(x, y);
//게임함수 실행
game_fun();
}
void game_fun() {
while (1) {
char click = _getch();
switch (click) {
case 97: case 65: // A
x -= 2;
line(x, y);
Sleep(100);
if (x == 28) {
gotoxy(57, 15);
printf("%s 승리!", t_name1);
gotoxy(48, 17);
printf("2초 뒤 메인화면으로 돌아갑니다.");
Sleep(2000);
pushpull();
}
break;
case L: case l: // L
x += 2;
line(x, y);
Sleep(100);
if (x == 52) {
gotoxy(57, 15);
printf("%s 승리!", t_name2);
gotoxy(48, 17);
printf("2초 뒤 메인화면으로 돌아갑니다.");
Sleep(2000);
pushpull();
}
break;
case ESC:
pushpull();
}
}
}
pushpull.h
#pragma once
#include <stdio.h>
#include "modules.h"
void pushpull(void);
modules.h 파일에 gotoxy함수를 따로 빼주었다.
어찌저찌 하다보니 코드가 300줄 가까이 나왔다... ㅎㅎ
조금 불필요한 코드들을 줄이고, 정리하면 200줄 정도 나올 것 같다!
그리고 gotoxy 좌표값으로 조금 꾸미려고 하다보니 그렇게 나왔버렸다.... ㅎㅎ
여기서 코드설명을 좀 해보자면
void game_fun() {
while (1) {
char click = _getch();
switch (click) {
case 97: case 65: // A
x -= 2;
line(x, y);
Sleep(100);
if (x == 28) {
gotoxy(57, 15);
printf("%s 승리!", t_name1);
gotoxy(48, 17);
printf("2초 뒤 메인화면으로 돌아갑니다.");
Sleep(2000);
pushpull();
}
break;
case L: case l: // L
x += 2;
line(x, y);
Sleep(100);
if (x == 52) {
gotoxy(57, 15);
printf("%s 승리!", t_name2);
gotoxy(48, 17);
printf("2초 뒤 메인화면으로 돌아갑니다.");
Sleep(2000);
pushpull();
}
break;
case ESC:
pushpull();
}
}
}
이 코드가 이 게임의 핵심 코드이다.
case 문에 아스키코드, 문자로 해도 상관은 없다.
줄이 기준점을 넘겼는지 아닌지를 확인하는 로직이다.
A나 L키를 눌렀을 때 x값을 증가, 감소해 x값이 기준점과 동일한지를 계속해서 비교해 승패 결과를 Sleep을 활용해
2초 뒤 다시 메인화면인 pushpull로 돌아간다.
여기서 메뉴를 선택하는 함수를 구글링해서 만들었는데 참고했던 글이 보이지 않는다ㅠㅠ
찾으면 바로 글 올려두겠다!!
여기서 main() 함수는 프로젝트 메인으로 돌아가는 함수여서 그냥 종료하려면 exit(0); 값을 주면 된다.
그리고 줄다리기 선을 그리는 코드는 아래 글을 참고했다.
https://jaimemin.tistory.com/204
명품 C언어 프로젝트 8.10장 줄다리기 게임
/* 줄다리기 게임 프로그램 */ #include #include #include #include #include void gotoxy(int x, int y); double intro_game(char team_name[][7]); void display_line(int rand); void display_start(char t_na..
jaimemin.tistory.com
시간이 있다면 더 수정하고싶은 부분은 A, L키를 마구마구 연타하면 눌린 수많큼 함수가 따라가질 못해서
스택으로 바꿔서 다시 만들고 싶다. 이거 말고도 할 게 너무 많아서 시간이 좀 난다면 다시 수정할 생각이다.
글로는 잘 설명 못해서 이해가 가지 않는 부분은 댓글로 물어보면 좋을 것 같다!!!!
(질문은 언제든지 대환영!!!!)
사실 잘알지는 못하지만... 내가 짠코드정돈 설명할 수 있다!!
'C' 카테고리의 다른 글
[C] C언어 배경음악 (0) | 2021.06.18 |
---|