Go

Programmation avancée de jeux en PureBasic
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Go

Message par hardy »

Tiens, j'ai fait pour Garzul un début de jeu de Go (Cf débutant)
Qui c'est qui veut faire jouer l'ordinateur? :lol: :lol:
J'offre le champagne à celui qui fait un truc qui batte un joueur débutant! (disons un mois de pratique, pour quantifier)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

faudrait déjà connaitre les règles du jeu :)
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Bon, globalement c'est simple, sauf pour évaluer qui a gagné à la fin.
Chaque joueur pose un pion tour à tour sur un point libre du plateau.
Si une partie des pions de l'adversaire, après le coup d'un joueur, est emprisonnée ie "entourée", sans degré de liberté (les diagonales ne comptent pas), alors tous les pions de cette partie sont éliminés.
Il y a priorité à la prise.

Ainsi, pour créer une zone imprenable, il faut qu'elle possède au moins deux yeux (trous)...

Enfin, quelqu'un aurait une règle de Go sous la main à reproduire ici?

C'est un jeu bien plus intelligent (et difficile) que les échecs.
Le nombre de coups possibles est tellement grand qu'il est inenvisageable à l'heure actuelle de faire un prog. qui joue en explorant l'"arbre des possibles" sur une certaine profondeur, contrairement aux échecs.
D'ailleurs, il n'existe aucun programme actuellement n'ayant qu'un niveau potable au GO.

Les grands maîtres de GO sont essentiellement asiatiques.
En France, on a eu le champion d'Europe, un mathématicien. (le nom m'échappe. Ca reviendra)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

en cherchant des algos sur l'IA des jeux , j'étais tombé sur un document , je crois une thèse ? sur les algos dans le jeu de go , j'ai tout juste compris l'introduction , j'ai vite passé mon chemin :)

C'est dommage pour une fois qu'un document intéressant était en français :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

http://ffg.jeudego.org/

il y a le coin des débutants pour apprendre , mais bon , c'est assez prise de tête :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

allez pour la culture

savez vous comment ont dit "echec et mat " en jeu de Go .......






reponse : " ATARI "
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Merci pour le lien.

Je vais regarder ça...
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Ouais, 15e Kyu pour les meilleurs programmes, c'est pas brillant.
C'est bien ce que je disais. (En plus, après le 1er Kyu, il y a les Dans...(comme au judo!))
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

http://www.ai.univ-paris8.fr/%7Ecazenave/habil.pdf

si avec ça tu n'arrives pas à nous pondre l'IA , on ne peut plus rien pour toi :)
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Ouais, m'a pas l'air fabuleux.
Cazenave, ça me dit quelque chose. Ai déjà du le croiser.
Comme la plupart de mes condisciples, je constate qu'il se croit absolument obligé de mettre une centaine de références dans la biblio. Ca fait bien, même si on n'a pas tout lu... :lol: :lol:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je viens d'y jeter un oeil , et si tu regardes bien son nom apparait dans les 37 premières références de la bibliographie , on peut penser qu'il a au moins lu celles ci :)
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

:lol: :lol: :lol: :lol: :lol: :lol: :lol:
Certes... (ce sont des articles de quelques pages publiés dans diverses revues)
Par ailleurs, je dis pas qu'il n'a pas tout lu ; j'en sais rien.
Mais en général...
Le système de recherche / promotion à la Fac, c'est pas rien !
Faut connaître.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Avant de faire un jeu de Go, vous pouvez déjà vous entraînez à faire ne seraît-ce que déjà le plateau avec la prise des pierres (c'est le nom des pièces à ce jeux)
Vous aurez déjà une petite idée de la complexité de la chose :)
Pas si facile ! (Un super exercice de programmation )
Si vous passez déjà ce cap alors l'avenir vous est ouvert!
Je rappelle qu'il y a 1 million de dollars à gagner pour un programme qui battra 3 fois de suite un grand maître :D

