Skip to content

Instantly share code, notes, and snippets.

@paralax
Created August 5, 2015 20:32
Show Gist options
  • Save paralax/664a90b2e24b6375008f to your computer and use it in GitHub Desktop.
Save paralax/664a90b2e24b6375008f to your computer and use it in GitHub Desktop.
from sys import argv
move_space = "abcdefg"
gameboard = [['.' for x in range(7)] for x in range(6)]
def place_move(column, player):
col = move_space.index(column.lower())
for row in range(6):
if gameboard[row][col] == '.':
gameboard[row][col] = player
return [row,col]
return None
def check_win(last_move,p):
lrow,lcol = last_move
if check_row(lrow,p) or check_col(lcol,p) or check_diagonal(lrow,lcol,p):
return True
else:
return False
def check_row(row,p):
if p*4 in ''.join(gameboard[row]):
return True
else:
return False
def check_col(col,p):
column = [gameboard[x][col] for x in range(6)]
if p*4 in ''.join(column):
return True
else:
return False
def check_diagonal(row,col,p):
drow,dcol = row,col
while drow > 0 and dcol > 0:
drow-=1
dcol-=1
check = 0
while drow < 6 and dcol < 6:
if gameboard[drow][dcol] == p:
check+=1
else:
check = 0
drow+=1
dcol+=1
if check >= 4:
return True
drow,dcol = row,col
while drow < 5 and dcol > 0:
drow += 1
dcol -= 1
check = 0
while drow > 0 and dcol < 6:
if gameboard[drow][dcol] == p:
check += 1
else:
check = 0
drow-=1
dcol+=1
if check >= 4:
return True
else:
return False
def print_board():
print " a b c d e f g"
for row in range(6):
print str(6-row) + " ",
for space in gameboard[5-row]:
print space,
print
import random
def getmove(remaining):
if not remaining:
raise Exception('No more moves left')
col = random.choice('abcdefg')
if col in remaining:
remaining.remove(col)
return (col, remaining)
else:
return getmove(remaining)
def mkmoves():
res = ''
remaining = []
for x in 'abcdefg': remaining.extend([x] * 6)
n = 0
for n in xrange(36):
col, remaining = getmove(remaining)
if (n%2 == 0):
res += '%s ' % col.upper()
else:
res += '%s\n' % col
n += 1
return res
import stats
scores = {'X':0, 'O':0, 'draw': 0}
gamelen = []
for _ in xrange(10000):
move_space = "abcdefg"
gameboard = [['.' for x in range(7)] for x in range(6)]
movelist = mkmoves().splitlines()
movenum = 1
winner = 'draw'
# movelist = open(argv[1]).read().splitlines()
for pair in movelist:
print movenum
move = place_move(pair[0],"X")
print_board()
if check_win(move,"X"):
print "X won at move " + str(movenum)
winner = 'X'
gamelen.append(movenum)
break
move = place_move(pair[3],"O")
print_board()
if check_win(move,"O"):
print "O won at move " + str(movenum)
winner = 'O'
gamelen.append(movenum)
break
movenum += 1
scores[winner] = scores.get(winner, 0) + 1
print scores
s = stats.Statistics(gamelen)
print 'n=%s mean=%s+/-%s mode=%s' % (s.N, s.mean, s.stddev, s.mode)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment