Programmer le jeu "OTHELLO" en Visual Basic

Programmer le jeu "OTHELLO" en Visual Basic - VB/VBA/VBS - Programmation

Marsh Posté le 17-01-2007 à 18:12:09    

Bonsoir à tous,
 
 
Je dois programmer le jeu othello en utilisant le langage Visual Basic. Mon niveau n'est pas particulièrement exceptionnel mais je maîtrise plutôt bien les conditionnel et les boucles (For...next, do...while, loop...until).
 
J'ai déjà fait:
- Les déclarations de base.
- La gestion des tours de jeu (joueur 1 ou joueur 2).
- Recherche de case possible à jouer.
 
 
J'ai déjà cherché des exemples sur internet (cf: www.vbfrance.com) mais ces derniers étaient un peu trop élaboré et j'ai eu quelques problèmes de compréhension.
 
 
Je bloque un peu sur un élément essentiel de ce jeu: la gestion des pions à retourner (prenant la couleur adverse) après chaque tour.
Merci de m’apporter un peu d’aide :D
 
 
Voilà mon code:
(Pas de moqueries please ;)
 
 
LES DECLARATIONS:

Code :
  1. Option Explicit
  2. Const LargueurCote = 8
  3. 'Largueur des cotés de l'othellier
  4. TableauEtatCase(1 To LargueurCote, 1 To LargueurCote) As String
  5. 'Tableau non visible par l'utilisateur indiquant les cases vides et non vides ainsi que la couleur du pion présent
  6. Dim NumJoueur As Boolean
  7. 'Booléen gérant les joueurs(Faux = au tour du joueur 1)


 
TOUR DE JEU:

Code :
  1. Sub TourJoueur()
  2. 'Gestion des tours de jeu
  3. If NumJoueur = False Then
  4.     NumJoueur = True
  5.    
  6.     Else
  7.     NumJoueur = False
  8.    
  9. End If
  10. End Sub


 
INITIALISATION DE L'OTHELLIER:

Code :
  1. Private Sub Form_Load()
  2. 'Initialisation de l'othellier
  3. Dim i As Integer
  4. Dim j As Integer
  5. NumJoueur = False
  6. For i = 1 To LargueurCote
  7.     For j = 1 To LargueurCote
  8.         TableauEtatCase(i, j) = "vide"
  9.     Next j
  10. Next i
  11. TableauEtatCase(4, 5) = "noir"
  12. TableauEtatCase(5, 4) = "noir"
  13. TableauEtatCase(4, 4) = "blanc"
  14. TableauEtatCase(5, 5) = "blanc"
  15. End Sub


 
DEBUT DE LA PARTIE:

Code :
  1. Private Sub Command2_Click()
  2. 'Début du jeu
  3. Do
  4. abcisse = Input("Quelle est l'abcisse de la case à jouer ?", Saisie)
  5. ordonne = Input("Quelle est l'ordonnée de la case à jouer ?", Saisie)
  6. If ((abcisse >= 1) And (abcisse <= 8) And (ordonnee >= 1) And (ordonnee <= 8) And (TableauEtatCase(abcisse, ordonne) = "vide" ) And (adjacent(abcisse, ordonnee) = True)) Then
  7. '.....la suite prochainement
  8. End Sub


 
RECHERCHE D'UN PION ADVERSE ADJACENT:

