19살 예비 웹개발자 개발일지

C

[C] 줄다리기 게임

갱's 개발 모험 2021. 6. 8. 23:40
728x90

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키를 마구마구 연타하면 눌린 수많큼 함수가 따라가질 못해서 

스택으로 바꿔서 다시 만들고 싶다. 이거 말고도 할 게 너무 많아서 시간이 좀 난다면 다시 수정할 생각이다.

 

글로는 잘 설명 못해서 이해가 가지 않는 부분은 댓글로 물어보면 좋을 것 같다!!!!

(질문은 언제든지 대환영!!!!)

사실 잘알지는 못하지만... 내가 짠코드정돈 설명할 수 있다!!

728x90

'C' 카테고리의 다른 글

[C] C언어 배경음악  (0) 2021.06.18