-
Notifications
You must be signed in to change notification settings - Fork 0
/
dilemma.bas
625 lines (477 loc) · 13.8 KB
/
dilemma.bas
1
Sub prisionDilemma()Dim player1() As String, player2() As String, prevp1 As String, prevp2 As StringDim round As IntegerDim k As Integer, n As IntegerDim play1 As String, play2 As StringDim legitfriedman As Boolean, legitdavis As BooleanDim good As Double, bad As Double, nice1 As Double, nice2 As Double, total_C As Double, total_D As DoubleDim p1score() As Integer, p2score() As Integer, ttlscore1() As Integer, ttlscore2() As Integerlegitfriedman = Truelegitdavis = Truek = 200good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0play1 = InputBox("What strategy do player 1 should use? You don't need to capitalize (random, tit for tat, davis, grofman, friedman, davis, downing)")play2 = InputBox("What strategy do player 2 should use? You don't need to capitalize (random, tit for tat, davis, grofman, friedman, davis, downing)")ReDim player1(1 To k)ReDim player2(1 To k)ReDim p1score(1 To k)ReDim p2score(1 To k)ReDim ttlscore1(1 To k)ReDim ttlscore2(1 To k)For round = 1 To kIf play1 = "random" ThenCall random(round, prevp2, prevp1, player1(), k)ElseIf play1 = "tit for tat" ThenCall titfortat(round, prevp2, prevp1, player1(), k)ElseIf play1 = "grofman" ThenCall grofman(round, prevp2, prevp1, player1(), k)ElseIf play1 = "friedman" ThenCall friedman(round, prevp2, prevp1, player1(), k, legitfriedman)ElseIf play1 = "davis" ThenCall davis(round, prevp2, prevp1, player1(), k, legitdavis)ElseIf play1 = "downing" ThenCall downing(round, prevp2, prevp1, player1(), k, good, bad, nice1, nice2, total_C, total_D)End IfIf play2 = "random" ThenCall random(round, prevp1, prevp2, player2(), k)ElseIf play2 = "tit for tat" ThenCall titfortat(round, prevp1, prevp2, player2(), k)ElseIf play2 = "grofman" ThenCall grofman(round, prevp1, prevp2, player2(), k)ElseIf play2 = "friedman" ThenCall friedman(round, prevp1, prevp2, player2(), k, legitfriedman)ElseIf play2 = "davis" ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf play2 = "downing" ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext round' Score the score of playersCall score(player1, player2, p1score, p2score, k)' Find the total scoresttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next Z' Print this value on the excel filesFor n = 2 To k + 1Cells(n, 1).Value = player1(n - 1)Next nFor n = 2 To k + 1Cells(n, 2).Value = player2(n - 1)Next nFor n = 2 To k + 1Cells(n, 3).Value = p1score(n - 1)Next nFor n = 2 To k + 1Cells(n, 4).Value = p2score(n - 1)Next nFor n = 2 To k + 1Cells(n, 5).Value = ttlscore1(n - 1)Next nFor n = 2 To k + 1Cells(n, 6).Value = ttlscore2(n - 1)Next nCells(3, 8).Value = Cells(k + 1, 5).ValueCells(3, 9).Value = Cells(k + 1, 6).Value'Print out results'For n = 2 To k + 1'Cells(n, 1).Value = player1(n - 1)'Next n'For n = 2 To k + 1'Cells(n, 2).Value = player2(n - 1)'Next n End SubSub random(round As Integer, prevopponent As String, selfprev As String, random() As String, k As Integer)Dim n As IntegerDim x As IntegerReDim Preserve random(1 To k + 1)x = WorksheetFunction.RandBetween(1, 10)If x < 5 Thenrandom(round) = "C"Else: random(round) = "D"End If If round = 1 Thenselfprev = random(1)Else: selfprev = random(round - 1)End IfEnd SubSub titfortat(round As Integer, prevopponent As String, selfprev As String, titfortat() As String, k As Integer)Dim n As IntegerReDim Preserve titfortat(1 To k)If round = 1 Thentitfortat(1) = "C"Elsetitfortat(round) = prevopponentEnd IfIf round = 1 Thenselfprev = titfortat(1)Else: selfprev = titfortat(round - 1)End IfEnd SubSub grofman(round As Integer, prevopponent As String, selfprev As String, grofman() As String, k As Integer)ReDim Preserve grofman(1 To k)If round = 1 Then grofman(round) = "C"If round > 1 Then If prevopponent <> grofman(round - 1) Then x = WorksheetFunction.RandBetween(1, 9) If x < 3 Then grofman(round) = "C" Else: grofman(round) = "D" End If Else: grofman(round) = "C" End IfEnd IfIf round = 1 Thenselfprev = grofman(1)Else: selfprev = grofman(round - 1)End IfEnd SubSub friedman(round As Integer, prevopponent As String, selfprev As String, friedman() As String, k As Integer, legit As Boolean)ReDim Preserve friedman(1 To k)If legit = False Thenfriedman(round) = "D"Exit SubEnd IfIf round = 1 Then friedman(round) = "C"If round > 1 Then If prevopponent = "D" Then legit = False friedman(round) = "D" Else: friedman(round) = "C" End IfEnd IfIf round = 1 Thenselfprev = friedman(1)Else: selfprev = friedman(round - 1)End IfEnd SubSub davis(round As Integer, prevopponent As String, selfprev As String, davis() As String, k As Integer, legit As Boolean)ReDim Preserve davis(1 To k)If legit = False Thendavis(round) = "D"Exit SubEnd IfIf round <= 10 Then davis(round) = "C"If round > 10 Then If prevopponent = "D" Then legit = False davis(round) = "D" Else: davis(round) = "C" End IfEnd IfIf round = 1 Thenselfprev = davis(1)Else: selfprev = davis(round - 1)End IfEnd SubSub downing(round As Integer, prevopponent As String, selfprev As String, downing() As String, k As Integer, good As Double, bad As Double, nice1 As Double, nice2 As Double, total_C As Double, total_D As Double)Dim c As DoubleDim alt As DoubleIf round <= 2 Thendowning(round) = "D"Exit SubEnd IfIf round > 2 Then If downing(round - 1) = "D" Then If prevopponent = "C" Then nice2 = nice2 + 1 total_D = total_D + 1 bad = nice2 / total_D End If Else: If prevopponent = "C" Then nice1 = nice1 + 1 total_C = total_C + 1 good = nice1 / total_C End If End IfEnd Ifc = 6 * good - 8 * bad - 2alt = 4 * good - 5 * bad - 1If c >= 0 And c >= alt Then downing(round) = "C"ElseIf c >= 0 And c < alt Then If downing(round - 1) = "C" Then downing(round) = "D" If downing(round - 1) = "D" Then downing(round) = "C"ElseIf alt >= 0 Then If downing(round - 1) = "C" Then downing(round) = "D" If downing(round - 1) = "D" Then downing(round) = "C"Else: downing(round) = "D"End IfIf round = 1 Thenselfprev = downing(1)Else: selfprev = downing(round - 1)End IfEnd SubSub score(player1() As String, player2() As String, player1score() As Integer, player2score() As Integer, k)Dim y As IntegerReDim Preserve player1(1 To k)ReDim Preserve player2(1 To k)ReDim Preserve player1score(1 To k)ReDim Preserve player2score(1 To k)For y = 1 To k If player1(y) = "C" And player2(y) = "C" Then player1score(y) = 3 player2score(y) = 3 ElseIf player1(y) = "C" And player2(y) = "D" Then player1score(y) = 0 player2score(y) = 5 ElseIf player1(y) = "D" And player2(y) = "C" Then player1score(y) = 5 player2score(y) = 0 ElseIf player1(y) = "D" And player2(y) = "D" Then player1score(y) = 1 player2score(y) = 1 End IfNext yEnd SubSub tournament()Dim player1() As String, player2() As String, prevp1 As String, prevp2 As StringDim round As IntegerDim k As Integer, n As Integer, m As Integer, g As Integer, j As Integer, y As IntegerDim play1 As String, play2 As StringDim legitfriedman As Boolean, legitdavis As BooleanDim good As Double, bad As Double, nice1 As Double, nice2 As Double, total_C As Double, total_D As DoubleDim p1score() As Integer, p2score() As Integer, ttlscore1() As Integer, ttlscore2() As Integerlegitfriedman = Truelegitdavis = Truek = 200ReDim player1(1 To k)ReDim player2(1 To k)ReDim p1score(1 To k)ReDim p2score(1 To k)ReDim ttlscore1(1 To k)ReDim ttlscore2(1 To k)good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitfriedman = Truelegitdavis = TrueFor n = 1 To 6For round = 1 To 200Call random(round, prevp2, prevp1, player1(), k)If n = 1 ThenCall random(round, prevp1, prevp2, player2(), k)ElseIf n = 2 ThenCall titfortat(round, prevp1, prevp2, player2(), k)ElseIf n = 3 ThenCall grofman(round, prevp1, prevp2, player2(), k)ElseIf n = 4 ThenCall friedman(round, prevp1, prevp2, player2(), k, legitfriedman)ElseIf n = 5 ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf n = 6 ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZIf n = 1 Then Cells(8, 8).Value = ttlscore1(200)If n = 2 ThenCells(8, 9).Value = ttlscore1(200)Cells(9, 8).Value = ttlscore2(200)ElseIf n = 3 ThenCells(8, 10).Value = ttlscore1(200)Cells(10, 8).Value = ttlscore2(200)ElseIf n = 4 ThenCells(8, 11).Value = ttlscore1(200)Cells(11, 8).Value = ttlscore2(200)ElseIf n = 5 ThenCells(8, 12).Value = ttlscore1(200)Cells(12, 8).Value = ttlscore2(200)ElseIf n = 6 ThenCells(8, 13).Value = ttlscore1(200)Cells(13, 8).Value = ttlscore2(200)End IfNext n'#2good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitfriedman = Truelegitdavis = TrueFor m = 1 To 5For round = 1 To 200Call titfortat(round, prevp2, prevp1, player1(), k)If m = 1 ThenCall titfortat(round, prevp1, prevp2, player2(), k)ElseIf m = 2 ThenCall grofman(round, prevp1, prevp2, player2(), k)ElseIf m = 3 ThenCall friedman(round, prevp1, prevp2, player2(), k, legitfriedman)ElseIf m = 4 ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf m = 5 ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZIf m = 1 Then Cells(9, 9).Value = ttlscore1(200)If m = 2 ThenCells(9, 10).Value = ttlscore1(200)Cells(10, 9).Value = ttlscore2(200)ElseIf m = 3 ThenCells(9, 11).Value = ttlscore1(200)Cells(11, 9).Value = ttlscore2(200)ElseIf m = 4 ThenCells(9, 12).Value = ttlscore1(200)Cells(12, 9).Value = ttlscore2(200)ElseIf m = 5 ThenCells(9, 13).Value = ttlscore1(200)Cells(13, 9).Value = ttlscore2(200)End IfNext m'#3good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitfriedman = Truelegitdavis = TrueFor g = 1 To 4For round = 1 To 200Call grofman(round, prevp2, prevp1, player1(), k)If g = 1 ThenCall grofman(round, prevp1, prevp2, player2(), k)ElseIf g = 2 ThenCall friedman(round, prevp1, prevp2, player2(), k, legitfriedman)ElseIf g = 3 ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf g = 4 ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZIf g = 1 Then Cells(10, 10).Value = ttlscore1(200)If g = 2 ThenCells(10, 11).Value = ttlscore1(200)Cells(11, 10).Value = ttlscore2(200)ElseIf g = 3 ThenCells(10, 12).Value = ttlscore1(200)Cells(12, 10).Value = ttlscore2(200)ElseIf g = 4 ThenCells(10, 13).Value = ttlscore1(200)Cells(13, 10).Value = ttlscore2(200)End IfNext g'#4good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitfriedman = Truelegitdavis = TrueFor j = 1 To 3For round = 1 To 200Call friedman(round, prevp2, prevp1, player1(), k, legitfriedman)If j = 1 ThenCall friedman(round, prevp1, prevp2, player2(), k, legitfriedman)ElseIf j = 2 ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf j = 3 ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZIf j = 1 Then Cells(11, 11).Value = ttlscore1(200)If j = 2 ThenCells(11, 12).Value = ttlscore1(200)Cells(12, 11).Value = ttlscore2(200)ElseIf j = 3 ThenCells(11, 13).Value = ttlscore1(200)Cells(13, 11).Value = ttlscore2(200)End IfNext j'#5good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitfriedman = Truelegitdavis = TrueFor y = 1 To 2For round = 1 To 200Call davis(round, prevp2, prevp1, player1(), k, legitdavis)If y = 1 ThenCall davis(round, prevp1, prevp2, player2(), k, legitdavis)ElseIf y = 2 ThenCall downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)End IfNext roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZIf y = 1 Then Cells(12, 12).Value = ttlscore1(200)If y = 2 ThenCells(12, 13).Value = ttlscore1(200)Cells(13, 12).Value = ttlscore2(200)End IfNext y'#6good = 1#bad = 0#nice1 = 0nice2 = 0total_C = 0total_D = 0legitdavis = TrueFor round = 1 To 200Call downing(round, prevp2, prevp1, player1(), k, good, bad, nice1, nice2, total_C, total_D)Call downing(round, prevp1, prevp2, player2(), k, good, bad, nice1, nice2, total_C, total_D)Next roundCall score(player1, player2, p1score, p2score, k)ttlscore1(1) = p1score(1)ttlscore2(1) = p2score(1)For Z = 2 To k ttlscore1(Z) = p1score(Z) + ttlscore1(Z - 1) ttlscore2(Z) = p2score(Z) + ttlscore2(Z - 1)Next ZCells(13, 13).Value = ttlscore1(200)End Sub