Je rappelle les règles d'une pure limpidité
Plateau 19*19 -(le Go ban)
On pose les pierres sur les intersections une à une chacun son tour
Une pierre ou un groupe de pierres est "tué" quand on suprime sa dernière "vie" (les petits traits horizontaux ou verticaux qui sont sous la pierre)
Une pierre noire entourée de 4 blanches par exemple
Evidemment il va y avoir quelques complications :)
Mais le but n'est pas de tuer des pierres mais de faire du territoire :)
C'est à dire d'entourer des intersections libres sans se faire prendre par l'adversaire !

Le meilleur jeu gratos pour s'entraîner est
IGoWIN en 9*9 (exactement les mêmes règles qu'en 19 *19 )

@Dobro Légère rectification :)
Atari, ce n'est pas "échec et mat" mais seulement "échec" ce qui veut dire que l'on prévient l'adversaire que la dernière pierre posée supprime l'avant dernière vie d'une pierre ou d'un groupe de pierres adverse :)
Celui-ci a donc le choix
- de prendre cette pierre agréssive si cela est possible
- de connecter une pierre pour augmenter son nombre de vie
- de négliger l'attaque et de jouer ailleurs
- de passer (Eh oui à ce jeux on a le droit de passer :)
(enfin dans cette situation ce n'est pas recommandé :roll:

Si vous aimez les mangas il y a une serie incroyable Hikaru No Go dont à été tiré une super serie animées en 78 épisodes!!!
Vous la trouverez ici :roll: ftp://ftp.hikago.flirble.org/pub/Hikaru/ (patientez 10 secondes)
Attention chaque épisode fait 175 mégas!
Mais sinon c'est le moyen le plus agréable de comprendre le jeu de Go!
Ses tournois, ses écoles, son esprit 8)
Et à la fin de chaques épisodes une charmante professeur bien réelle vous montre les bases!
Est beau ce qui plaît sans concept :)
Speedy Galerie
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Un petit truc tout simple que j'avais fait il ya a deux ans. (sans sprite)
Hormis sauver/charger, ça gère la prise des pions.
J'avais commencé à tester des trucs pour faire jouer l'ordinateur (pas dans ce code), mais j'y ai pas retouché depuis.
Peut-être que je m'y remettrai.

Code : Tout sélectionner

Dim etat.b(5000,20,20)
Dim vu.b(20,20)
Dim energie.f(21,21)
Dim onde.f(21,21,4)
Dim onde2.f(21,21,4)
Dim pris.b(20,20)
Dim comp.l(20,20)
Dim card.l(100,2)
Dim oeil.b(20,20)

Global n.b,joueur.b,etat,coup.l,total.l,vu,larg.l,niveau.l,gain.l,perte.l
Global energie,onde,onde2,pris,comp,card,oeil
joueur=-1:n=19:coup=1:total=1:niveau=50