Code :
  1. Function adjacent(i As Integer, j As Integer) As Boolean
  2. adjacent(i, j) = False
  3. 'Recherche d'un pion adjacent de couleur adverse
  4. 'Côté gauche
  5. If ((NumJoueur = False) And (i = 1) And (j > 1) And (j < 8)) And ((TableauEtatCase(i, j - 1) = "blanc" ) Or (TableauEtatCase(i, j + 1) = "blanc" ) Or (TableauEtatCase(i + 1, j) = "blanc" ) Or (TableauEtatCase(i + 1, j - 1) = "blanc" ) Or (TableauEtatCase(i + 1, j + 1) = "blanc" )) Then
  6.     adjacent(i, j) = True
  7.    
  8.     'Côté droit
  9.     ElseIf ((NumJoueur = False) And (i = 8) And (j > 1) And (j < 8)) And ((TableauEtatCase(i, j - 1) = "blanc" ) Or (TableauEtatCase(i, j + 1) = "blanc" ) Or (TableauEtatCase(i - 1, j) = "blanc" ) Or (TableauEtatCase(i - 1, j - 1) = "blanc" ) Or (TableauEtatCase(i - 1, j + 1) = "blanc" )) Then
  10.         adjacent(i, j) = True
  11.    
  12.     'Haut
  13.     ElseIf ((NumJoueur = False) And (j = 1) And (i > 1) And (i < 8)) And ((TableauEtatCase(i - 1, j) = "blanc" ) Or (TableauEtatCase(i + 1, j) = "blanc" ) Or (TableauEtatCase(i, j + 1) = "blanc" ) Or (TableauEtatCase(i - 1, j + 1) = "blanc" ) Or (TableauEtatCase(i + 1, j + 1) = "blanc" )) Then
  14.         adjacent(i, j) = True
  15.    
  16.     'Bas
  17.     ElseIf ((NumJoueur = False) And (j = 8) And (i > 1) And (i < 8)) And ((TableauEtatCase(i - 1, j) = "blanc" ) Or (TableauEtatCase(i + 1, j) = "blanc" ) Or (TableauEtatCase(i, j - 1) = "blanc" ) Or (TableauEtatCase(i - 1, j - 1) = "blanc" ) Or (TableauEtatCase(i + 1, j - 1) = "blanc" )) Then
  18.         adjacent(i, j) = True
  19.    
  20.     'Coin haut gauche
  21.     ElseIf ((NumJoueur = False) And (i = 1) And (j = 1)) And ((TableauEtatCase(2, 1) = "blanc" ) Or (TableauEtatCase(1, 2) = "blanc" ) Or (TableauEtatCase(2, 2) = "blanc" )) Then
  22.         adjacent(i, j) = True
  23.        
  24.     'Coin haut droit
  25.     ElseIf ((NumJoueur = False) And (i = 8) And (j = 1)) And ((TableauEtatCase(7, 1) = "blanc" ) Or (TableauEtatCase(8, 2) = "blanc" ) Or (TableauEtatCase(7, 2) = "blanc" )) Then
  26.         adjacent(i, j) = True
  27.        
  28.     'Coin bas gauche
  29.     ElseIf ((NumJoueur = False) And (i = 1) And (j = 8)) And ((TableauEtatCase(1, 7) = "blanc" ) Or (TableauEtatCase(2, 8) = "blanc" ) Or (TableauEtatCase(2, 7) = "blanc" )) Then
  30.         adjacent(i, j) = True
  31.    
  32.     'Coin bas droit
  33.     ElseIf ((NumJoueur = False) And (i = 8) And (j = 8)) And ((TableauEtatCase(8, 7) = "blanc" ) Or (TableauEtatCase(7, 8) = "blanc" ) Or (TableauEtatCase(7, 7) = "blanc" )) Then
  34.         adjacent(i, j) = True
  35.    
  36.     'Reste de l'othellier
  37.     ElseIf ((NumJoueur = False) And (i > 1) And (i < 8) And (j > 1) And (j < 8)) And ((TableauEtatCase(i - 1, j) = "blanc" ) Or (TableauEtatCase(i + 1, j) = "blanc" ) Or (TableauEtatCase(i, j - 1) = "blanc" ) Or (TableauEtatCase(i, j + 1) = "blanc" ) Or (TableauEtatCase(i - 1, j - 1) = "blanc" ) Or (TableauEtatCase(i + 1, j - 1) = "blanc" ) Or (TableauEtatCase(i - 1, j + 1) = "blanc" ) Or (TableauEtatCase(i + 1, j + 1) = "blanc" )) Then
  38.         adjacent(i, j) = True
  39.        
  40. End If
  41. 'Côté gauche
  42. If ((NumJoueur = True) And (i = 1) And (j > 1) And (j < 8)) And ((TableauEtatCase(i, j - 1) = "noir" ) Or (TableauEtatCase(i, j + 1) = "blanc" ) Or (TableauEtatCase(i + 1, j) = "noir" ) Or (TableauEtatCase(i + 1, j - 1) = "noir" ) Or (TableauEtatCase(i + 1, j + 1) = "noir" )) Then
  43.     adjacent(i, j) = True
  44.    
  45.     'Côté droit
  46.     ElseIf ((NumJoueur = True) And (i = 8) And (j > 1) And (j < 8)) And ((TableauEtatCase(i, j - 1) = "noir" ) Or (TableauEtatCase(i, j + 1) = "noir" ) Or (TableauEtatCase(i - 1, j) = "noir" ) Or (TableauEtatCase(i - 1, j - 1) = "noir" ) Or (TableauEtatCase(i - 1, j + 1) = "noir" )) Then
  47.         adjacent(i, j) = True
  48.    
  49.     'Haut
  50.     ElseIf ((NumJoueur = True) And (j = 1) And (i > 1) And (i < 8)) And ((TableauEtatCase(i - 1, j) = "noir" ) Or (TableauEtatCase(i + 1, j) = "noir" ) Or (TableauEtatCase(i, j + 1) = "noir" ) Or (TableauEtatCase(i - 1, j + 1) = "noir" ) Or (TableauEtatCase(i + 1, j + 1) = "noir" )) Then
  51.         adjacent(i, j) = True
  52.    
  53.     'Bas
  54.     ElseIf ((NumJoueur = True) And (j = 8) And (i > 1) And (i < 8)) And ((TableauEtatCase(i - 1, j) = "noir" ) Or (TableauEtatCase(i + 1, j) = "noir" ) Or (TableauEtatCase(i, j - 1) = "noir" ) Or (TableauEtatCase(i - 1, j - 1) = "noir" ) Or (TableauEtatCase(i + 1, j - 1) = "noir" )) Then
  55.         adjacent(i, j) = True
  56.    
  57.     'Coin haut gauche
  58.     ElseIf ((NumJoueur = True) And (i = 1) And (j = 1)) And ((TableauEtatCase(2, 1) = "noir" ) Or (TableauEtatCase(1, 2) = "noir" ) Or (TableauEtatCase(2, 2) = "noir" )) Then
  59.         adjacent(i, j) = True
  60.        
  61.     'Coin haut droit
  62.     ElseIf ((NumJoueur = True) And (i = 8) And (j = 1)) And ((TableauEtatCase(7, 1) = "noir" ) Or (TableauEtatCase(8, 2) = "noir" ) Or (TableauEtatCase(7, 2) = "noir" )) Then
  63.         adjacent(i, j) = True
  64.        
  65.     'Coin bas gauche
  66.     ElseIf ((NumJoueur = True) And (i = 1) And (j = 8)) And ((TableauEtatCase(1, 7) = "noir" ) Or (TableauEtatCase(2, 8) = "noir" ) Or (TableauEtatCase(2, 7) = "noir" )) Then
  67.         adjacent(i, j) = True
  68.    
  69.     'Coin bas droit
  70.     ElseIf ((NumJoueur = True) And (i = 8) And (j = 8)) And ((TableauEtatCase(8, 7) = "noir" ) Or (TableauEtatCase(7, 8) = "noir" ) Or (TableauEtatCase(7, 7) = "noir" )) Then
  71.         adjacent(i, j) = True
  72.    
  73.    
  74.     'Reste de l'othellier
  75.     ElseIf ((NumJoueur = True) And (i > 1) And (i < 8) And (j > 1) And (j < 8)) And ((TableauEtatCase(i - 1, j) = "noir" ) Or (TableauEtatCase(i + 1, j) = "noir" ) Or (TableauEtatCase(i, j - 1) = "noir" ) Or (TableauEtatCase(i, j + 1) = "noir" ) Or (TableauEtatCase(i - 1, j - 1) = "noir" ) Or (TableauEtatCase(i + 1, j - 1) = "noir" ) Or (TableauEtatCase(i - 1, j + 1) = "noir" ) Or (TableauEtatCase(i + 1, j + 1) = "noir" )) Then
  76.         adjacent(i, j) = True
  77.        
  78. End If
  79. End Function


