খেলাাটি
আপনি সংযোগ -4 এর একটি (প্রায়) মানক গেম খেলবেন । দুর্ভাগ্যক্রমে, এটি একটি সংবাদপত্রের খেলা এবং কেউ নীচের দিক থেকে শুরু করে প্রতিটি দ্বিতীয় সারিতে কালো টেপ রেখেছিল, যাতে আপনি এই সারিগুলির মধ্যে আপনার প্রতিপক্ষের কোনও চালনা দেখতে না পান।
ইতিমধ্যে পূর্ণ কলামগুলির মধ্যে যে কোনও চলন আপনার পালা হিসাবে গণ্য হবে এবং কোনও গেম যদি টার্নের চেয়ে বেশি সময় ধরে চালিত হয় তবে 6 * 7
এটি ড্র হিসাবে রায় দেওয়া হবে।
চ্যালেঞ্জ স্পেসিফিকেশন
আপনার প্রোগ্রামটি পাইথন 3 ফাংশন হিসাবে প্রয়োগ করা উচিত। প্রথম যুক্তি হ'ল বোর্ডের একটি 'ভিউ', যা নীচে থেকে শীর্ষে সারিগুলির 2D তালিকা হিসাবে পরিচিত বোর্ডের রাষ্ট্রকে প্রতিনিধিত্ব করে যেখানে 1
প্রথম খেলোয়াড়ের চালনা, 2
দ্বিতীয় খেলোয়াড়ের 0
চালনা এবং একটি খালি অবস্থান বা একটি লুকানো আপনার প্রতিপক্ষ দ্বারা সরানো
দ্বিতীয় যুক্তিটি হল একটি টার্ন নম্বর যা থেকে সূচিকৃত হয় 0
এবং এর সমতা আপনাকে বলে দেয় আপনি কোন খেলোয়াড়।
চূড়ান্ত যুক্তি হ'ল একটি স্বেচ্ছাসেবী রাষ্ট্র, None
প্রতিটি গেমের শুরুতে শুরু হয়, যা আপনি পালাগুলির মধ্যে রাষ্ট্র সংরক্ষণ করতে ব্যবহার করতে পারেন।
আপনি যে কলাম সূচকটি খেলতে চান তার একটি 2-tuple ফিরে আসা উচিত এবং পরের বারের দিকে আপনাকে নতুন রাষ্ট্র ফিরিয়ে দেওয়া উচিত।
স্কোরিং
হিসাবে একটি জয় গন্য +1
, যেমন ড্র 0
, এবং একটি ক্ষতি -1
। আপনার লক্ষ্যটি হল একটি রাউন্ড-রবিন টুর্নামেন্টে সর্বোচ্চ গড় স্কোর অর্জন। আমি একটি পরিষ্কার বিজয়ী সনাক্ত করতে প্রয়োজন হিসাবে অনেক ম্যাচ চালানোর চেষ্টা করব।
বিধি
যে কোনও প্রতিযোগীর কাছে যে কোনও সময়ে সর্বাধিক একটি প্রতিযোগী বট হওয়া উচিত, তবে আপনি উন্নতি করে থাকলে আপনার প্রবেশিকা আপডেট করা ঠিক হবে। অনুগ্রহ করে আপনার বটকে প্রতি টার্ন ভাবার সময়কে 1 ডলারে সীমাবদ্ধ করার চেষ্টা করুন to
পরীক্ষামূলক
নিয়ামকটির জন্য উত্স কোডটি এখানে একসাথে উল্লেখযোগ্য কয়েকটি প্রতিদ্বন্দ্বী উদাহরণস্বরূপ বটগুলি সহ:
import itertools
import random
def get_strides(board, i, j):
yield ((i, k) for k in range(j + 1, 7))
yield ((i, k) for k in range(j - 1, -1, -1))
yield ((k, j) for k in range(i + 1, 6))
yield ((k, j) for k in range(i - 1, -1, -1))
directions = [(1, 1), (-1, -1), (1, -1), (-1, 1)]
def diag(di, dj):
i1 = i
j1 = j
while True:
i1 += di
if i1 < 0 or i1 >= 6:
break
j1 += dj
if j1 < 0 or j1 >= 7:
break
yield (i1, j1)
for d in directions:
yield diag(*d)
DRAWN = 0
LOST = 1
WON = 2
UNDECIDED = 3
def get_outcome(board, i, j):
if all(board[-1]):
return DRAWN
player = board[i][j]
strides = get_strides(board, i, j)
for _ in range(4):
s0 = next(strides)
s1 = next(strides)
n = 1
for s in (s0, s1):
for i1, j1 in s:
if board[i1][j1] == player:
n += 1
if n >= 4:
return WON
else:
break
return UNDECIDED
def apply_move(board, player, move):
for i, row in enumerate(board):
if board[i][move] == 0:
board[i][move] = player
outcome = get_outcome(board, i, move)
return outcome
if all(board[-1]):
return DRAWN
return UNDECIDED
def get_view(board, player):
view = [list(row) for row in board]
for i, row in enumerate(view):
if i % 2:
continue
for j, x in enumerate(row):
if x == 3 - player:
row[j] = 0
return view
def run_game(player1, player2):
players = {1 : player1, 2 : player2}
board = [[0] * 7 for _ in range(6)]
states = {1 : None, 2 : None}
for turn in range(6 * 7):
p = (turn % 2) + 1
player = players[p]
view = get_view(board, p)
move, state = player(view, turn, states[p])
outcome = apply_move(board, p, move)
if outcome == DRAWN:
return DRAWN
elif outcome == WON:
return p
else:
states[p] = state
return DRAWN
def get_score(counts):
return (counts[WON] - counts[LOST]) / float(sum(counts))
def run_tournament(players, rounds=10000):
counts = [[0] * 3 for _ in players]
for r in range(rounds):
for i, player1 in enumerate(players):
for j, player2 in enumerate(players):
if i == j:
continue
outcome = run_game(player1, player2)
if outcome == DRAWN:
for k in i, j:
counts[k][DRAWN] += 1
else:
if outcome == 1:
w, l = i, j
else:
w, l = j, i
counts[w][WON] += 1
counts[l][LOST] += 1
ranks = sorted(range(len(players)), key = lambda i: get_score(counts[i]), reverse=True)
print("Round %d of %d\n" % (r + 1, rounds))
rows = [("Name", "Draws", "Losses", "Wins", "Score")]
for i in ranks:
name = players[i].__name__
score = get_score(counts[i])
rows.append([name + ":"] + [str(n) for n in counts[i]] + ["%6.3f" % score])
lengths = [max(len(s) for s in col) + 1 for col in zip(*rows)]
for i, row in enumerate(rows):
padding = ((n - len(s)) * ' ' for s, n in zip(row, lengths))
print(''.join(s + p for s, p in zip(row, padding)))
if i == 0:
print()
print()
def random_player(view, turn, state):
return random.randrange(0, 7), state
def constant_player(view, turn, state):
return 0, state
def better_random_player(view, turn, state):
while True:
j = random.randrange(0, 7)
if view[-1][j] == 0:
return j, state
def better_constant_player(view, turn, state):
for j in range(7):
if view[-1][j] == 0:
return j, state
players = [random_player, constant_player, better_random_player, better_constant_player]
run_tournament(players)
শুভ কোথিং!
অস্থায়ী ফলাফল
Name Draws Losses Wins Score
zsani_bot: 40 5377 94583 0.892
better_constant_player: 0 28665 71335 0.427
constant_player: 3 53961 46036 -0.079
normalBot: 38 64903 35059 -0.298
better_random_player: 192 71447 28361 -0.431
random_player: 199 75411 24390 -0.510