Skip to content

Commit fc94e5b

Browse files
committed
up
1 parent c926908 commit fc94e5b

4 files changed

Lines changed: 1855 additions & 79 deletions

File tree

oop-inheritance.ipynb

Lines changed: 179 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1713,7 +1713,7 @@
17131713
},
17141714
{
17151715
"cell_type": "code",
1716-
"execution_count": 29,
1716+
"execution_count": 30,
17171717
"id": "23fe2b1a",
17181718
"metadata": {},
17191719
"outputs": [
@@ -1794,6 +1794,184 @@
17941794
"3. 새로운 비행 방식 추가\n",
17951795
"4. 클래스 수 증가"
17961796
]
1797+
},
1798+
{
1799+
"cell_type": "markdown",
1800+
"metadata": {},
1801+
"source": [
1802+
"## 종합 연습문제"
1803+
]
1804+
},
1805+
{
1806+
"cell_type": "markdown",
1807+
"id": "city-guard-intro",
1808+
"metadata": {},
1809+
"source": [
1810+
"**도시 수호대의 마지막 임무**\n",
1811+
"\n",
1812+
"문자열 출력만 사용하는 간단한 텍스트 게임을 만든다.\n",
1813+
"아이언맨, 토르, 헐크는 서로 대화하고 격려하며, 도시를 위협하는 타이탄과 맞선다.\n",
1814+
"각 문제를 순서대로 해결하면 마지막 문제에서 하나의 이야기가 완성된다.\n",
1815+
"\n",
1816+
"이번 문제에서는 다음 관계를 활용한다.\n",
1817+
"\n",
1818+
"- `Human` → `Character` → `Hero`, `Villain`: 상속\n",
1819+
"- `Hero` → `TechHero`, `MagicHero`, `PowerHero`: 상속과 메서드 오버라이딩\n",
1820+
"- `Hero`가 `Flying` 객체를 속성으로 가짐: 구성\n",
1821+
"- 영웅과 악당이 서로를 메서드의 인자로 사용: 객체 사이의 상호작용\n",
1822+
"\n",
1823+
":::{note}\n",
1824+
"모든 체력은 `0` 이상 `100` 이하로 관리한다.\n",
1825+
"신뢰도는 `0`보다 작아지지 않으며, 두 영웅의 신뢰도가 모두 `2` 이상이어야 협동 공격을 사용할 수 있다.\n",
1826+
":::"
1827+
]
1828+
},
1829+
{
1830+
"cell_type": "markdown",
1831+
"id": "city-guard-q1",
1832+
"metadata": {},
1833+
"source": [
1834+
"**문제 1: 공통 전투 캐릭터**\n",
1835+
"\n",
1836+
"`Human`을 상속하는 `Character` 클래스를 정의하라.\n",
1837+
"\n",
1838+
"- `super()`를 이용하여 `name`, `age`, `gender`를 초기화한다.\n",
1839+
"- `health`와 `damage` 속성을 추가한다.\n",
1840+
"- `is_alive()`는 체력이 0보다 크면 `True`를 반환한다.\n",
1841+
"- `take_damage(amount)`는 체력을 감소시키되 0보다 작아지지 않게 한다.\n",
1842+
"- 공격받은 이름, 피해량, 남은 체력을 문자열로 출력한다."
1843+
]
1844+
},
1845+
{
1846+
"cell_type": "markdown",
1847+
"id": "city-guard-q2",
1848+
"metadata": {},
1849+
"source": [
1850+
"**문제 2: 영웅과 악당**\n",
1851+
"\n",
1852+
"`Character`를 상속하는 `Hero`와 `Villain` 클래스를 정의하라.\n",
1853+
"\n",
1854+
"`Hero`는 `power`, `trust`, `flying` 속성을 추가로 갖는다.\n",
1855+
"`trust`의 초깃값은 0이고 `flying`의 기본값은 `None`이다.\n",
1856+
"`Villain`은 악당의 목적을 저장하는 `goal` 속성을 추가로 갖는다.\n",
1857+
"두 클래스에서 `introduction()`을 오버라이딩하여 다음 형식으로 출력하라.\n",
1858+
"\n",
1859+
"```text\n",
1860+
"[영웅] 아이언맨 | 체력: 100 | 능력치: 90 | 신뢰도: 0\n",
1861+
"[악당] 타이탄 | 체력: 100 | 목적: 도시의 에너지를 차지한다\n",
1862+
"```"
1863+
]
1864+
},
1865+
{
1866+
"cell_type": "markdown",
1867+
"id": "city-guard-q3",
1868+
"metadata": {},
1869+
"source": [
1870+
"**문제 3: 서로 다른 유형의 영웅**\n",
1871+
"\n",
1872+
"`Hero`를 상속하는 `TechHero`, `MagicHero`, `PowerHero` 클래스를 정의하라.\n",
1873+
"각 클래스에서 `specialty()` 메서드를 서로 다르게 오버라이딩한다.\n",
1874+
"\n",
1875+
"```text\n",
1876+
"아이언맨: 첨단 장비로 상황을 분석합니다.\n",
1877+
"토르: 번개의 힘을 불러옵니다.\n",
1878+
"헐크: 강한 힘으로 장애물을 부숩니다.\n",
1879+
"```"
1880+
]
1881+
},
1882+
{
1883+
"cell_type": "markdown",
1884+
"id": "city-guard-q4",
1885+
"metadata": {},
1886+
"source": [
1887+
"**문제 4: 대화, 격려, 반응**\n",
1888+
"\n",
1889+
"`Hero` 클래스에 추가할 다음 메서드를 정의하라.\n",
1890+
"\n",
1891+
"- `talk(other, message)`: 다른 영웅에게 메시지를 전달한다.\n",
1892+
"- `encourage(other)`: 상대의 체력을 최대 100까지 10 증가시키고 신뢰도를 1 증가시킨다.\n",
1893+
"- `respond()`: 신뢰도 0이면 `\"아직 혼자 싸우는 편이 낫겠어.\"`, 1~2이면 `\"조금은 믿어도 될 것 같아.\"`, 3 이상이면 `\"우리는 한 팀이야.\"`를 출력한다."
1894+
]
1895+
},
1896+
{
1897+
"cell_type": "markdown",
1898+
"id": "city-guard-q5",
1899+
"metadata": {},
1900+
"source": [
1901+
"**문제 5: 비행 능력을 이용한 동료 구조**\n",
1902+
"\n",
1903+
"`Hero` 클래스에 추가할 `rescue(other)` 메서드를 정의하라.\n",
1904+
"\n",
1905+
"- `flying`이 `None`이면 구조 실패 메시지를 출력하고 `False`를 반환한다.\n",
1906+
"- 비행 능력이 있으면 `self.flying.fly()`에 동작을 위임한다.\n",
1907+
"- 구조에 성공하면 두 영웅의 신뢰도를 각각 1 증가시키고 `True`를 반환한다."
1908+
]
1909+
},
1910+
{
1911+
"cell_type": "markdown",
1912+
"id": "city-guard-q6",
1913+
"metadata": {},
1914+
"source": [
1915+
"**문제 6: 악당의 위협과 공격**\n",
1916+
"\n",
1917+
"`Villain` 클래스에 추가할 `threaten(heroes)`와 `attack(other)` 메서드를 정의하라.\n",
1918+
"`threaten()`은 모든 영웅의 이름을 언급하고, `attack()`은 대상의 `take_damage()`를 호출한다.\n",
1919+
"\n",
1920+
"```text\n",
1921+
"타이탄: 아이언맨, 토르, 헐크! 너희는 나를 막을 수 없다!\n",
1922+
"타이탄이 헐크를 공격합니다!\n",
1923+
"헐크: 25의 피해를 받았습니다. 남은 체력: 75\n",
1924+
"```"
1925+
]
1926+
},
1927+
{
1928+
"cell_type": "markdown",
1929+
"id": "city-guard-q7",
1930+
"metadata": {},
1931+
"source": [
1932+
"**문제 7: 갈등과 화해**\n",
1933+
"\n",
1934+
"`Hero` 클래스에 추가할 `disagree(other)`와 `reconcile(other)` 메서드를 정의하라.\n",
1935+
"\n",
1936+
"- `disagree()`는 두 영웅의 신뢰도를 각각 1 감소시키되 0보다 작아지지 않게 한다.\n",
1937+
"- `reconcile()`은 두 영웅의 신뢰도를 각각 1 증가시킨다.\n",
1938+
"- 두 메서드 모두 영웅 사이의 대화를 문자열로 출력한다."
1939+
]
1940+
},
1941+
{
1942+
"cell_type": "markdown",
1943+
"id": "city-guard-q8",
1944+
"metadata": {},
1945+
"source": [
1946+
"**문제 8: 신뢰를 이용한 협동 공격**\n",
1947+
"\n",
1948+
"`Hero` 클래스에 추가할 `team_attack(other, villain)` 메서드를 정의하라.\n",
1949+
"\n",
1950+
"- 두 영웅의 신뢰도가 모두 2 이상일 때만 성공한다.\n",
1951+
"- 협동 공격력은 `(self.power + other.power) // 2`이다.\n",
1952+
"- 성공하면 악당의 `take_damage()`를 호출하고 `True`를 반환한다.\n",
1953+
"- 신뢰가 부족하면 실패 메시지를 출력하고 `False`를 반환한다."
1954+
]
1955+
},
1956+
{
1957+
"cell_type": "markdown",
1958+
"id": "city-guard-q9",
1959+
"metadata": {},
1960+
"source": [
1961+
"**문제 9: 최종 텍스트 게임 완성**\n",
1962+
"\n",
1963+
"지금까지 구현한 내용을 하나의 프로그램으로 완성하라.\n",
1964+
"\n",
1965+
"1. 세 영웅과 타이탄을 생성한다.\n",
1966+
"2. 모든 캐릭터가 자기소개한다.\n",
1967+
"3. 타이탄이 영웅들을 위협하고 헐크를 공격한다.\n",
1968+
"4. 아이언맨과 토르가 작전 방식 때문에 다툰다.\n",
1969+
"5. 토르가 헐크를 격려하고 아이언맨이 헐크를 구조한다.\n",
1970+
"6. 아이언맨과 토르가 화해하고 서로를 격려한다.\n",
1971+
"7. 세 영웅의 체력과 신뢰도를 출력한다.\n",
1972+
"8. 아이언맨과 토르가 협동 공격을 사용한다.\n",
1973+
"9. 타이탄의 체력이 0이면 임무 성공을 출력한다."
1974+
]
17971975
}
17981976
],
17991977
"metadata": {

0 commit comments

Comments
 (0)