게임 보드 생성을 위해 파이썬에서 파이 게임을 사용하여 여러 선의 모든 교차점 찾기

shyckh

내 코드에서 줄의 모든 교차점을 찾아야합니다. 이 시점에서 나는 내 게임 조각을 넣고 싶습니다. 게임의 논리는 틱택 토 (tic tac toe)와 비슷합니다. 플레이어가 같은 색의 구슬 3 개를 연속으로 배치하면 순서대로 배열되지 않은 다른 플레이어의 조각을 잡을 수 있습니다.

지금까지 내 코드 :

import pygame
 
# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
 
# This sets the WIDTH and HEIGHT of each grid location
WIDTH = 20
HEIGHT = 20
 
# This sets the margin between each cell
MARGIN = 5
 
# Create a 2 dimensional array. A two dimensional
# array is simply a list of lists.
grid = []
for row in range(19):
    # Add an empty array that will hold each cell
    # in this row
    grid.append([])
    for column in range(19):
        grid[row].append(0)  # Append a cell
 
# Set row 1, cell 5 to one. (Remember rows and
# column numbers start at zero.)
grid[1][5] = 1
 
pygame.init()
WINDOW_SIZE = [800, 600]
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("Array Backed Grid")
done = False
clock = pygame.time.Clock()
while not done:
    # Set the screen background
    screen.fill(BLACK)
 
    # Draw the grid
    for row in range(19):
        for column in range(19):
            color = WHITE
            if grid[row][column] == 1:
                color = GREEN
                board_lines = [
                                ( 13,15,462,15 ), ( 13,469,462,469 ), #lin1 and line2,outer rect
                                ( 62,86,409,86 ), ( 62,389,409,389 ), #line3 and l4,mid reect
                                ( 114,186,360,186 ), ( 114,318,360,318 ), #line5,l6,internl rect
                                ( 13,15,13,469 ), ( 462,12,462,469 ), #line9,l10,left and right sides
                                ( 62,86,62,389 ), ( 409,85,409,389 ), #l7,l8left and right sides
                                ( 114,186,114,316), ( 360,187,360,318 ), #l11,lin12left and right sides
                                ( 237,15,237,186 ), ( 237,469,237,320 ), #upper V.line,lowerV
                                ( 13,242,113,242 ), ( 360,242,462,242 ) #rIGHT LEFT hoRIZONTAL LINE
                                 ] 
                                
                for line in board_lines:
                    line_from = ( line[0], line[1] )
                    line_to   = ( line[2], line[3] )
                    pygame.draw.line( screen, RED, line_from, line_to, 3)

    # Limit to 60 frames per second
    clock.tick(60)
    pygame.display.flip()
 
pygame.quit()
Rabbid76

다음 함수는 점 ( P0, P1) 및 ( Q0, Q1) 로 주어진 두 선의 교차점을 계산합니다 .

def lineLineIntersect(P0, P1, Q0, Q1):  
    d = (P1[0]-P0[0]) * (Q1[1]-Q0[1]) + (P1[1]-P0[1]) * (Q0[0]-Q1[0]) 
    if d == 0:
        return None
    t = ((Q0[0]-P0[0]) * (Q1[1]-Q0[1]) + (Q0[1]-P0[1]) * (Q0[0]-Q1[0])) / d
    u = ((Q0[0]-P0[0]) * (P1[1]-P0[1]) + (Q0[1]-P0[1]) * (P0[0]-P1[0])) / d
    if 0 <= t <= 1 and 0 <= u <= 1:
        return round(P1[0] * t + P0[0] * (1-t)), round(P1[1] * t + P0[1] * (1-t))
    return None

알고리즘은 선 교차 계산 문제 에 대한 답변에 자세히 설명되어 있습니다 .

P     ... point on the 1. line
R     ... normalized direction of the 1. line

Q     ... point on the 2. line
S     ... normalized direction of the 2. line

alpha ... angle between Q-P and R
beta  ... angle between R and S

gamma  =  180° - alpha - beta

h  =  | Q - P | * sin(alpha)
u  =  h / sin(beta)

t  = | Q - P | * sin(gamma) / sin(beta)

t  =  dot(Q-P, (S.y, -S.x)) / dot(R, (S.y, -S.x))  =  determinant(mat2(Q-P, S)) / determinant(mat2(R, S))
u  =  dot(Q-P, (R.y, -R.x)) / dot(R, (S.y, -S.x))  =  determinant(mat2(Q-P, R)) / determinant(mat2(R, S))

X  =  P + R * t  =  Q + S * u

선분이 다른 선분과 교차하는지 평가해야합니다. 다음 함수를 사용하여 중첩 된 루프의 행을 반복하고 자신을 제외한 다른 행과의 교차점을 찾습니다 lineLineIntersect.