font=LoadFont(0,"Times New Roman",14,#PB_Font_Bold|#PB_Font_Italic|#PB_Font_HighQuality)
For k=0 To 999
For i=0 To n
For j=0 To n
etat(k,i,j)=0
Next j:Next i:Next k

Procedure refresh()
StartDrawing(WindowOutput())
For i=0 To n*27+20
k.l=Round(110+145*i/(n*27+20),0)
FrontColor(k,0,k)
Line(0,i,larg,0)
Next i
FrontColor(255,255,255)
For i=0 To n-1
Line(13,33+27*i,27*n-26,0)
Line(13+27*i,33,0,27*n-26)
Next i
For i=0 To n-1:For j=0 To n-1
Select etat(coup-1,i+1,j+1)
Case 0
FrontColor(255,255,255)
Circle(13+27*i,33+27*j,3)
Case 1
For k=10 To 0 Step -1
Circle(13+27*i,33+27*j,k,RGB(20*k,20*k,20*k))
Next k
Case -1
For k=10 To 0 Step -1
Circle(13+27*i,33+27*j,k,RGB(20*k,0,0))
Next k
EndSelect
Next j:Next i
DrawingMode(1)
Locate(40,0)
DrawingFont(UseFont(0))
If joueur=-1:ins.s="1 (rouge)":Else:ins.s="2 (gris)":EndIf
titre.s="Joueur "+ins+"  Coup "+Str(coup)
DrawText(titre)
DrawingMode(0)
StopDrawing()
EndProcedure

Procedure supprime(x,y)
StartDrawing(WindowOutput())
For i=23+27*(y-1) To 43+27*(y-1)
k.l=Round(110+145*i/(n*27+20),0)
FrontColor(k,0,k)
Line(3+27*(x-1),i,20,0)
Next i
FrontColor(255,255,255)
a.l=23+27*(y-1):b.l=21
If y=1:a=33:b=11:EndIf
If y=n:b=10:EndIf
Line(13+27*(x-1),a,0,b)
a.l=3+27*(x-1):b.l=21
If x=1:a=13:b=11:EndIf
If x=n:b=10:EndIf
Line(a,33+27*(y-1),b,0)
Circle(13+27*(x-1),33+27*(y-1),3)
StopDrawing()
EndProcedure

Procedure nouveau(i.l,j.l)
StartDrawing(WindowOutput())
For p=0 To 21
k.l=Round(110+145*p/(n*27+20),0)
FrontColor(k,0,k)
Line(0,p,n*27,0)
Next p
Select etat(coup,i,j)
Case 1
For k=10 To 0 Step -1
Circle(13+27*(i-1),33+27*(j-1),k,RGB(20*k,20*k,20*k))
Next k
Case -1
For k=10 To 0 Step -1
Circle(13+27*(i-1),33+27*(j-1),k,RGB(20*k,0,0))
Next k
EndSelect
DrawingMode(1)
Locate(40,0)
DrawingFont(UseFont(0))
FrontColor(255,255,255)
If joueur=-1:ins.s="1 (rouge)":Else:ins.s="2 (gris)":EndIf
titre.s="Joueur "+ins+"  Coup "+Str(coup+1)
DrawText(titre)
DrawingMode(0)
StopDrawing()
EndProcedure


Procedure sauver()
file.s=SaveFileRequester("Sauver","partie.go","Fichiers Go|*.go",0)
pos.b=FindString(file,".",1)
If pos>0:file=Left(file,pos)+"go":Else:file=file+".go":EndIf
If Len(file)>3 And CreateFile(0,file)
WriteByte(n)
WriteLong(coup)
WriteLong(total)
WriteByte(joueur)
For i=1 To total
For j=1 To 20
For k=1 To 20
WriteByte(etat(i,j,k))
Next k:Next j:Next i
CloseFile(0)
EndIf
;refresh()
EndProcedure

Procedure ouvrir()
file.s=OpenFileRequester("Ouvrir","","Fichiers Go|*.go",0)
If file<>"" And OpenFile(0,file)
n=ReadByte()
coup=ReadLong()
total=ReadLong()
joueur=ReadByte()
For i=1 To total
For j=1 To 20
For k=1 To 20
etat(i,j,k)=ReadByte()
Next k:Next j:Next i
CloseFile(0)
larg=n*27:If larg<500:larg=500:EndIf
ResizeWindow(larg,40+27*n)
refresh()
EndIf
EndProcedure

Procedure precedent()
If coup>1
coup=coup-1:joueur=-joueur:refresh()
EndIf
EndProcedure

Procedure suivant()
If coup<total
coup=coup+1:joueur=-joueur:refresh()
EndIf
EndProcedure

Procedure bord(player,c)
For i=0 To 20
etat(c,0,i)=player:etat(c,n+1,i)=player
etat(c,i,0)=player:etat(c,i,n+1)=player
Next i
EndProcedure

Procedure voir(x,y)
If vu(x,y):ProcedureReturn 1:EndIf
If etat(coup,x,y)=0 :vu(x,y)=1:ProcedureReturn 0:EndIf
If etat(coup,x,y)=joueur:vu(x,y)=1:ProcedureReturn 1:EndIf
vu(x,y)=1
ProcedureReturn voir(x-1,y)*voir(x+1,y)*voir(x,y-1)*voir(x,y+1)
EndProcedure

Procedure elim(x,y)
For k=0 To 20:For p=0 To 20:vu(k,p)=0:Next p:Next k
If etat(coup,x,y)=joueur:ProcedureReturn 0:EndIf
bord(joueur,coup)
If voir(x,y)
For i=1 To 19:For j=1 To 19
If vu(i,j) And etat(coup,i,j)=-joueur:etat(coup,i,j)=0
supprime(i,j):EndIf
Next j:Next i
EndIf
EndProcedure

Procedure dimension()
debut:
taille.s=InputRequester("Taille","Choisir une taille entre 5 et 19","19")
i=Round(Val(taille),0)
If i<5 Or i>19:Goto debut:EndIf
n=i:joueur=-1:coup=1:total=1
For k=0 To 999
For i=0 To n
For j=0 To n
etat(k,i,j)=0
Next j:Next i:Next k
larg=n*27:If larg<500:larg=500:EndIf
ResizeWindow(larg,40+27*n)
refresh()
EndProcedure

Procedure opp(k)
Select k
Case 1
ProcedureReturn 3
Case 2
ProcedureReturn 4
Case 3
ProcedureReturn 1
Case 4
ProcedureReturn 2
EndSelect
EndProcedure

n=19

larg=n*27:If larg<500:larg=500:EndIf
win.l=OpenWindow(0,100,100,larg,n*27+40,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered |#PB_Window_SystemMenu|#PB_Window_TitleBar,"Jeu de Go")
CreateMenu(1,win)
MenuItem(3,"Rafraichir")
MenuItem(4,"Sauver")
MenuItem(5,"Ouvrir")
MenuItem(6,"Précédent")
MenuItem(7,"Suivant")
MenuItem(8,"Nouveau")
MenuItem(10,"Taille")
AddKeyboardShortcut(0,#PB_Shortcut_R,3)
AddKeyboardShortcut(0,#PB_Shortcut_S,4)
AddKeyboardShortcut(0,#PB_Shortcut_O,5)
AddKeyboardShortcut(0,#PB_Shortcut_P,6)
AddKeyboardShortcut(0,#PB_Shortcut_U,7)
AddKeyboardShortcut(0,#PB_Shortcut_N,8)
AddKeyboardShortcut(0,#PB_Shortcut_A,9)
AddKeyboardShortcut(0,#PB_Shortcut_T,10)
refresh()
Repeat
event=WaitWindowEvent()

Select event

Case 513
x=WindowMouseX():y=WindowMouseY()
i=1+Round(x/27,0):j=Round((y-20)/27,0)+1
If i<=n And j>0 And j<=n
If etat(coup-1,i,j)=0
For k=1 To n:For p=1 To n:etat(coup,k,p)=etat(coup-1,k,p):Next p:Next k
etat(coup,i,j)=joueur
elim(i-1,j):elim(i+1,j):elim(i,j-1):elim(i,j+1)
joueur=-joueur:nouveau(i,j)
elim(i,j):coup=coup+1:total=coup
EndIf
EndIf

Case #PB_Event_Repaint
refresh()

Case #PB_Event_Menu
Select EventMenuID()
Case 3
refresh()
Case 4
sauver():refresh()
Case 5
ouvrir()
Case 6
precedent()
Case 7
suivant()

Case 8
sauver()
For i=1 To 1000:For j=1 To 20:For k=1 To 20
etat(i,j,k)=0:Next k:Next j:Next i
joueur=-1:coup=1:refresh()

Case 10
If coup>1:sauver():EndIf
dimension()

EndSelect
EndSelect

Until event= #PB_EventCloseWindow
sauver()
End
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

super !! tres fort en si peu de ligne ! bravo mec ! :D
Répondre