|
1713 | 1713 | }, |
1714 | 1714 | { |
1715 | 1715 | "cell_type": "code", |
1716 | | - "execution_count": 29, |
| 1716 | + "execution_count": 30, |
1717 | 1717 | "id": "23fe2b1a", |
1718 | 1718 | "metadata": {}, |
1719 | 1719 | "outputs": [ |
|
1794 | 1794 | "3. 새로운 비행 방식 추가\n", |
1795 | 1795 | "4. 클래스 수 증가" |
1796 | 1796 | ] |
| 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 | + ] |
1797 | 1975 | } |
1798 | 1976 | ], |
1799 | 1977 | "metadata": { |
|
0 commit comments