Ya betul, game othello dapat dibuat dalam 100 baris kode. berikut ini cara membuatnya.
- Program menggambar dan konversi image (saya pakai InkScape+Paint.NET+IrfanView)
Code:
from pygame import *
init()
PLAYERTURN,CPUTURN = 0,1
turn,remain = PLAYERTURN,60
board = [[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,1,2,0,0,0],
[0,0,0,2,1,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]]
def find(x,y,delta,piece):
global remain
result = [(x,y)]
dx,dy=x+delta[0],y+delta[1]
if (dx>=0) and (dx<8) and (dy>=0) and (dy<8):
if board[dy][dx]==0:
return []
elif board[dy][dx]==piece:
return result
else:
tmp = find(dx, dy, delta, piece)
if len(tmp)>0:
result += tmp
if len(result)>1:
return result
else:
return []
def switchturn():
global turn
if turn==PLAYERTURN:
turn=CPUTURN
else:
turn=PLAYERTURN
def pick(x,y):
global remain
neighbors = [(0,-1),(1,-1),(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1)]
if (x<0) or (x>7) or (y<0) or (y>7) or board[y][x] <> 0:
return False
if turn == 0:
opposite = 1
else:
opposite = 0
tmp = []
for n in neighbors:
dx,dy=x+n[0],y+n[1]
if (dx>=0) and (dx<8) and (dy>=0) and (dy<8) and (board[dy][dx]==opposite+1): #tetangga beda keping, tapi di ujung ada keping yang sama
tmp2 = find(dx,dy,n,turn+1)
if len(tmp2)>0:
tmp += tmp2
if len(tmp)==0:
return False
for p in tmp:
board[p[1]][p[0]] = turn+1
board[y][x] = 1+turn
remain-=1
return True
def main():
global remain, neighbors, turn
display.init()
font.init()
screen = display.set_mode((288, 256), HWSURFACE|DOUBLEBUF)
clock = time.Clock()
fnt = font.Font(None, 24)
cell = image.load("cell.png")
cw,ch=cell.get_width(),cell.get_height()
keping = [image.load("white.png"), image.load("black.png")]
imturn = [fnt.render("P1", 1, (0,0,0)), fnt.render("P2", 1, (0,0,0)) ]
imgo = font.Font(None, 48).render("GAME OVER", 1, (255,0,0))
running = True
while running:
clock.tick(20)
screen.fill((255,255,255))
for y in range(0,8):
for x in range(0,8):
screen.blit(cell, (x*cw, y*ch)) #gambar papan
if board[y][x] > 0:
screen.blit(keping[board[y][x]-1], (1+x*cw, 1+y*ch)) # gambar keping
screen.blit(imturn[turn], (258, ch)) #gambar teks giliran
screen.blit(keping[turn], (256, 0)) #gambar keping giliran
for e in event.get():
if e.type == QUIT or (e.type==KEYDOWN and e.key==K_ESCAPE):
running = False
break
if e.type == MOUSEBUTTONDOWN:
if pick(e.pos[0]/cw,e.pos[1]/ch):
switchturn()
if e.type == KEYDOWN:
if e.key == K_SPACE:
switchturn() #pass/lewati giliran kalau tidak ada yang bisa dilakukan
if remain==0:
screen.blit(imgo, ((screen.get_width()-imgo.get_width())/2, (screen.get_height()-imgo.get_height())/2)) #end of the game
display.update()
main()