Message édité par mauriiiiiice le 17-01-2007 à 18:15:46
Reply

Marsh Posté le 17-01-2007 à 18:12:09   

Reply

Marsh Posté le 17-01-2007 à 18:15:45    

Mon dieu ca commence bien  [:red faction]  
 
 
la derniere fois que jai vu ce genre de code cetait .... aussi en vb! (decidement vb = debutant de lextreme??)

Reply

Marsh Posté le 17-01-2007 à 18:17:33    

Citation :

Mon dieu ca commence bien


Mon code est si naze que ça ?
 
:(

Reply

Marsh Posté le 17-01-2007 à 18:49:24    

est ce que ta vu la longeur du truc juste pour obtenir le pion adjacent!???
 
timagine la longeur de ton prog si tu devait y rajouter une IA?
 
code long =
   -relecture difficile
   -apparation de bug  
   -difficulte a maintenir le code, rajouter des "features"
   -en general plus lent
   -... bref c jamais bien
   
 
puis bon des strings pour comparer le type des  pieces , c pas genial
d'un autre cote si tu debute c normal , mais il vaudrait mieux corriger tout ca alors avant de faire la suite....
 
tu programmes depuis longtemps?


Message édité par red faction le 17-01-2007 à 18:49:35
Reply

Marsh Posté le 17-01-2007 à 20:10:52    

:hello:  
 
Le code n'est pas si long que ça. Il est propre. Il est commenté. C'est très bien.
 
Mais, il existe des astuces pour écrire quelque chose de plus simple :
 
- Transformer le plateau de jeu en 2D en un plateau de jeu en une seule dimension. Comme cela, il ne faut gérer qu'un seul indice au lieu d'en gérer deux (i et j).
 
- Avoir une rangée de cases "plouf dans l'eau" tout autour de l'othellier. Comme cela, au lieu de tester si on a atteint le bord, on teste si la case est une case "plouf", ce qui est plus facile.
 
Bon courage.

Reply

Marsh Posté le 17-01-2007 à 20:54:03    

Citation :

timagine la longeur de ton prog si tu devait y rajouter une IA?


Si tu as une meilleure solution pour programmer un Othello en Visual Basic, je suis preneur  :)  
 
 

