webForumDet fria alternativet

Lotta spelprogram

21 svar · 728 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

Försöker göra en lottningsfunktion.

Har den här koden.

	sub lotta(obj as object, e as eventargs)
		dim lag(4)
		
		lag(0) = "Tibro IK"
		lag(1) ="Skövde IK"
		lag(2) = "Mariestad Bois"
		lag(3) ="Skara IK"
		
		dim i as integer
		Dim r As New Random()
		dim match(15,2)
		dim match1(15)	
			for i = 0 to 11
				match(i,1)=lag(r.Next(0, 4))
				match(i,2)=lag(r.Next(0, 4))
				match1(i) = match(i,1)&"-"&match(i,2)
				response.write(match1(i)&"<br />")
			next
	end sub

Nu lottas två lag mot varandra. Problemet är att match(i,1) kan bli samma som match(i,2).

Hur ska jag göra så att lagen inte kan möta sig själva

PatrikBMedlem sedan mars 20002 836 inlägg
#2

Ok, här är en som funkar

	sub lotta()
        dim lag(4)
		          
        lag(0) = "Tibro IK"
        lag(1) ="Skövde IK"
        lag(2) = "Mariestad Bois"
        lag(3) ="Skara IK"
		          
        dim i as integer
        Dim r As New Random()
        dim match(15,2)
        dim match1(15)
        for i = 0 to 15
            Dim intHome As Integer = -1
            Dim intVisitor As Integer = -1
            Dim bolEqual As Boolean = True
            
            Do While bolEqual
                intHome = r.Next(0,4)
                intVisitor = r.Next(0,4)
                
                If intHome <> intVisitor Then
                    bolEqual = False
                End If
            Loop
            
            match(i,1)=lag(intHome)
            match(i,2)=lag(intVisitor)
            match1(i) = match(i,1)&"-"&match(i,2)
            response.write(match1(i)&"<br />")
        next i
	end sub

Den funkar så att inget lag får spela mot sig själv. Men! med denna typ av slumpning så kan ett lag få spela 10 matcher, ett annat lag 1 match osv .... dvs, de kommer inte att få spela lika många ggr.

cya,
PatrikB

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#3

Nu har jag kommit lite längre. Nu kan lagen bara möta varandra en gång. Hur gör man för att räkna så att alla lag får spela samma antal matcher
jag har den här koden

sub lotta(obj as object, e as eventargs)
        dim lag(6)
		          
        lag(0) = "Tibro IK"
        lag(1) = "Skövde IK"
        lag(2) = "Mariestad Bois"
        lag(3) = "Skara IK"
        lag(4) = "Leksands IF"
        lag(5) = "Hammarby IF"
		          
        dim i as integer
        Dim r As New Random()
        
        
        dim antal_matcher as integer = 15
        dim match(antal_matcher,2)
        dim match1(antal_matcher)
        dim matcher_per_lag = 5
        for i = 1 to antal_matcher
            Dim intHome As Integer = -1
            Dim intVisitor As Integer = -1
            Dim bolEqual As Boolean = True
            Do While bolEqual
                intHome = r.Next(0,5)
                intVisitor = r.Next(0,6)
                
                If intHome <> intVisitor Then
                    bolEqual = False
                End If
            Loop
            dim m as string = lag(intHome) &"-"& lag(intVisitor)
            dim m1 as string = lag(intVisitor) &"-"& lag(intHome)
            dim j as integer
            dim k as integer
            for k = 0 to i
			dim found as boolean = false
			for j = 0 to ubound(match1)
				if m = match1(j) or m1 = match1(j) then
					found = true
					exit for
				end if
			next
			if not found then
				match(i,1)=lag(intHome)
				match(i,2)=lag(intVisitor)
				match1(i) = match(i,1)&"-"&match(i,2)
				response.write(i &"&nbsp;"& match1(i) & "<br />")
			end if
			next

        next i
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#4

ny fråga.

Jag försöker kolla så att inte något av de nya lagen finns i de tidigare positionerna av arrayen men får det inte att fungera.

