티스토리 뷰

수업 노트/python

pygame 으로 미니 게임 만들기

오리지날초이 2024. 7. 23. 08:24

 

pip install pygame

import pygame
import sys

# 초기화
pygame.init()

# 화면 설정
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('키보드 입력 예제')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)

# 텍스트 초기화
text = ""
text_surface = font.render(text, True, BLACK)

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_BACKSPACE:
                text = text[:-1]  # 마지막 문자 삭제
            else:
                text += event.unicode  # 입력된 키 추가
            text_surface = font.render(text, True, BLACK)  # 텍스트 렌더링

    # 화면 채우기
    screen.fill(WHITE)
    
    # 텍스트 화면에 그리기
    screen.blit(text_surface, (20, 20))
    
    # 화면 업데이트
    pygame.display.flip()

# 종료 처리
pygame.quit()
sys.exit()

 

 

 

 

 

import pygame
import random
import sys
import math

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('미니 축구 게임')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)

# 선수와 공 초기 설정
players = [[random.randint(0, WIDTH), random.randint(0, HEIGHT)] for _ in range(11)]
ball = [WIDTH // 2, HEIGHT // 2]
ball_target = [WIDTH // 2, HEIGHT // 2]
ball_speed = 5
ball_moving = False

def move_player(player):
    # 선수는 상하로만 움직임
    player[1] += random.randint(-10, 10)
    player[1] = max(0, min(HEIGHT, player[1]))

def move_ball():
    global ball_moving
    if ball_moving:
        dx = ball_target[0] - ball[0]
        dy = ball_target[1] - ball[1]
        distance = math.sqrt(dx**2 + dy**2)
        if distance < ball_speed:
            ball[0], ball[1] = ball_target
            ball_moving = False
        else:
            ball[0] += ball_speed * dx / distance
            ball[1] += ball_speed * dy / distance

def draw_players(screen):
    for player in players:
        text_surface = font.render('X', True, BLACK)
        screen.blit(text_surface, player)

def draw_ball(screen):
    text_surface = font.render('O', True, BLACK)
    screen.blit(text_surface, ball)

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_SPACE:
                # 공을 랜덤한 선수에게 패스
                target_player = random.choice(players)
                ball_target[0], ball_target[1] = target_player
                ball_moving = True

    # 선수들 움직임
    for player in players:
        move_player(player)

    # 공의 위치 업데이트
    move_ball()

    # 화면 그리기
    screen.fill(GREEN)  # 축구장 배경
    draw_players(screen)
    draw_ball(screen)

    # 화면 업데이트
    pygame.display.flip()

    # 프레임 조절
    pygame.time.delay(100)

# 종료 처리
pygame.quit()
sys.exit()

 

 

 

import pygame
import random
import sys
import math

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('미니 축구 게임')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)

# 선수와 공 초기 설정
players = [[random.randint(0, WIDTH), random.randint(0, HEIGHT), random.choice([-1, 1])] for _ in range(11)]
ball = [WIDTH // 2, HEIGHT // 2]
ball_target = [WIDTH // 2, HEIGHT // 2]
ball_speed = 15  # 공의 속도를 더 빠르게 설정
ball_moving = False

def move_player(player):
    # 선수는 상하로만 움직임, 끝에 도달하면 방향 반전
    player[1] += player[2] * random.randint(1, 5)  # 선수 움직임을 느리게 설정
    if player[1] <= 0 or player[1] >= HEIGHT:
        player[2] *= -1
    player[1] = max(0, min(HEIGHT, player[1]))

def move_ball():
    global ball_moving
    if ball_moving:
        dx = ball_target[0] - ball[0]
        dy = ball_target[1] - ball[1]
        distance = math.sqrt(dx**2 + dy**2)
        if distance < ball_speed:
            ball[0], ball[1] = ball_target
            ball_moving = False
        else:
            ball[0] += ball_speed * dx / distance
            ball[1] += ball_speed * dy / distance

def draw_players(screen):
    for i, player in enumerate(players):
        text_surface = font.render(str(i+1), True, BLACK)
        screen.blit(text_surface, player[:2])

def draw_ball(screen):
    text_surface = font.render('O', True, BLACK)
    screen.blit(text_surface, ball)

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_SPACE:
                # 공을 랜덤한 선수에게 패스
                target_player = random.choice(players)
                ball_target[0], ball_target[1] = target_player[:2]
                ball_moving = True
            elif pygame.K_1 <= event.key <= pygame.K_0 + len(players):
                # 특정 번호 입력 시 해당 선수에게 패스
                player_index = event.key - pygame.K_1
                ball_target[0], ball_target[1] = players[player_index][:2]
                ball_moving = True

    # 선수들 움직임
    for player in players:
        move_player(player)

    # 공의 위치 업데이트
    move_ball()

    # 화면 그리기
    screen.fill(GREEN)  # 축구장 배경
    draw_players(screen)
    draw_ball(screen)

    # 화면 업데이트
    pygame.display.flip()

    # 프레임 조절
    pygame.time.delay(100)

# 종료 처리
pygame.quit()
sys.exit()

 

 

import pygame
import random
import sys
import math

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 600, 800  # 경기장을 세로 직사각형으로 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('미니 축구 게임')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
YELLOW = (255, 255, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)
small_font = pygame.font.Font(None, 36)

# 선수와 공 초기 설정
players = [[random.randint(0, WIDTH), random.randint(0, HEIGHT), random.choice([-1, 1])] for _ in range(11)]
ball = [WIDTH // 2, HEIGHT // 2]
ball_target = [WIDTH // 2, HEIGHT // 2]
ball_speed = 15  # 공의 속도를 더 빠르게 설정
ball_moving = False

def move_player(player):
    # 선수는 상하로만 움직임, 끝에 도달하면 방향 반전
    player[1] += player[2] * random.randint(1, 5)  # 선수 움직임을 느리게 설정
    if player[1] <= 0 or player[1] >= HEIGHT:
        player[2] *= -1
    player[1] = max(0, min(HEIGHT, player[1]))

def move_ball():
    global ball_moving
    if ball_moving:
        dx = ball_target[0] - ball[0]
        dy = ball_target[1] - ball[1]
        distance = math.sqrt(dx**2 + dy**2)
        if distance < ball_speed:
            ball[0], ball[1] = ball_target
            ball_moving = False
        else:
            ball[0] += ball_speed * dx / distance
            ball[1] += ball_speed * dy / distance

def draw_players(screen):
    for i, player in enumerate(players):
        text_surface = font.render(str(i+1), True, BLACK)
        screen.blit(text_surface, player[:2])

def draw_ball(screen):
    text_surface = font.render('O', True, BLACK)
    screen.blit(text_surface, ball)

def draw_goalposts(screen):
    goal_width = WIDTH // 3
    goal_height = 20
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, 0, goal_width, goal_height))  # 상단 골대
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, HEIGHT - goal_height, goal_width, goal_height))  # 하단 골대

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif pygame.K_1 <= event.key <= pygame.K_0 + len(players):
                # 특정 번호 입력 시 해당 선수에게 패스
                player_index = event.key - pygame.K_1
                ball_target[0], ball_target[1] = players[player_index][:2]
                ball_moving = True

    # 선수들 움직임
    for player in players:
        move_player(player)

    # 공의 위치 업데이트
    move_ball()

    # 화면 그리기
    screen.fill(GREEN)  # 축구장 배경
    draw_goalposts(screen)  # 골대 그리기
    draw_players(screen)
    draw_ball(screen)

    # 화면 업데이트
    pygame.display.flip()

    # 프레임 조절
    pygame.time.delay(100)

# 종료 처리
pygame.quit()
sys.exit()

 

 

 

import pygame
import random
import sys
import math

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 600, 800  # 경기장을 세로 직사각형으로 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('미니 축구 게임')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
YELLOW = (255, 255, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)
small_font = pygame.font.Font(None, 36)

# 선수와 공 초기 설정
players = [[WIDTH // 2, HEIGHT // 20, 0]] + [[random.randint(0, WIDTH), random.randint(HEIGHT // 20, HEIGHT // 2), random.choice([-1, 1])] for _ in range(4)] + [[random.randint(0, WIDTH), random.randint(HEIGHT // 2, HEIGHT), random.choice([-1, 1])] for _ in range(6)]
ball = [WIDTH // 2, HEIGHT // 2]
ball_target = [WIDTH // 2, HEIGHT // 2]
ball_speed = 15  # 공의 속도를 더 빠르게 설정
ball_moving = False

def move_player(player, is_defender=False):
    # 골키퍼는 움직이지 않음
    if player == players[0]:
        return
    # 수비수는 상단 부분에서만 움직임
    if is_defender:
        player[1] += player[2] * random.randint(1, 5)  # 선수 움직임을 느리게 설정
        if player[1] <= HEIGHT // 20 or player[1] >= HEIGHT // 2:
            player[2] *= -1
        player[1] = max(HEIGHT // 20, min(HEIGHT // 2, player[1]))
    else:
        player[1] += player[2] * random.randint(1, 5)  # 선수 움직임을 느리게 설정
        if player[1] <= 0 or player[1] >= HEIGHT:
            player[2] *= -1
        player[1] = max(0, min(HEIGHT, player[1]))

def move_ball():
    global ball_moving
    if ball_moving:
        dx = ball_target[0] - ball[0]
        dy = ball_target[1] - ball[1]
        distance = math.sqrt(dx**2 + dy**2)
        if distance < ball_speed:
            ball[0], ball[1] = ball_target
            ball_moving = False
        else:
            ball[0] += ball_speed * dx / distance
            ball[1] += ball_speed * dy / distance

def draw_players(screen):
    for i, player in enumerate(players):
        text_surface = font.render(str(i+1), True, BLACK)
        screen.blit(text_surface, player[:2])

def draw_ball(screen):
    text_surface = font.render('O', True, BLACK)
    screen.blit(text_surface, ball)

def draw_goalposts(screen):
    goal_width = WIDTH // 3
    goal_height = 20
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, 0, goal_width, goal_height))  # 상단 골대
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, HEIGHT - goal_height, goal_width, goal_height))  # 하단 골대

def draw_half_line(screen):
    pygame.draw.line(screen, WHITE, (0, HEIGHT // 2), (WIDTH, HEIGHT // 2), 5)

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif pygame.K_1 <= event.key <= pygame.K_0 + len(players):
                # 특정 번호 입력 시 해당 선수에게 패스
                player_index = event.key - pygame.K_1
                ball_target[0], ball_target[1] = players[player_index][:2]
                ball_moving = True

    # 선수들 움직임
    for i, player in enumerate(players):
        if 1 <= i <= 4:
            move_player(player, is_defender=True)
        else:
            move_player(player)

    # 공의 위치 업데이트
    move_ball()

    # 화면 그리기
    screen.fill(GREEN)  # 축구장 배경
    draw_goalposts(screen)  # 골대 그리기
    draw_half_line(screen)  # 하프라인 그리기
    draw_players(screen)
    draw_ball(screen)

    # 화면 업데이트
    pygame.display.flip()

    # 프레임 조절
    pygame.time.delay(100)

# 종료 처리
pygame.quit()
sys.exit()

 

 

 

 

여러가지를 수정했지만 동작하지 않음

import pygame
import random
import sys
import math

# 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 600, 800  # 경기장을 세로 직사각형으로 설정
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('미니 축구 게임')

# 색상 설정
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
YELLOW = (255, 255, 0)

# 폰트 설정
font = pygame.font.Font(None, 74)
small_font = pygame.font.Font(None, 36)

# 선수와 공 초기 설정
def create_defenders():
    return [
        [random.randint(0, WIDTH), random.randint(HEIGHT // 20, HEIGHT // 2), random.choice([-1, 1])]
        for _ in range(4)
    ]

def create_midfielders():
    mid_y_top = HEIGHT // 2 - int(HEIGHT * 0.3)
    mid_y_bottom = HEIGHT // 2 + int(HEIGHT * 0.3)
    return [
        [random.randint(0, WIDTH), random.randint(mid_y_top, mid_y_bottom), random.choice([-1, 1])]
        for _ in range(3)
    ]

def create_attackers():
    att_y_top = HEIGHT * 0.7
    att_y_bottom = HEIGHT
    return [
        [random.randint(0, WIDTH), random.randint(int(att_y_top), int(att_y_bottom)), random.choice([-1, 1])]
        for _ in range(3)
    ]

players = [
    [WIDTH // 2, HEIGHT // 20, 0],  # 골키퍼 (1번)
] + create_defenders() + create_midfielders() + create_attackers()

ball = [WIDTH // 2, HEIGHT // 2]
ball_target = [WIDTH // 2, HEIGHT // 2]
ball_speed = 15  # 공의 속도를 더 빠르게 설정
ball_moving = False
input_text = ""

def move_player(player, is_defender=False, is_midfielder=False, is_attacker=False):
    if player == players[0]:
        return  # 골키퍼는 움직이지 않음
    
    if is_defender:
        # 수비수는 상단 부분에서만 움직임
        player[1] += player[2] * random.randint(1, 5)
        if player[1] <= HEIGHT // 20 or player[1] >= HEIGHT // 2:
            player[2] *= -1
        player[1] = max(HEIGHT // 20, min(HEIGHT // 2, player[1]))
    elif is_midfielder:
        # 미드필더는 하프라인 위아래로 30% 내에서만 움직임
        player[1] += player[2] * random.randint(1, 5)
        if player[1] <= HEIGHT // 2 - int(HEIGHT * 0.3) or player[1] >= HEIGHT // 2 + int(HEIGHT * 0.3):
            player[2] *= -1
        player[1] = max(HEIGHT // 2 - int(HEIGHT * 0.3), min(HEIGHT // 2 + int(HEIGHT * 0.3), player[1]))
    elif is_attacker:
        # 공격수는 하단 30% 내에서만 움직임
        player[1] += player[2] * random.randint(1, 5)
        if player[1] <= int(HEIGHT * 0.7) or player[1] >= HEIGHT:
            player[2] *= -1
        player[1] = max(int(HEIGHT * 0.7), min(HEIGHT, player[1]))
    else:
        # 기타 선수는 경기장 전체에서 움직임
        player[1] += player[2] * random.randint(1, 5)
        if player[1] <= 0 or player[1] >= HEIGHT:
            player[2] *= -1
        player[1] = max(0, min(HEIGHT, player[1]))

def move_ball():
    global ball_moving
    if ball_moving:
        dx = ball_target[0] - ball[0]
        dy = ball_target[1] - ball[1]
        distance = math.sqrt(dx**2 + dy**2)
        if distance < ball_speed:
            ball[0], ball[1] = ball_target
            ball_moving = False
        else:
            ball[0] += ball_speed * dx / distance
            ball[1] += ball_speed * dy / distance

def draw_players(screen):
    for i, player in enumerate(players):
        if i == 9:
            text_surface = font.render('a', True, BLACK)  # 10번 선수
        elif i == 10:
            text_surface = font.render('b', True, BLACK)  # 11번 선수
        else:
            text_surface = font.render(str(i+1), True, BLACK)  # 나머지 선수들
        screen.blit(text_surface, player[:2])

def draw_ball(screen):
    text_surface = font.render('O', True, BLACK)
    screen.blit(text_surface, ball)

def draw_goalposts(screen):
    goal_width = WIDTH // 3
    goal_height = 20
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, 0, goal_width, goal_height))  # 상단 골대
    pygame.draw.rect(screen, YELLOW, (WIDTH // 3, HEIGHT - goal_height, goal_width, goal_height))  # 하단 골대

def draw_half_line(screen):
    pygame.draw.line(screen, WHITE, (0, HEIGHT // 2), (WIDTH, HEIGHT // 2), 5)

# 메인 루프
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            elif event.key == pygame.K_RETURN:
                # 엔터 키를 누르면 입력된 번호로 공을 패스
                if input_text.isdigit():
                    player_index = int(input_text) - 1
                    if 0 <= player_index < len(players):
                        ball_target[0], ball_target[1] = players[player_index][:2]
                        ball_moving = True
                elif input_text.lower() in ['a', 'b']:
                    player_index = 9 if input_text.lower() == 'a' else 10
                    ball_target[0], ball_target[1] = players[player_index][:2]
                    ball_moving = True
                input_text = ""
            elif event.key in [pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4, pygame.K_5, pygame.K_6, pygame.K_7, pygame.K_8, pygame.K_9]:
                # 숫자 키를 입력받아 저장
                input_text += event.unicode
            elif event.key == pygame.K_a or event.key == pygame.K_b:
                # 'a'와 'b' 키 입력받기
                input_text += event.unicode

    # 선수들 움직임
    for i, player in enumerate(players):
        if i == 0:
            continue  # 골키퍼는 움직이지 않음
        elif 1 <= i <= 4:
            move_player(player, is_defender=True)
        elif 5 <= i <= 7:
            move_player(player, is_midfielder=True)
        else:
            move_player(player, is_attacker=True)

    # 공의 위치 업데이트
    move_ball()

    # 화면 그리기
    screen.fill(GREEN)  # 축구장 배경
    draw_goalposts(screen)  # 골대 그리기
    draw_half_line(screen)  # 하프라인 그리기
    draw_players(screen)
    draw_ball(screen)

    # 화면 업데이트
    pygame.display.flip()

    # 프레임 조절
    pygame.time.delay(100)

# 종료 처리
pygame.quit()
sys.exit()

 

 

 

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함