Citation :

- Transformer le plateau de jeu en 2D en un plateau de jeu en une seule dimension. Comme cela, il ne faut gérer qu'un seul indice au lieu d'en gérer deux (i et j).


Avec des Text(i).Text, j'y avais pensé mais cela m'aurait poser un problème d'affichage pour les pions de couleur...
 
 

Citation :

Bon courage.


Merci.

Reply

Marsh Posté le 17-01-2007 à 22:48:14    

olivthill a écrit :

:hello:  
 
Le code n'est pas si long que ça. Il est propre. Il est commenté. C'est très bien.
 
Mais, il existe des astuces pour écrire quelque chose de plus simple :
 
- Transformer le plateau de jeu en 2D en un plateau de jeu en une seule dimension. Comme cela, il ne faut gérer qu'un seul indice au lieu d'en gérer deux (i et j).
 
- Avoir une rangée de cases "plouf dans l'eau" tout autour de l'othellier. Comme cela, au lieu de tester si on a atteint le bord, on teste si la case est une case "plouf", ce qui est plus facile.
 
Bon courage.


 
-meme si tranformer le tableau en une dimension apporte des avantages, pour certaines operation ca devient plus complique, pour le moment laisse comme ca
-faire un tableau plus grand  pour ne pas tester les bord nest pas une mauvaise idée , mais il y a moyen de faire plus simple:
 il suffit de faire une fonction  
 
   getCase (dim i as, dim j as){
      if(i< & j ....
         getCase= valeur;
     else  
         getCase= -1 //ou constante PION_INVALIDE
   }
apres au lieu de faire des tableau[i][j] tu fait directement appel a getCase , deplus si limplementation de ton tableau change ca reste toujours valable (il suffit de changer la fonction getcase et non tout le programme)
 
 

mauriiiiiice a écrit :

Citation :

timagine la longeur de ton prog si tu devait y rajouter une IA?


Si tu as une meilleure solution pour programmer un Othello en Visual Basic, je suis preneur  :)  
 


 
 
 
-sortir les if(NumJoueur = False) des if, virer les test i,j  
 
- changer les ="blanc" par une constante BLANC (string "blanc" = gaspillage de memoire, deplus tu peut te tromper "blamc" compilera qd mm, et pour finir c plus lent )


Message édité par red faction le 17-01-2007 à 22:49:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed