vous connaissez surement ce jeu, donc je vais pas expliquer quel est son principe. et pour ceux qui connaissent pas, je suis desolé ;).
j'ai utiliser qq notions de POO, ça fait style ;)
Source / Exemple :
#!/usr/bin/env python
from Tkinter import *
class ReversiGUI(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.table = []
self.color = [["#EEE","#FFF","EEE"],["#F88","#FCC","#FDD"],["#88F","#CCF","#DDF"]]
self.net = 0
self.reversi = Reversi()
self.players = [Player(self.reversi),Human(self.reversi,"player1"),Human(self.reversi,"player2")]
self.hostname = ""
self.createWidget()
self.new()
def defPushButton(self,i,j):
def pushButton():
self.pushButton(i,j)
self.table[i][j]["command"] = pushButton
def new(self):
i = 0
for entry in self.entryPlayerName:
i = i + 1
entry.delete(0, END)
entry.insert(0, self.players[i].name)
i = 0
for check in self.checkPlayerAI:
i = i + 1
if isinstance(self.players[i],AI): check.set(1)
else : check.set(0)
self.network.set(self.net)
self.entryHostname.delete(0, END)
self.entryHostname.insert(0, self.hostname)
self.tableFrame.forget()
self.tableConfig.pack(fill=BOTH, expand=1, side=TOP)
self.buttonNew["state"] = "disable"
def newOk(self):
i = 0
name = ["",""]
for entry in self.entryPlayerName:
name[i] = entry.get()
i = i + 1
self.net = self.network.get()
self.hostname = self.entryHostname.get()
if self.net:
if self.hostname == "":
self.players[2] = Net(self.reversi,name[1])
if self.checkPlayerAI[0].get(): self.players[1] = AI(self.reversi,name[0])
else: self.players[1] = Human(self.reversi,name[0])
else:
self.players[1] = Net(self.reversi,name[0],hostname)
if self.checkPlayerAI[1].get(): self.players[2] = AI(self.reversi,name[1])
else: self.players[2] = Human(self.reversi,name[1])
else:
for i in range(2):
if self.checkPlayerAI[i].get(): self.players[i+1] = AI(self.reversi,name[i])
else: self.players[i+1] = Human(self.reversi,name[i])
self.reversi.reset()
self.maj()
self.tableConfig.forget()
self.tableFrame.pack(fill=BOTH, expand=1, side=TOP)
self.buttonNew["state"] = "normal"
def newCancel(self):
self.tableConfig.forget()
self.tableFrame.pack(fill=BOTH, expand=1, side=TOP)
def createWidget(self):
self.pack(fill=BOTH, expand=1)
self.buttonFrame = Frame(self)
self.buttonFrame.pack(fill=X,side=BOTTOM)
self.buttonExit = Button(self.buttonFrame, text="Exit", command=self.quit)
self.buttonExit.pack(side=LEFT,fill=X,expand=1)
self.buttonNew = Button(self.buttonFrame, text="New", command=self.new)
self.buttonNew.pack(side=RIGHT,fill=X,expand=1)
self.player = Label(self)
self.player.pack(fill=X, side=BOTTOM)
self.tableFrame = Frame(self)
self.tableFrame.pack(fill=BOTH, expand=1, side=TOP)
self.tableConfig = Frame(self)
self.entryPlayerName = []
self.checkPlayerAI = []
for i in range(1,3):
frame = Frame(self.tableConfig)
Label(frame, text="player "+str(i)+" name :").pack(side=LEFT)
self.checkPlayerAI.append(IntVar())
if isinstance(self.players[i], AI): self.checkPlayerAI[-1].set(1)
else: self.checkPlayerAI[-1].set(0)
Checkbutton(frame, text="AI", variable=self.checkPlayerAI[-1]).pack(side=RIGHT)
self.entryPlayerName.append(Entry(frame))
self.entryPlayerName[-1].insert(0, self.players[i].name)
self.entryPlayerName[-1].pack(side=RIGHT,fill=X,expand=1)
frame.pack(side=TOP,fill=X)
frame = Frame(self.tableConfig)
Label(frame, text="hostname").pack(side=LEFT)
self.entryHostname = Entry(frame)
self.entryHostname.insert(0, self.hostname)
self.entryHostname.pack(side=RIGHT,fill=X,expand=1)
frame.pack(side=TOP,fill=X)
self.network = IntVar()
self.CheckNetwork = Checkbutton(self.tableConfig, text="NetWork", variable=self.network)
self.network.set(self.net)
self.CheckNetwork.pack(side=TOP, fill=X)
frame = Frame(self.tableConfig)
Button(frame, text="Ok", command=self.newOk).pack(side=LEFT,fill=X,expand=1)
Button(frame, text="Cancel", command=self.newCancel).pack(side=RIGHT,fill=X,expand=1)
frame.pack(side=TOP,fill=X)
for i in range(8):
self.table.append([])
for j in range(8):
self.table[i].append(Button(self.tableFrame))
self.table[i][j].grid(row=j,column=i)
self.defPushButton(i,j)
def play(self, x, y):
if self.reversi.play(x, y):
self.maj()
return
self.player["text"] = "Game Interrupted (Play Error)"
def pushButton(self, i, j):
self.players[self.reversi.player].callback(i,j)
def maj(self):
for i in range(8):
for j in range(8):
self.table[i][j]["bg"] = self.color[self.reversi.table[i][j]][0]
self.table[i][j]["activebackground"] = self.color[self.reversi.player][1]
if (i,j) in self.reversi.playList:
self.table[i][j]["bg"] = self.color[self.reversi.player][2]
self.table[i][j]["activebackground"] = self.color[self.reversi.player][1]
if isinstance(self.players[self.reversi.player], Human):
self.table[i][j]["state"] = "normal"
else:
self.table[i][j]["state"] = "disable"
else:
self.table[i][j]["state"] = "disable"
if not self.reversi.player:
s1 = self.players[1].name + ":" + str(self.reversi.score[0])
s2 = self.players[2].name + ":" + str(self.reversi.score[1])
self.player["text"] = s1 + " - " + s2
n = 0
if self.reversi.score[0] < self.reversi.score[1]: n = 2
if self.reversi.score[0] > self.reversi.score[1]: n = 1
self.player["bg"] = self.color[n][0]
else:
self.player["text"] = self.players[self.reversi.player]
self.player["bg"] = self.color[self.reversi.player][0]
self.players[self.reversi.player].play(self.play)
class Player:
def __init__(self, reversi, name="player"):
self.name = name
self.reversi = reversi
def __str__(self):
return self.name
def __type__(self):
return "Player"
def send(self, x, y):
pass
def play(self, callback):
callback(8,8)
class Human(Player):
def __init__(self, reversi, name="Human"):
Player.__init__(self, reversi, name)
def play(self, callback):
self.callback = callback
#TODO:
class AI(Player):
def __init__(self, reversi, name="AI", depth=2):
Player.__init__(self, reversi, name)
self.depth = depth
def play(self, callback):
callback(8,8)
#TODO:
class Net(Player):
def __init__(self, reversi, name="Net", hostname=""):
Player.__init__(self, reversi, name)
self.hostname = hostname
def send(self, x, y):
self.socket.write("x:"+str(x)+" y:"+str(y))
def play(self, callback):
str = self.socket.read(32)
ix = str.find("x:")
iy = str.find("y:")
if ix == -1 or iy == -1: callback(8,8)
try:
x = int(str[ix+2:iy-1])
y = int(str[iy+2:])
except:
callback(8,8)
callback(x,y)
class Reversi:
def reset(self):
self.table = [[0 for j in range(8)] for i in range(8)]
self.table[3][3] = 1
self.table[4][4] = 1
self.table[3][4] = 2
self.table[4][3] = 2
self.player = 1
self.score = self.get_score()
self.playList = self.where_play()
def where_play(self):
l = []
if self.player == 0: return l
for x in range(8):
for y in range(8):
if self.play(x, y, 1):
l.append((x,y))
return l
def make_dir(self, x, y, dx, dy, test=0):
if (x+dx)<0 or (x+dx)>=8 or (y+dy)<0 or (y+dy)>=8:
return -1
if self.table[x+dx][y+dy] == 0:
return -1
if self.table[x+dx][y+dy] == self.player:
return 0
ret = self.make_dir(x+dx,y+dy,dx,dy, test)
if ret == -1:
return ret
if not test:
self.table[x+dx][y+dy] = self.player
return ret+1
def get_score(self):
s = [0,0,0]
for x in range(8):
for y in range(8):
s[self.table[x][y]] = s[self.table[x][y]] + 1
return s[1:]
def play(self, x, y, test=0):
ret = 0
if x<0 or x>=8 or y<0 or y>=8: return 0
if self.player == 0: return 0
if self.table[x][y] != 0: return 0
for dx in range(-1,2):
for dy in range(-1, 2):
if dx == 0 and dy == 0: continue
n = self.make_dir(x, y, dx, dy, test)
if n > 0: ret = 1
if ret and test==0:
self.table[x][y] = self.player
self.player = ((self.player)%2)+1
self.playList = self.where_play()
self.score = self.get_score()
if not self.playList:
self.player = ((self.player)%2)+1
self.playList = self.where_play()
if not self.playList:
self.player = 0
return ret
def __init__(self):
self.reset()
app = ReversiGUI()
app.mainloop()
Conclusion :
malheuresement, je ne l'ai pas terminé, mais y'as déjà des trucs qui fonctionnent.
me reste a faire l'ia, et le reseau. mais bon je pense pas que ce sera fait un jour ;) le python c pas mon language de predilection.
sinon j'ai la meme chose en C, avec IA, en utilisant SDL ou GTK ou la Console.
mais j'ai pas encore eu le temps de le mettre sur cppfrance.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.