game.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import numpy as np
  2. import sys
  3. sys.path.append('./players')
  4. import playerConfig
  5. import players.playerVeryGood as player1dist
  6. import players.playerGood as player2dist
  7. class Game():
  8. def __init__(self, player1, player2,total1=0,total2=0):
  9. self.player_positions=[0]*2
  10. self.players=[0]*2
  11. self.totals=[0]*2
  12. self.known_player_positions=[0]*2
  13. for i in range(2):
  14. self.player_positions[i]=np.random.randint(0,playerConfig.MAX_STATE,playerConfig.DIMENSION)
  15. self.known_player_positions[i]=np.array([playerConfig.MAX_STATE]*playerConfig.DIMENSION)
  16. self.players[0]=player1
  17. self.players[1]=player2
  18. self.totals[0]=total1
  19. self.totals[1]=total2
  20. self.step=0
  21. return
  22. def GenKnownPositions(self,actual_positions=[],previous_positions=[],step=0):
  23. new_positions=actual_positions.copy()
  24. if playerConfig.MAX_STATE//2-step>0:
  25. new_positions+=np.random.randint(0,playerConfig.MAX_STATE//2-step,actual_positions.shape[0])
  26. pp=previous_positions[new_positions>previous_positions].copy()
  27. new_positions[new_positions>previous_positions]=pp
  28. return new_positions
  29. def GetScore(self,pos1,pos2):
  30. s=(np.array(pos1-pos2)*playerConfig.Weights).sum()+(np.random.rand()-0.5)
  31. if s>0:
  32. return 0
  33. else:
  34. return 1
  35. def Step(self,person=0):
  36. steps=[0]*2
  37. for i in range(2):
  38. self.known_player_positions[i]=self.GenKnownPositions(actual_positions=self.player_positions[i],
  39. previous_positions=self.known_player_positions[i],
  40. step=self.step)
  41. i=person
  42. steps[i]=self.players[i].Step(step=self.step,
  43. own_state=self.player_positions[i],
  44. known_state_opponent=self.known_player_positions[(i+1)%2])
  45. self.step+=1
  46. if steps[i]==playerConfig.PASS:
  47. self.totals[i]-=playerConfig.Prices[playerConfig.PASS]
  48. self.totals[(i+1)%2]+=playerConfig.Prices[playerConfig.PASS]
  49. return playerConfig.PASS
  50. if steps[i]==playerConfig.ACT:
  51. score=self.GetScore(self.player_positions[0],self.player_positions[1])
  52. if score==i:
  53. self.totals[i]+=playerConfig.Prices[playerConfig.ACT]
  54. self.totals[(i+1)%2]-=playerConfig.Prices[playerConfig.ACT]
  55. if score==(i+1)%2:
  56. self.totals[i]-=playerConfig.Prices[playerConfig.ACT]
  57. self.totals[(i+1)%2]+=playerConfig.Prices[playerConfig.ACT]
  58. return playerConfig.ACT
  59. if steps[i]==playerConfig.LOOK:
  60. self.totals[i]-=playerConfig.Prices[playerConfig.PASS]
  61. self.totals[(i+1)%2]+=playerConfig.Prices[playerConfig.PASS]
  62. return playerConfig.LOOK
  63. total1=0
  64. total2=0
  65. ITTS=30000
  66. for itt in range(ITTS):
  67. # print("Game",itt)
  68. for person in range(2):
  69. player1=player1dist.Player()
  70. player2=player2dist.Player()
  71. game=Game(player1,player2,total1,total2)
  72. # print('actual:',game.player_positions)
  73. cycle=0
  74. person_act=person
  75. while True and cycle<10:
  76. result=game.Step(person=person_act)
  77. # print('person:',person_act,'result:',result)
  78. # print(np.array(game.totals)/itt)
  79. print(person_act,'result:',playerConfig.Actions[result])
  80. if result==playerConfig.ACT or result==playerConfig.PASS:
  81. break
  82. cycle+=1
  83. person_act+=1
  84. person_act%=2
  85. total1=game.totals[0]
  86. total2=game.totals[1]
  87. # 1 - GoodPlayer
  88. # 2 - BadPlayer
  89. print(np.array(game.totals)/ITTS)