intersectionPoints = []
for i, line1 in enumerate(board_lines):
    for line2 in board_lines[i:]:
        isectP = lineLineIntersect(line1[:2], line1[2:], line2[:2], line2[2:])
        if isectP:
            intersectionPoints.append(isectP)

교차점에 원 그리기 :

for isectP in intersectionPoints:
    pygame.draw.circle(screen, GREEN, isectP, 5)

예를 참조하십시오.

import pygame
import math

def lineLineIntersect(P0, P1, Q0, Q1):  
    d = (P1[0]-P0[0]) * (Q1[1]-Q0[1]) + (P1[1]-P0[1]) * (Q0[0]-Q1[0]) 
    if d == 0:
        return None
    t = ((Q0[0]-P0[0]) * (Q1[1]-Q0[1]) + (Q0[1]-P0[1]) * (Q0[0]-Q1[0])) / d
    u = ((Q0[0]-P0[0]) * (P1[1]-P0[1]) + (Q0[1]-P0[1]) * (P0[0]-P1[0])) / d
    if 0 <= t <= 1 and 0 <= u <= 1:
        return round(P1[0] * t + P0[0] * (1-t)), round(P1[1] * t + P0[1] * (1-t))
    return None

board_lines = [
    ( 13,15,462,15 ), ( 13,469,462,469 ), #lin1 and line2,outer rect
    ( 62,86,409,86 ), ( 62,389,409,389 ), #line3 and l4,mid reect
    ( 114,186,360,186 ), ( 114,318,360,318 ), #line5,l6,internl rect
    ( 13,15,13,469 ), ( 462,12,462,469 ), #line9,l10,left and right sides
    ( 62,86,62,389 ), ( 409,85,409,389 ), #l7,l8left and right sides
    ( 114,186,114,316), ( 360,187,360,318 ), #l11,lin12left and right sides
    ( 237,15,237,186 ), ( 237,469,237,320 ), #upper V.line,lowerV
    ( 13,242,113,242 ), ( 360,242,462,242 ) #rIGHT LEFT hoRIZONTAL LINE
] 

pygame.init() 

intersectionPoints = []
for i, line1 in enumerate(board_lines):
    for line2 in board_lines[i:]:
        isectP = lineLineIntersect(line1[:2], line1[2:], line2[:2], line2[2:])
        if isectP:
            intersectionPoints.append(isectP)
 
# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
 
# This sets the WIDTH and HEIGHT of each grid location
WIDTH = 20
HEIGHT = 20
 
# This sets the margin between each cell
MARGIN = 5
 
# Create a 2 dimensional array. A two dimensional
# array is simply a list of lists.
grid = []
for row in range(19):
    # Add an empty array that will hold each cell
    # in this row
    grid.append([])
    for column in range(19):
        grid[row].append(0)  # Append a cell
 
# Set row 1, cell 5 to one. (Remember rows and
# column numbers start at zero.)
grid[1][5] = 1
 
WINDOW_SIZE = [800, 600]
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("Array Backed Grid")
done = False
clock = pygame.time.Clock()
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # Set the screen background
    screen.fill(BLACK)
 
    # Draw the grid
    for row in range(19):
        for column in range(19):
            color = WHITE
            if grid[row][column] == 1:
                color = GREEN
                
    for line in board_lines:
        pygame.draw.line(screen, RED, line[:2], line[2:], 3)

    for isectP in intersectionPoints:
        pygame.draw.circle(screen, GREEN, isectP, 5)

    # Limit to 60 frames per second
    clock.tick(60)
    pygame.display.flip()
 
pygame.quit()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파이 게임을 사용하여 여러 개의 '게임 화면'만들기

분류에서Dev

파이 게임을 사용하여 중심 위치 찾기

분류에서Dev

파이 게임 (파이썬)을 사용하여 사운드 재생하기

분류에서Dev

파이 게임 모듈을 사용하여 파이썬에서 뱀

분류에서Dev

bool을 생성하기 위해 Unix에서 두 파일의 차이점 비교

분류에서Dev

파이썬에서 생성기를 사용하여 이터 러블을 어떻게 비교합니까?

분류에서Dev

파이 게임을 사용하여 파이썬에서 비를 내리려고하는데 코드가 실행될 때 모든 방울이 멈 춥니 다.

분류에서Dev

파이 게임에서 여러 개의 총알을 쏘기

분류에서Dev

파이 게임을 사용하여 파이썬 재생 사운드

분류에서Dev

findstr을 사용하여 두 텍스트 파일의 차이점 비교 / 찾기

분류에서Dev

파이썬에서 포커 게임의 여러 값 비교

분류에서Dev

R을 사용하여 데이터의 교차점과 차이점 찾기

분류에서Dev

파이썬을 사용하여 임의의 16 진수 색상 코드를 생성하려면 어떻게해야합니까?

분류에서Dev

어떻게 안드로이드에서 앱을 종료 할 때 createTempFile에 의해 생성 된 모든 임시 파일을 삭제하려면?

