회사 노트북 보안 때문에 구글 대신 클로드와 파이썬으로 완성한 카드게임

  • 소개 (시도한 내용과 동기)

    • 원래는 Google AI Studio의 Build apps with Gemini 기능으로 웹 기반 카드 게임을 만들어보고 싶었음

    • 하지만 회사 노트북 보안 문제로 Google AI Studio 로그인 자체가 불가능 → 계획 수정 필요

    • 결국 웹 대신 로컬 환경에서 클로드 + 파이썬 조합으로 과제 완수

  • 진행 방법 (사용한 도구, 프롬프트, 코드 등)

    • 모각에서 공유된 예시 프롬프트를 활용

    • 프롬프트를 구체적으로 작성하는 것의 중요성을 체감

    • MCP 설치 여부를 고민했지만, 클로드에게 바로 프롬프트를 전달 → 예상대로 py 파일 생성됨

      중국 사전 - 스크린 샷 썸네일
      한국어 앱의 스크린 샷
      한국어 문자 메시지의 스크린 샷
    • 파이썬 실행 과정에서 폴더 경로 문제를 경험 → 앞으로 터미널에서 경로를 직접 실행하는 방법을 익힐 필요성 확인

    여러 옵션이있는 창의 스크린 샷

    import tkinter as tk
    from tkinter import messagebox
    import random
    import time
    
    class MemoryCardGame:
        def __init__(self):
            self.root = tk.Tk()
            self.root.title("4x4 카드 맞추기 게임")
            self.root.geometry("600x700")
            self.root.configure(bg='#2c3e50')
            
            # 게임 변수들
            self.cards = []  # 카드 버튼들
            self.card_values = []  # 카드의 실제 값들
            self.flipped_cards = []  # 현재 뒤집힌 카드들
            self.matched_pairs = 0  # 맞춘 짝의 수
            self.attempts = 0  # 시도 횟수
            self.game_finished = False
            
            # 카드에 사용할 이모지들 (8쌍)
            self.symbols = ['🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼']
            
            self.setup_ui()
            self.new_game()
        
        def setup_ui(self):
            """UI 구성"""
            # 제목
            title_label = tk.Label(
                self.root, 
                text="4x4 카드 맞추기 게임", 
                font=('Arial', 20, 'bold'),
                bg='#2c3e50',
                fg='white'
            )
            title_label.pack(pady=20)
            
            # 게임 정보 프레임
            info_frame = tk.Frame(self.root, bg='#2c3e50')
            info_frame.pack(pady=10)
            
            # 시도 횟수 라벨
            self.attempts_label = tk.Label(
                info_frame,
                text="시도 횟수: 0",
                font=('Arial', 14),
                bg='#2c3e50',
                fg='white'
            )
            self.attempts_label.pack(side=tk.LEFT, padx=20)
            
            # 맞춘 짝 수 라벨
            self.pairs_label = tk.Label(
                info_frame,
                text="맞춘 짝: 0/8",
                font=('Arial', 14),
                bg='#2c3e50',
                fg='white'
            )
            self.pairs_label.pack(side=tk.LEFT, padx=20)
            
            # 게임 보드 프레임
            self.game_frame = tk.Frame(self.root, bg='#2c3e50')
            self.game_frame.pack(pady=20)
            
            # 새 게임 버튼
            new_game_btn = tk.Button(
                self.root,
                text="새 게임",
                font=('Arial', 14),
                bg='#3498db',
                fg='white',
                padx=20,
                pady=10,
                command=self.new_game
            )
            new_game_btn.pack(pady=20)
        
        def new_game(self):
            """새 게임 시작"""
            # 기존 카드 버튼들 제거
            for widget in self.game_frame.winfo_children():
                widget.destroy()
            
            # 게임 상태 초기화
            self.cards = []
            self.card_values = []
            self.flipped_cards = []
            self.matched_pairs = 0
            self.attempts = 0
            self.game_finished = False
            
            # 카드 값 생성 (각 심볼을 2개씩)
            values = self.symbols + self.symbols
            random.shuffle(values)
            
            # 4x4 그리드로 카드 생성
            for i in range(4):
                card_row = []
                value_row = []
                for j in range(4):
                    index = i * 4 + j
                    value = values[index]
                    
                    # 카드 버튼 생성
                    card = tk.Button(
                        self.game_frame,
                        text="?",
                        font=('Arial', 24, 'bold'),
                        width=4,
                        height=2,
                        bg='#34495e',
                        fg='white',
                        command=lambda row=i, col=j: self.flip_card(row, col)
                    )
                    card.grid(row=i, column=j, padx=2, pady=2)
                    
                    card_row.append(card)
                    value_row.append(value)
                
                self.cards.append(card_row)
                self.card_values.append(value_row)
            
            self.update_labels()
        
        def flip_card(self, row, col):
            """카드 뒤집기"""
            if self.game_finished:
                return
            
            card = self.cards[row][col]
            
            # 이미 뒤집힌 카드거나 매치된 카드인 경우 무시
            if (row, col) in self.flipped_cards or card['bg'] == '#27ae60':
                return
            
            # 이미 2장이 뒤집힌 상태인 경우 무시
            if len(self.flipped_cards) >= 2:
                return
            
            # 카드 뒤집기
            card.config(text=self.card_values[row][col], bg='#ecf0f1', fg='black')
            self.flipped_cards.append((row, col))
            
            # 2장이 뒤집힌 경우 확인
            if len(self.flipped_cards) == 2:
                self.root.after(1000, self.check_match)  # 1초 후 확인
        
        def check_match(self):
            """짝 맞는지 확인"""
            if len(self.flipped_cards) != 2:
                return
            
            row1, col1 = self.flipped_cards[0]
            row2, col2 = self.flipped_cards[1]
            
            card1 = self.cards[row1][col1]
            card2 = self.cards[row2][col2]
            
            value1 = self.card_values[row1][col1]
            value2 = self.card_values[row2][col2]
            
            self.attempts += 1
            
            if value1 == value2:
                # 짝이 맞는 경우
                card1.config(bg='#27ae60')  # 초록색으로 변경
                card2.config(bg='#27ae60')
                self.matched_pairs += 1
                
                # 게임 완료 확인
                if self.matched_pairs == 8:
                    self.game_finished = True
                    messagebox.showinfo(
                        "게임 완료!",
                        f"축하합니다! 게임을 완료했습니다!\n총 시도 횟수: {self.attempts}회"
                    )
            else:
                # 짝이 틀린 경우 - 카드를 다시 뒤집기
                card1.config(text="?", bg='#34495e', fg='white')
                card2.config(text="?", bg='#34495e', fg='white')
            
            # 뒤집힌 카드 목록 초기화
            self.flipped_cards = []
            self.update_labels()
        
        def update_labels(self):
            """라벨 업데이트"""
            self.attempts_label.config(text=f"시도 횟수: {self.attempts}")
            self.pairs_label.config(text=f"맞춘 짝: {self.matched_pairs}/8")
        
        def run(self):
            """게임 실행"""
            self.root.mainloop()
    
    # 게임 실행
    if __name__ == "__main__":
        game = MemoryCardGame()
        game.run()
    
  • 결과와 배운 점

    • 최종 결과물 (동물이 너무 많아서 다 맞추기가 어려움 ㅠㅠ)

      한국 컴퓨터 화면의 스크린 샷
    • AI 도구는 다양하지만, 어떤 도구를 선택하느냐가 결과에 큰 영향을 미친다는 점

    • 프롬프트의 디테일이 작업 효율을 크게 좌우한다는 깨달음

    • 파이썬은 범용성이 좋아서 AI 도구와 결합했을 때 큰 잠재력이 있음 → 앞으로도 계속 공부하고 활용할 계획

    • 코딩 관련 MPC를 설치했다면 다른 결과물이 나왔을까?😇

  • 도움 받은 글 (선택)

    • 모각에서 공유된 프롬프트 예시

4개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요