if i = 2 then
					if match(i-1,1) = lag(intHome) or match(i-1,2) = lag(intVisitor) or match(i,1) = lag(intHome) or match(i,2) = lag(intVisitor) then
					else	
						match1(i) = lag(intHome) &"-"& lag(intVisitor)
					end if
				elseIf i >= 3 Then
					if match(i-1,1) = lag(intHome) or match(i-1,2) = lag(intVisitor) or match(i-2,1) = lag(intHome) or match(i-2,2) = lag(intVisitor) or match(i-3,1) = lag(intHome) or match(i-3,2) = lag(intVisitor) or match(i,1) = lag(intHome) or match(i,2) = lag(intVisitor) then
					else	
						match1(i) = lag(intHome) &"-"& lag(intVisitor)
					end if
				else
					match1(i) = lag(intHome) &"-"& lag(intVisitor)
				end if

En annan fråga.
kan man på något sätt slumpa en ny match om den slumpade redan finns i arrayen. Om två matcher är lika nu skapas det inte rätt antal matcher

ptypeMedlem sedan juni 2002151 inlägg
#5

Har inte orkat kolla på din kod, så jag reserverar mig för missförstånd, men jag tycker det verkar som om du krånglar till det.

Ska alla lag möta alla andra (seriespel)? Lättast då torde ju vara att generera alla möjliga matcher, typ i pseudokod

för L=1:alla lag
 för K=1:alla lag utom  L
   skapa match L möter K
   om K>L skapa ej match (om lagen bara ska mötas en gång)
 end
end

Spara dessa matcher någonstans och permutera matchordningen slumpartat.

Klart.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#6

alla ska möta varandra en gång. Skulle du kunna ge lite kodexempel på det du visade?

ptypeMedlem sedan juni 2002151 inlägg
#7

Förstår du bara vad jag menar med pseudokoden så klarar du nog att implementera det själv.

Jag menar alltså att du ska separera på matchskapningen och lottningen i vilken de spelas, istället för att försöka kombinera dessa två.

Alltså:

1. Strukturerat generera alla matcher som ska spelas och spara undan dessa. Vi vet då att alla matcher kommer med (varken mer eller mindre) och att ingen möter sig själv.

2. Lotta i vilken ordning matcherna ska spelas (t.ex. genom att ett flertal gånger slumpvis dra två matcher från din mängd och byta plats på dem).

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#8

jag är med på att jag ska skilja på skapning och lottning men inte riktigt hur koden ska se ut

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#9

nu har jag fixat så att alla matcher skapas.
Sen försöker jag slumpa fram ett spelschema. Hur ska jag göra för att kontrollera om matchen redan finns och i så fall slumpa fram en ny?
kod för slumpningen

dim l as integer
		dim antal as integer = ubound(match)+1
		dim match1(antal)
		dim r as new random()
			for l = 1 to antal
				match1(l) = match(r.Next(0,antal))
				response.write(l &"&nbsp;"& match1(l) &"<br />")
			next

match är arrayen som innehåller alla matcher

ptypeMedlem sedan juni 2002151 inlägg
#10

Jag kodar normalt inte VB, så med reservation för fel:

dim l as integer
dim antal as integer = ubound(match)+1
dim match1(antal)
dim r as new random()

dim slumptal1 as integer
dim slumptal2 as integer
dim tempmatch as match // vet inte hur du definierat match...?

for l = 1 to antal*3 // ett tillräckligt stort tal
  slumptal1=r.Next(0,antal)
  slumptal2=r.Next(0,antal)
  tempmatch=match(slumptal1) // spara undan matchen temporärt
  match(slumptal1)=match(slumptal2); // byt plats på matcherna
  match(slumptal2)=tempmatch;
next

Nu innehåller arrayen match en slumpvis utvald matchordning.

Hjälper det?

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#11

match är definierad så här dim match(21).
Nu slumpar den fram över 50 matcher?

