미분방정식 활용

package game

import (
	"image/color"
	"math"
)

type BarGame struct {
	Bar_x, Bar_y, BarSpd_x, BarSpd_y float64
	Visible                          bool
	C                                color.Color
}

func (b *BarGame) Update() {
	if b.Bar_x != 0 || b.Bar_y != 0 || b.BarSpd_x != 0 || b.BarSpd_y != 0 {
		a := -(math.Pow(b.BarSpd_x, 2) + math.Pow(b.BarSpd_y, 2)) / math.Sqrt(math.Pow(b.Bar_x, 2)+math.Pow(b.Bar_y, 2))
		theta := math.Atan2(b.Bar_y, b.Bar_x)
		b.BarSpd_x += a * math.Cos(theta)
		b.BarSpd_y += a * math.Sin(theta)
	}
	b.Bar_x += b.BarSpd_x
	b.Bar_y += b.BarSpd_y
}

해당 코드는 아래의 연립 2계 미분방정식을 반영합니다.

Untitled

(x와 y는 각각 x축 방향의 변위, y축 방향의 변위를 의미합니다.)

각각 구심 가속도의 x성분, y성분을 가속도로써 반영한 것입니다.

게임 진행

  1. 파트너와 각각 경찰과 도둑 역할을 결정합니다.
  2. 게임을 실행시킵니다. (go run main.go)
  3. 도둑은 W(위쪽), A(왼쪽), S(아래쪽), D(오른쪽) 버튼을 사용해 이동할 수 있고 1, 2 버튼을 통해 2개의 캐릭터를 옮기며 조종할 수 있습니다.
    1. 도둑 캐릭터는 빨간색, 경찰 캐릭터는 파란색을 띕니다.
  4. 경찰은 방향키 버튼을 사용해 이동할 수 있고 도둑과 닿을 시, 도둑을 중앙으로 이동시켜 움직일 수 없게 만듭니다.
    1. 도둑은 중앙의 주변으로 접근해 다른 도둑을 탈출시킬 수 있습니다.
    2. 움직이는 바가 빨강→노랑이 되고 파란색 영역에 들어왔을 때, 스페이스 바를 눌러 탈출시킬 수 있습니다.
  5. 전체 맵에는 총 4개의 점등 스위치가 있습니다.
    1. 해당 스위치는 도둑과 닿을 시 회색→노랑으로 색이 변하고, 경찰이 밟을 시 노랑→회색으로 변경됩니다.
  6. 맵의 모든 스위치의 색깔을 노랑으로 만들면 도둑의 승리, 그전에 도둑을 모두 중앙으로 보내면 경찰의 승리입니다.
  7. q 버튼을 눌러 게임을 재시작 할 수 있습니다.

코드 진행

type Game struct {
	ScreenHeight  int
	ScreenWidth   int // Layout에 사용 (Window size와 동일)
	Unit          int // default rendering 해상도 단위 (픽셀 단위, 30)
	Current_Ply   int // 도둑이 현재 플레이하고 있는 캐릭터 번호
	Num_Thief     int // 도둑 캐릭터 갯수
	Num_Sp        int // 스위치 갯수
	Sprites       []*sprite.Sprites // Sprites = {벽, Police, Thieves, Switches}
	GameOver      bool
	Bar           *BarGame
	SpaceCooldown time.Time // bargame 쿨타임
	MaxCooldown   float64 // bargame 쿨타임 limit
	PanJung       int // bargame 파란색 영역 크기
}