ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 결!합! C++로 만들기-로비, 게임 설명/설정
    게임개발 2021. 4. 2. 15:59

    결!합!은 더 지니어스에 나온 게임이다. 1:1 매치지만, 서버를 팔 수는 없는 노릇이기에 1인용으로 각색하게 되었다.

    규칙은 다음 링크를 참고하자(실제 게임 설명도 저렇다)

    www.acmicpc.net/problem/16722

     

    16722번: 결! 합!

    위 입력에서 '합'을 이루는 모든 그림 조합은 (1,5,6), (2,3,5), (2,4,6), (2,7,9), (6,8,9) 5가지가 있다.

    www.acmicpc.net

    다만 더 지니어스의 숫자 번호와 키보드의 숫자 번호 배열이 다르기 때문에, 다음과 같은 대체 문자를 사용하였다.

    qwe

    asd

    zxc

    그냥 키보드 왼쪽 3줄이다.

    그리고 charcode라는 배열에 이들 각각의 번호 코드를 저장하였다.

    for (int i = 0; i < 26; i++)charcode[i] = -1;
    charcode['q' - 'a'] = 0;
    charcode['w' - 'a'] = 1;
    charcode['e' - 'a'] = 2;
    charcode['a' - 'a'] = 3;
    charcode['s' - 'a'] = 4;
    charcode['d' - 'a'] = 5;
    charcode['z' - 'a'] = 6;
    charcode['x' - 'a'] = 7;
    charcode['c' - 'a'] = 8;

    유효하지 않은 코드는 -1, 그 외에는 0~8을 저장하였다.

    #include<windows.h>
    #include<cstdio>
    #include<string>
    #include<ctime>
    #include<cstdlib>
    #include<conio.h>
    #include<set>

     

    헤더가 정말 크고 아름답다. 다 쓸데가 있기는 하다. 내가 개발하는 visual studio는 bits/stdc++.h가 없기 때문에 다 해 줘야 한다.

     

    이제 로비를 만들자. 로비 화면에는 전 포스팅에서 설명한 oneprint함수를 사용하였다.

    title:
    	clear();
    	str = "[결!합! 1인.ver]by.ComPhyPark\n시작:a\n설명:s\n설정:d\n종료:x";
    	oneprint();
    	ch = 'a';
    	while (1) {
    		ch = _getch();
    		switch (ch) {
    		case 'a':
    		case 'A':
    			goto start;
    		case 's':
    		case 'S':
    			goto description;
    		case 'd':
    		case 'D':
    			goto option;
    		case 'x':
    		case 'X':
    			goto ended;
    		default:
    			break;
    		}
    	}

    메인 화면이다

    다시 title로 올 수 있기 때문에, 후에 goto를 이용해 메인 화면으로 갈 수 있도록 하였다. 메인 타이틀을 출력하였고, getch로 무엇을 눌렀는지 받아서 switch문을 통해 이후 행동을 결정하였다.

     

    s를 누르면 설명을 볼 수 있는데, 설명의 코드는 간단하다.

    설명을 보여주고, 특정 키를 누르면 메인으로 돌아가게 하면 된다.

     

    description:
    	clear();
    	str = "기본적인 규칙은 다음 링크를 참고하십시오.\n{https://www.acmicpc.net/problem/16722}\n단, 이 게임에서는 위치와 숫자의 혼란을 방지하기 위해 번호 대신 다음과 같은 대체 문자를 사용합니다.\n";
    	oneprint();
    	printf("1-q 2-w 3-e\n4-a 5-s 6-d\n7-z 8-x 9-c\n");
    	str = "이 코드는 실제 키보드 상에서 3*3 사각형 내에 존재하는 세 숫자입니다.\n\'합\'의 경우 숫자와 연결된 문자 3개를 누르기만 하면 됩니다.\n\'결\'의 경우 enter를 누르면 결이 입력됩니다.\n";
    	oneprint();
    	printf("x: 메인으로 돌아가기");
    	while (1) {
    		ch = _getch();
    		if (ch == 'x' || ch == 'X') {
    			clear();
    			goto title;
    		}
    	}

    설명이 이런 식으로 나온다

    메인에서 d를 누르면 설정을 할 수 있는데, 별 건 없고 모드만 바꾸는 것이다. 모드의 이름은 배열에 저장해 두었다.

    const int nom = 3;
    string mode[nom] = { "타임어택","원라이프","아케이드" };

    후에 모드가 추가될 수도 있으므로, nom이라는 int형 상수를 정의해서, 모드가 추가되더라도 수정의 귀찮음을 줄일 수 있다.

    option:
    	clear();
    	str = "<모드>\n<-(a)--" + mode[mode_num] + "--(d)->\nx:메인으로 돌아가기";
    	oneprint();
    	while (1) {
    		ch = _getch();
    		switch (ch) {
    		case 'a':
    		case 'A':
    			mode_num--;
    			if (mode_num < 0)mode_num += nom;
    			break;
    		case 'd':
    		case 'D':
    			mode_num++;
    			if (mode_num >= nom)mode_num -= nom;
    			break;
    		case 'x':
    		case 'X':
    			goto title;
    		}
    		gotoxy(7, 1);
    		strpr(mode[mode_num]);
    		gotoxy(0, 3);
    	}
    	ch = _getch();
    	goto title;

    mode_num은 모드 번호이다. 'a'키나 'd'키를 눌러 모드를 바꿀 수 있고, 'x'를 누르면 조의를 표하기보다는 메인으로 돌아간다.

     

    설정은 이런 식으로 가능하다

    메인에서 s를 누르면 게임이 시작되며,

    To be continued.

    댓글

Designed by Tistory.