ptypeMedlem sedan juni 2002151 inlägg
#12

Nej. Den byter plats på två slumpvis utvalda matcher över 50 ggr. Jag tog siffran ur luften, därför att den (intuititvt, utan att räkna på det) troligtvis låter varje match byta plats åtminstone en gång.

Det är alltså inte fråga om att slumpa fram matcherna nu. Alla matcher som ska spelas finns ju redan. Det gäller bara att sortera dem slumpvis.

Är du med vad jag menar?

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#13

jo jag är med. Jag försökte slumpa fram ordningen på ett annat sätt.

dim l as integer
			dim antal as integer = ubound(match)+1
			dim match1(antal)
			dim r as new random()
			dim tempmatch as string 

			for l = 1 to 21 
				tempmatch = match(r.Next(0,antal))
					dim n as integer
						for n = 1 to ubound(match1)
							if match1(n) = tempmatch then
								här vill jag att den ska hoppa tillbaka till slumpningen
								
							else
								match1(l) = tempmatch
								
							end if
						next
					response.write(match1(l) &"<br />")
			next

Det fungerar. Den lägger inte till matchen i match1 om den redan finns där.
Men hur gör jag för att hoppa tillbaka till slumpningen om den finns där.

eller är ditt sätt bättre?

ptypeMedlem sedan juni 2002151 inlägg
#14

Tror det. Förstår inte riktigt din kod.

Men prova din också då. Vid "här vill jag att den ska hoppa tillbaka till slumpningen", sätt n=ubound(match1) så hoppar du ju ur.

Funkar det inte, så prova min.

*nyfiken*

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#15

det jag ögr med min kod är att koll om matchen redan finns i arrayen match1 där jag lagrar den slumpade spelordningen.
Det jag skulle vilja är att hoppa tillbaka ett steg i den första for-satsen och på så sätt slumpa fram en ny match men det verkar inte fungera
provade med att göra så här

dim n as integer
						for n = 1 to ubound(match1)
							if match1(n) = tempmatch then
								l=l-1								
							else
								match1(l) = tempmatch
								
							end if
						next

men det verkar bli en evighetsloop.

ptypeMedlem sedan juni 2002151 inlägg
#16

Ok. Verkar krångligt tycker jag. Prova min version. :OO

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#17

Om jag gör på ditt sätt. Jag måste väl fortfarande kontrollera att samma match inte lottas in i spelschemat flera gånger?

ptypeMedlem sedan juni 2002151 inlägg
#18

Nej! Inte om du skapat alla matcher korrekt!

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#19

Alla matcher är skapade korrekt och jag vet att det ska vara 21 matcher (det är 7 lag) provade din kod så här

dim l as integer
			dim antal as integer = ubound(match)+1
			dim match1(antal)
			dim r as new random()

			dim slumptal1 as integer
			dim slumptal2 as integer
			dim tempmatch as string
			
			for l = 1 to antal 
			slumptal1=r.Next(0,antal)
			slumptal2=r.Next(0,antal)
			tempmatch=match(slumptal1) 
			match(slumptal1)=match(slumptal2) 
			match(slumptal2)=tempmatch
			response.write(tempmatch &"<br />")
			next

När jag kör den där koden blir det inte rätt

ptypeMedlem sedan juni 2002151 inlägg
#20

Varför skriver du ut tempmatch? Det är ju fel. Loopa igenom match från 1 till 21 och skriv ut alla matcher istället.

Sen har du ändrat loopen. Den är inte som den jag skrev. Du slumpar för få gånger (antal istället för antal*3).

Så här menar jag:

for l = 1 to antal*3 // ett tillräckligt stort tal
  slumptal1=r.Next(0,antal)
  slumptal2=r.Next(0,antal)
  tempmatch=match(slumptal1) // spara undan matchen temporärt
  match(slumptal1)=match(slumptal2); // byt plats på matcherna
  match(slumptal2)=tempmatch;
next

for l=1 to antal
  response.write(match(l) &"<br />")
next
139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)