• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Zufällige Zonenposition

capoaira

Geomaster
Moin,
Vorweg: Ich habe keine Ahnung von lua, nur etwas Programmierkenntnisse.

Ich würde gerne das Spiel Topfschlagen nach programmieren. Damit sich nicht rumspricht, wo der "Topf" versteckt ist, würde ich gerne den Topf an einer Zufallsposition "verstecken". Natürlich sollte die Zone nicht irgendwo auf der Welt sein, sondern in einem bestimmten Bereich. Ist so etwas realisierbar und wie aufwändig ist so etwas?

Gruß capoaira
 

heikoxxxx

Geocacher
Das geht schon. Via Javascript kannst da was bauen was die Browserkoordinaten ausliest und mit einer zufällig generierten Zahl vergleicht. Aber da wirst dich denke ich ganz schön reinarbeiten müssen. Ich habe schon sowas fertig aber eben ohne zufall sondern mit fixen Zonen die vergeben werden.
Bei interesse bitte pn an mich.

Lg
 

Charlenni

Geomaster
Ja, kein JavaScript.

Ansonsten eigentlich kein Problem. Allerdings ist reiner Zufall nicht immer gut. Was, wenn die Zone nicht erreichbar ist?
 
OP
capoaira

capoaira

Geomaster
Charlenni schrieb:
Ansonsten eigentlich kein Problem. Allerdings ist reiner Zufall nicht immer gut. Was, wenn die Zone nicht erreichbar ist?
Der Bereich, indem die Zone sein soll, ist so gewählt, das es das Problem nicht geben sollte.

Wie ist es denn Möglich?
 

Charlenni

Geomaster
Ich schaue morgen nach und schreibe dir etwas.

Soll die Zone in einem Kreis oder Viereck liegen? Soll es einen Mindestabstand zum Startpunkt geben?
 
OP
capoaira

capoaira

Geomaster
Super, danke!

Die Zone soll in einem bestimmten Bereich sein. Ob viereckig oder Rund ist mir egal. Ich würde dann mit "Distanz zur Zone" die Entfernung messen.
 

Charlenni

Geomaster
Die Funktion sieht so aus

Code:
function MoveZoneToRandomPoint(zone, center, min, max, radius)
	-- Usage:
	-- zone: Zone to move
	-- center: Position from which the zone should be calculated
	-- min: Minimum distance to center
	-- max: Maximum distance to center
	-- radius: Radius of new zone
	
	-- Get distance to center
	local dist = Wherigo.Distance(math.random(min, max), "m")
	-- Get direction to center
	local bearing = math.random(0, 359)
	-- Calc new center of zone
	local newZoneCenter = Wherigo.TranslatePoint(center, dist, bearing)
	-- Now create new points for zone
	local dist = Wherigo.Distance(radius, "m")
	-- Set zone inactive
	zone.Active = false
	-- Create new points
	zone.Points = {
    		Wherigo.TranslatePoint(newZoneCenter, dist, 22.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 67.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 112.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 157.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 202.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 247.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 292.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 337.5),
 		}
 	-- Set zone active
 	zone.Active = true
end

Diesen einfach in die Lua User Functions kopieren und über einen Lua User Code Aufruf mit

Code:
MoveZoneToRandomPoint(pot, Player.ObjectLocation, 50, 250, 20)

aufrufen. Democartridge im Anhang.

Aber Vorsicht, beim Start sollte schon ein Signal da sein, sonst wird die Zone auf (0, 0) verschoben :D
 

Anhänge

  • PotBashing.zip
    2 KB · Aufrufe: 55
OP
capoaira

capoaira

Geomaster
Ich habe imwherigohandbuch etwas gefunden und habe es so gemacht.
Code:
	local center = ZonePoint(53.09815,8.7501,0)
	MoveZoneToRandomPoint(pot, center, 0, 70, 7)
Auch wenn ich
Code:
Wherigo.ZonePoint
verwende oder es direkt statt mit Variable center reinschreibe funktioniert es nicht. Was mache ich falsch?
 
OP
capoaira

capoaira

Geomaster
OK, hat sich erledigt. Funtioniert.

