n명이하는 한글 끝말잇기 게임을 작성해보자. 선수의 수를 입력받고 선수 각 사람의 이름을 입력받아 시작한다.
출력형태
게임에 참가하는 인원은 몇명입니까? 3
참가자 이름을 입력하세요. 빈칸없이 >> 이순신
참가자 이름을 입력하세요. 빈칸없이 >> 장영실
참가자 이름을 입력하세요. 빈칸없이 >> 윤봉길
시작하는 단어는 아버지 입니다.
이순신>>지우개
장영실>>개나리
윤봉길>>리본
이순신>>본죽
장영실>>주리
장영실이 패 하였습니다.
player 클래스 : 선수를 표현하는 클래스,
1) 이름 변수와 두 문자열을 받아 비교하여 성공여부를 반환해주는 함수로 구성되어있다.
main() 함수 : 게임에 참가하는 player를 동적할당받아
1) 각각의 선수 이름을 입력받아 이름을 설정하고
2) 끝말잇기 문자열을 입력받음(함수 호출)
3) 돌려받은 성공여부에따라 계속진행하던가 게임을 종료함
한글 끝말잇기 문제 해결
한글은 2바이트 코드로 저장되므로 string객체에 저장된 한글 문자열에서 끝자리와 첫자리를 비교하려면
두 바이트를 함께 비교해야한다. string 객체에 인덱스는 0부터 시작한다.
string a = "아버지"
string b = "지우개"
if (a.at(j - 2) == b.at(0) && a.at(j - 1) == b.at(1))
{
//끝말잇기 성공}
else //실패
위에 힌트를 사용해 그대로 풀어본 예제
#include <iostream>
#include <string>
using namespace std;
class Player {
string m_name;
public:
void setName(string m_name) { this->m_name = m_name; }
string getName() { return m_name; }
void isSuccess(Player* p,int num);
};
void Player::isSuccess(Player* p,int num) {
string a = "아버지";
string b = "지우개";
int i = 0;
while (true) {
cout << p[i%num].getName() << ">>";
cin >> b;
int j = a.length();
if (a.at(j - 2) == b.at(0) && a.at(j - 1) == b.at(1)) {
a = b;
}
else {
cout << p[i % num].getName() << "이 패하였습니다.";
break;
}
i++;
}
}
int main() {
int num;
cout << "게임에 참가하는 인원은 몇명입니까? ";
cin >> num;
Player* player = new Player[num];
Player* play = player;
string playerName;
int i = 0;
for (i = 0; i < num; i++) {
cout << "참가자 이름을 입력하세요. 빈칸없이 >> ";
cin >> playerName;
player[i].setName(playerName);
}
cout << "시작하는 단어는 아버지입니다" << endl;
player->isSuccess(play, num);
delete[]player;
return 0;
}
또 다른 클래스를 주어서 출력
#include <iostream>
#include <string>
using namespace std;
class Player {
string name;
public:
void setName(string name) { this->name = name; }
string getName() { return name; }
};
class LetsGame {
Player* p;
int num;
public:
LetsGame(int num);
~LetsGame() { delete[] p; }
void game();
};
LetsGame::LetsGame(int num) {
this->num = num;
p = new Player[num];
}
void LetsGame::game() {
string n;
for (int i = 0; i < num; i++) {
cout << "참가자의 이름을 입력하세요. 빈칸 없이>> ";
cin >> n;
p[i].setName(n);
}
cout << endl;
cout << "시작하는 단어는 아버지입니다" << endl;
string a = "아버지";
string b;
int i = 0;
while (true) {
cout << p[i % num].getName() << ">>";
cin >> b;
//if (a.at(4) == b.at(0) && a.at(5) == b.at(1))
int j = a.length();
//한글 문자열에서 끝자리와 첫자리를 비교하려면 두 바이트를 함께 비교
if (a.at(j - 2) == b.at(0) && a.at(j - 1) == b.at(1)) {
a = b;
}
else {
cout << p[i % num].getName() << "이 패 하였습니다" << endl;
break;
}
i++;
}
}
int main() {
cout << "게임에 참가하는 인원은 몇명입니까?";
int num;
cin >> num;
LetsGame startgame(num);
startgame.game();
}
'Programming > C++' 카테고리의 다른 글
C++ 입출력스트림 (0) | 2021.04.23 |
---|---|
C++ 상속 - 업캐스팅, 다운캐스팅, protected 접근지정자 (0) | 2021.04.21 |
C++ static (0) | 2021.04.21 |
C++ 얕은복사 깊은복사 (0) | 2021.04.21 |
C++ 참조자 (0) | 2021.04.20 |
댓글