분류에서Dev

Python : 파이 게임을 사용하여 사운드 재생

분류에서Dev

파이썬을 사용하여 이미지에서 검은 색 / 회색 픽셀의 모든 좌표 찾기

분류에서Dev

파이썬을 사용하여 단어 목록에서 길이 2의 모든 단어 조합 찾기

분류에서Dev

파이 게임을 사용하여 객체 사이의 거리 줄이기

분류에서Dev

파이썬을 사용하여 xml 노드의 모든 부모 가져 오기

분류에서Dev

곡선이있는 여러 선의 교차점을 어떻게 찾을 수 있습니까?

분류에서Dev

파이썬에서 CSS의 여러 줄을 플로팅하기 위해 for 루프를 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 데이터 프레임을 업데이트하기 위해 중첩 사전의 여러 값을 사용하여 여러 행을 반복합니다.

분류에서Dev

파이썬을 사용하여 그림에서 컬러 선을 어떻게 선택해야합니까?

분류에서Dev

preserveAll ()을 사용하여 해시 맵 간의 교차점 찾기

분류에서Dev

C # 코드를 사용하여 임의의 큰 이미지 파일을 생성하려면 어떻게해야합니까?

분류에서Dev

파이 게임을 사용하여 슬라이더 만들기

분류에서Dev

파이 게임을 사용하여 파이썬에서 음파를 재생하려고

분류에서Dev

어떻게 여러 필드에 널 안전 비교기의 생성을 단순화하기 위해?

분류에서Dev

파이 게임의 같은 클래스에있는 다른 메서드에 의해 생성 된 속성을 메서드에 부여 할 수 있습니까?

Related 관련 기사

  1. 1

    파이 게임을 사용하여 여러 개의 '게임 화면'만들기

  2. 2

    파이 게임을 사용하여 중심 위치 찾기

  3. 3

    파이 게임 (파이썬)을 사용하여 사운드 재생하기

  4. 4

    파이 게임 모듈을 사용하여 파이썬에서 뱀

  5. 5

    bool을 생성하기 위해 Unix에서 두 파일의 차이점 비교

  6. 6

    파이썬에서 생성기를 사용하여 이터 러블을 어떻게 비교합니까?

  7. 7

    파이 게임을 사용하여 파이썬에서 비를 내리려고하는데 코드가 실행될 때 모든 방울이 멈 춥니 다.

  8. 8

    파이 게임에서 여러 개의 총알을 쏘기

  9. 9

    파이 게임을 사용하여 파이썬 재생 사운드

  10. 10

    findstr을 사용하여 두 텍스트 파일의 차이점 비교 / 찾기

  11. 11

    파이썬에서 포커 게임의 여러 값 비교

  12. 12

    R을 사용하여 데이터의 교차점과 차이점 찾기

  13. 13

    파이썬을 사용하여 임의의 16 진수 색상 코드를 생성하려면 어떻게해야합니까?

  14. 14

    어떻게 안드로이드에서 앱을 종료 할 때 createTempFile에 의해 생성 된 모든 임시 파일을 삭제하려면?

  15. 15

    Python : 파이 게임을 사용하여 사운드 재생

  16. 16

    파이썬을 사용하여 이미지에서 검은 색 / 회색 픽셀의 모든 좌표 찾기

  17. 17

    파이썬을 사용하여 단어 목록에서 길이 2의 모든 단어 조합 찾기

  18. 18

    파이 게임을 사용하여 객체 사이의 거리 줄이기

  19. 19

    파이썬을 사용하여 xml 노드의 모든 부모 가져 오기

  20. 20

    곡선이있는 여러 선의 교차점을 어떻게 찾을 수 있습니까?

  21. 21

    파이썬에서 CSS의 여러 줄을 플로팅하기 위해 for 루프를 올바르게 사용하는 방법은 무엇입니까?

  22. 22

    파이썬에서 데이터 프레임을 업데이트하기 위해 중첩 사전의 여러 값을 사용하여 여러 행을 반복합니다.

  23. 23

    파이썬을 사용하여 그림에서 컬러 선을 어떻게 선택해야합니까?

  24. 24

    preserveAll ()을 사용하여 해시 맵 간의 교차점 찾기

  25. 25

    C # 코드를 사용하여 임의의 큰 이미지 파일을 생성하려면 어떻게해야합니까?

  26. 26

    파이 게임을 사용하여 슬라이더 만들기

  27. 27

    파이 게임을 사용하여 파이썬에서 음파를 재생하려고

  28. 28

    어떻게 여러 필드에 널 안전 비교기의 생성을 단순화하기 위해?

  29. 29

    파이 게임의 같은 클래스에있는 다른 메서드에 의해 생성 된 속성을 메서드에 부여 할 수 있습니까?

뜨겁다태그

보관