fork download
  1. """
  2. ポイント貯め
  3. 25ポイント以上でゲーム終了
  4.  
  5. ブロックの種類 3種類+説明
  6.  
  7. 1A
  8. 自分のターンでサイコロの値が1か3なら+1ポイント増える
  9. 内部構造 MAPに配置しているブロック数*1
  10.  
  11. 2A 2A
  12. 自分のターンでサイコロの値が2か4なら+2ポイント増える
  13. 内部構造 MAPに配置している(ブロック数/2)*2
  14.  
  15. 3A 3A 3A
  16. 誰のターンでもOK サイコロの値が3か6なら+1ポイント増える
  17. 内部構造 MAPに配置している(ブロック数/3)*1
  18.  
  19.  
  20. ルール
  21. 交互に3種類の中からブロックを選び配置して行く
  22. 一度配置されたブロックは動かない
  23. ブロックの置き換え不可能
  24. 配置位置がMAPから外の場合は無効
  25. ブロックの種類が0,1,2 以外なら失敗扱いで次のユーザーへ
  26. MAP上が全て埋まってもポイント達成まで、ターンが流れる
  27. 横に置く場合は0 縦に置く場合1
  28.  
  29.  
  30. 攻略
  31. ポイント効率を考えると2番目のブロックが最適です。
  32. 長期戦を狙い相手の邪魔をしたいなら3番目のブロックが都合が良いでしょう。
  33. 何処にでも配置できる1番目のブロックは終盤で配置して行く形が定石です。
  34.  
  35.  
  36. 入力形式
  37. 横 縦 ブロックの種類 横[0]か縦[1]
  38. 0 0 0 0
  39.  
  40. """
  41.  
  42.  
  43.  
  44.  
  45.  
  46. #sleep(0.2)
  47. import random
  48. import collections
  49. from time import sleep
  50. from pprint import pprint
  51.  
  52.  
  53.  
  54. # ターン判定用
  55. saikoro=0
  56. # ユーザースコア
  57. Demo_Use1=0
  58. Demo_Use2=0
  59. # ユーザー入力用 配列
  60. Horizontal_or_Vertical=[]
  61. # サイコロの値を格納する配列
  62. Dice=[i for i in range(1,6)]
  63. # ユーザー別 ブロックの種類など
  64. r1=[['1A'],['2A','2A'],['3A','3A','3A']]
  65. r2=[['1B'],['2B','2B'],['3B','3B','3B']]
  66. # MAP 5*5=25マス
  67. l = [['0' for i in range(5)] for j in range(5)]
  68.  
  69.  
  70.  
  71. # 横 side ユーザーA Use1
  72. def Sample_Demo_New_Bloku2(x,y,z):
  73. for i in range(len(z)):
  74. if l[x][y+i]=='0':
  75. l[x][y+i]=r1[r1.index(z)][i]
  76. else:pass
  77.  
  78. #Sample_Demo_New_Bloku2(0,0,r1[1])
  79.  
  80. # 縦 Vertical ユーザーA Use1
  81. def Sample_Demo_New_Bloku3(x,y,z):
  82. for i in range(len(z)):
  83. if l[x+i][y]=='0':
  84. l[x+i][y]=r1[r1.index(z)][i]
  85. else:pass
  86.  
  87. #Sample_Demo_New_Bloku3(0,0,r1[1])
  88.  
  89.  
  90.  
  91. # 横 side ユーザーB Use2
  92. def Sample_Demo_New_Bloku4(x,y,z):
  93. for i in range(len(z)):
  94. if l[x][y+i]=='0':
  95. l[x][y+i]=r2[r2.index(z)][i]
  96. else:pass
  97.  
  98. #Sample_Demo_New_Bloku2(0,0,r1[1])
  99.  
  100. # 縦 Vertical ユーザーB Use2
  101. def Sample_Demo_New_Bloku5(x,y,z):
  102. for i in range(len(z)):
  103. if l[x+i][y]=='0':
  104. l[x+i][y]=r2[r2.index(z)][i]
  105. else:pass
  106.  
  107. #Sample_Demo_New_Bloku3(0,0,r1[1])
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. # 各MAP要素の合計
  115. def Sample_Demo_New_Bloku_Initialization():
  116. c=[]
  117. for i in range(len(l)):
  118. c.append(collections.Counter(l[i]))
  119. for j in range(len(c)-1):
  120. c[0]+=c[j+1]
  121. return c[0]
  122.  
  123. #T=Sample_Demo_New_Bloku_Initialization()
  124. #print(T.keys(),T.values())
  125.  
  126. # サイコロの値
  127. def Sample_Demo_New_Bloku_Random_Number():
  128. global Dice
  129. return random.choice(Dice)
  130.  
  131. #Q=Sample_Demo_New_Bloku_Random_Number()
  132. #print(Q)
  133.  
  134.  
  135.  
  136.  
  137. # MAPからポイント判定用素材の準備
  138. def Sample_Demo_New_Bloku_Scoring():
  139. global Demo_Use1,Demo_Use2
  140. for k,v in T.items():
  141. #print(k,v)
  142. if Q==1 or Q==3:
  143. if saikoro%2==1:
  144. if k=='1A':
  145. Demo_Use1+=1*v
  146. if saikoro%2==0:
  147. if k=='1B':
  148. Demo_Use2+=1*v
  149.  
  150. if Q==2 or Q==4:
  151. if saikoro%2==1:
  152. if k=='2A':
  153. Demo_Use1+=2*(v/2)
  154. if saikoro%2==0:
  155. if k=='2B':
  156. Demo_Use2+=2*(v/2)
  157.  
  158. if Q==3 or Q==6:
  159. if k=='3A':
  160. Demo_Use1+=1*(v/3)
  161. if k=='3B':
  162. Demo_Use2+=1*(v/3)
  163.  
  164. return(int(Demo_Use1),int(Demo_Use2))
  165.  
  166.  
  167. #Sample_Demo_New_Bloku_Scoring()
  168.  
  169.  
  170.  
  171. """
  172.  
  173. Main (仮)
  174.  
  175. """
  176.  
  177. # ユーザーのどちらかが、25ポイント以上なら終了
  178. while int(Demo_Use1)<=25 or int(Demo_Use2)<=25:
  179. # ターン処理
  180. saikoro+=1
  181. # 操作コメント
  182. print('横x 縦y ブロック番号 縦か横 [0 or1]')
  183. # 実際のユーザー入力
  184. Horizontal_or_Vertical=list(map(int,input().split()))
  185. # ターンによるユーザー分け
  186. if saikoro%2==1:
  187. print('ユーザー Aのターン')
  188. try:
  189. if Horizontal_or_Vertical[-1]==0:
  190. Sample_Demo_New_Bloku2(Horizontal_or_Vertical[0],Horizontal_or_Vertical[1],r1[Horizontal_or_Vertical[2]])
  191. elif Horizontal_or_Vertical[-1]==1:
  192. Sample_Demo_New_Bloku3(Horizontal_or_Vertical[0],Horizontal_or_Vertical[1],r1[Horizontal_or_Vertical[2]])
  193. except IndexError:
  194. pass
  195. elif saikoro%2==0:
  196. print('ユーザー Bのターン')
  197. try:
  198. if Horizontal_or_Vertical[-1]==0:
  199. Sample_Demo_New_Bloku4(Horizontal_or_Vertical[0],Horizontal_or_Vertical[1],r2[Horizontal_or_Vertical[2]])
  200. elif Horizontal_or_Vertical[-1]==1:
  201. Sample_Demo_New_Bloku5(Horizontal_or_Vertical[0],Horizontal_or_Vertical[1],r2[Horizontal_or_Vertical[2]])
  202. except IndexError:
  203. pass
  204. # MAP要素のカウント
  205. T=Sample_Demo_New_Bloku_Initialization()
  206. # 毎ターン振られるサイコロの目
  207. Q=Sample_Demo_New_Bloku_Random_Number()
  208. print('サイコロの目',Q)
  209. # 各ユーザーの 現在のスコア
  210. print('スコア',Sample_Demo_New_Bloku_Scoring())
  211. # MAP表示
  212. pprint(l)
  213.  
  214.  
Runtime error #stdin #stdout #stderr 0.04s 12332KB
stdin
Standard input is empty
stdout
横x 縦y ブロック番号 縦か横 [0 or1]
stderr
Traceback (most recent call last):
  File "./prog.py", line 184, in <module>
EOFError: EOF when reading a line