Kaynağa Gözat

skeleton ready

Ronald Peterson 10 yıl önce
ebeveyn
işleme
5a28e3450e
1 değiştirilmiş dosya ile 88 ekleme ve 33 silme
  1. 88 33
      battlecamp-go-bot/main.go

+ 88 - 33
battlecamp-go-bot/main.go

@@ -1,87 +1,142 @@
 package main
 
 import (
+	"time"
+	"io/ioutil"
+	"strconv"
+	"bytes"
 	"encoding/json"
+	"fmt"
 	"log"
+	"net/http"
 	"os"
-	
-	"battlecamp-go-server/stomp"
-	"battlecamp-go-server/flag"
+
 	"battlecamp-go-server/events"
+	"battlecamp-go-server/flag"
 	"battlecamp-go-server/player"
+	"battlecamp-go-server/stomp"
 )
 
-var Server *string
-
 func main() {
 	initLogging()
 	log.Println("Game bot version 0.1")
-	
+
 	flag.ParseFlags()
-	go subscribeToGame()
-	subscribeToUpdate()
+	pu := make(chan *events.PlayerUpdate)
+	go subscribeToUpdate(pu)
+	subscribeToGame(pu)
 }
 
-func subscribeToGame() {
+func subscribeToGame(pu chan *events.PlayerUpdate) {
 	sub := stomp.Subscribe("game")
-	
+
 	for {
-		announcement := <- sub
+		announcement := <-sub
 		gs := new(events.GameStart)
 		json.Unmarshal(announcement.Body, &gs)
-		log.Printf("announcement type: %v ", gs.Type)
+		log.Printf("announcement type: %v ", strconv.FormatInt(gs.GameId, 10))
 		gameEndChan := make(chan bool)
-		if("GAME_START" == gs.Type) {
-			go joinGame(gs.GameId, gameEndChan)
+		if "GAME_START" == gs.Type {
+			go joinGame(gs.GameId, gameEndChan, pu)
 		} else {
 			gameEndChan <- true
 		}
 	}
 }
 
-
-func subscribeToUpdate() {
+func subscribeToUpdate(pu chan *events.PlayerUpdate) {
 	sub := stomp.Subscribe("update")
-	
+
 	for {
-		announcement := <- sub
-		if("vnd.battlecamp.player" == announcement.ContentType) {
+		announcement := <-sub
+		if "vnd.battlecamp.player" == announcement.ContentType {
 			p := new(player.Player)
 			json.Unmarshal(announcement.Body, &p)
 			playerJoin(p)
 		} else {
-			pu := new(events.PlayerUpdate)
-			json.Unmarshal(announcement.Body, &pu)
-			playerUpdate(pu)
+			pue := new(events.PlayerUpdate)
+			json.Unmarshal(announcement.Body, &pue)
+			pu <- pue
 		}
 	}
 }
 
-func joinGame(gameId int64, gameEndChan chan bool) {
+func joinGame(gameId int64, gameEndChan chan bool, pu chan *events.PlayerUpdate) {
 	//join game
+	p := &player.Player{
+		Id:    "Zeus",
+		Color: "#238b02",
+		Type:  1,
+	}
 	
-	//retrieve board
+	players := make([]*player.Player, 5)
+
+	url := "http://localhost:8080/games/" + strconv.FormatInt(gameId, 10) + "/join"
+
+	jsonStr, _ := json.Marshal(p)
+	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
+	req.Header.Set("Content-Type", "application/json")
+	fmt.Println("URL:>", req)
 	
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		panic(err)
+	}
+	v, _ := ioutil.ReadAll(resp.Body)
+	json.Unmarshal(v, p) 
+	resp.Body.Close()
+
 	for {
 		select {
-			case <-gameEndChan:
-				return
-			default:
-				move()
+		case <-gameEndChan:
+			return
+		case playerUpdate := <- pu:
+			if(playerUpdate.GameId == gameId) {
+				players = playerUpdate.Players
+				for _, pup := range players {
+					if(pup.Id == p.Id) {
+						p.Pos.X = pup.Pos.X
+						p.Pos.Y = pup.Pos.Y
+						fmt.Printf("Set position to x=%v y=%v\n", pup.Pos.X, pup.Pos.Y)
+					}
+				}
+			}
+		default:
+			move(gameId, p, players)
+			time.Sleep(2 * time.Second)
 		}
 	}
 }
 
-func move() {
+func move(gameId int64, p *player.Player, players []*player.Player) {
+	//retrieve viewport
+	
+	//determine move
+	direction := "E"
+	
+	//send move
+	url := "http://localhost:8080/games/" + strconv.FormatInt(gameId, 10) + "/move/" + p.Id + "/" + direction
+	fmt.Println("move:>", url)
 	
+	http.Post(url, "text/plain", nil)
+	
+	//update x,y
+	switch direction {
+		case "N":
+			p.Pos.Y++
+		case "E":
+			p.Pos.X++
+		case "S":
+			p.Pos.Y--
+		case "W":
+			p.Pos.Y++
+	}
+
 }
 
 func playerJoin(p *player.Player) {
-	
-}
 
-func playerUpdate(pu *events.PlayerUpdate) {
-	
 }
 
 func initLogging() {