Dafür habe ich eine andere Frage:
Ich habe ein Funktion gebastelt, die zwischen 3 ZonePoints per Zufall entscheidet und dann auf die
Code:
MoveToRandomPoint()
zugreift:
Code:
-- select one point
-- select zone of creating random point
local random_select = math.random(1, 4)
  
if random_select==1
-- small zone 1 N 53 05.889 E 008 45.006 radius 70
local center = ZonePoint(53.09815,8.7501,0)
MoveZoneToRandomPoint(pot, center, 0, 70, 7)
-- [...] Noch 2 weiter Punkte, aber hier unwichtig
end
Darunter hatte ich die "MoveToRandomPoint" aber das hat nicht funktioniert. Damit es keine Fehler gab musste ich darunter noch ein zweites end schreiben. Aber das ist URWIGO im Simulator abgestürzt.
Weiß jemand wieso das der Fall ist?
Man muss in den User Funktionen doch mehrere Funktionen Schreiben können, oder?

Gruß capoaira
 

Charlenni

Geomaster
Wie hier zu lesen, brauchst du nach dem "if" noch ein "then". Sollte also so aussehen:

Code:
local random_select = math.random(1, 3)

if random_select==1 then
-- small zone 1 N 53 05.889 E 008 45.006 radius 70
local center = ZonePoint(53.09815,8.7501,0)
MoveZoneToRandomPoint(pot, center, 0, 70, 7)
end
if random_select==2 then
-- Small zone 2
end
if random_select==3 then
-- Small zone 3
end
 
OP
capoaira

capoaira

Geomaster
Es funktioniert nur, wenn ich die Funktion MoveToRandomPoin() über der Funktion SetPot() habe. Andersherum Sturz der URWIGO Simulator ab. Und ich muss unter SetPot() ein zweites end schreiben. Ich frage mich zwar warum, aber erstmal klappt es ja ;)
 

Charlenni

Geomaster
Ich sehe in deinem Code keine SetPot() Funktion. Wenn du nur den halben Quellcode zeigst, dann kann man natürlich nichts über den anderen Teil sagen ;)
 
OP
capoaira

capoaira

Geomaster
Das ist mein Code
Code:
function MoveZoneToRandomPoint(zone, center, min, max, radius)
	-- Usage:
	-- zone: Zone to move
	-- center: Position from which the zone should be calculated
	-- min: Minimum distance to center
	-- max: Maximum distance to center
	-- radius: Radius of new zone
	
	-- Get distance to center
	local dist = Wherigo.Distance(math.random(min, max), "m")
	-- Get direction to center
	local bearing = math.random(0, 359)
	-- Calc new center of zone
	local newZoneCenter = Wherigo.TranslatePoint(center, dist, bearing)
	-- Now create new points for zone
	local dist = Wherigo.Distance(radius, "m")
	-- Set zone inactive
	zone.Active = false
	-- Create new points
	zone.Points = {
    		Wherigo.TranslatePoint(newZoneCenter, dist, 22.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 67.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 112.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 157.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 202.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 247.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 292.5),
    		Wherigo.TranslatePoint(newZoneCenter, dist, 337.5),
 		}
 	-- Set zone active
 	zone.Active = true
end

function SetPot()
	-- select one point
	-- select zone of creating random point
	local random_select = math.random(1, 4)
		  
	if random_select==1 then
	-- small zone 1 N 53 05.889 E 008 45.006 radius 70
		local center = ZonePoint(53.09815,8.7501,0)
		MoveZoneToRandomPoint(pot, center, 0, 70, 7)
		  
	elseif random_select==2 then
	-- small zone 2 N 53 05.906 E 008 45.107 radius 70
		local center = ZonePoint(53.098433,8.751783,0)
		MoveZoneToRandomPoint(pot, center, 0, 70, 7)
		 
	else
	-- great zone N 53 05.808 E 008 45.054 radius 150m
		local center = ZonePoint(53.0968,8.7509,0)
		MoveZoneToRandomPoint(pot, center, 0, 150, 7)
end
end -- Ohne das end gibt es eine Fehler Meldung.
 
Oben