Tom's Guide > Forum > Programmation > Programmer le jeu "OTHELLO" en Visual Basic

Programmer le jeu "OTHELLO" en Visual Basic

Forum Programmation : Programmer le jeu "OTHELLO" en Visual Basic

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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 mauriiiice le 17-01-2007 à 18:34:58
------------------------------ "Celui qui se transforme en bête se délivre de la douleur d'être un homme"
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Citation :


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


J'ai pas lu le code, j'ai jamais joué à Othello et je ne sais pas faire de VB, mais:
pour la gestion des pions à retourner, tu peux faire une fonction/méthode/je sais pas... qui est appellée à la fin d'un tour, et qui parcourt toutes les cases en effectuant une série de tests pour chacune d'entre elles? Ou alors, des tests uniquement sur les cases récemment modifiées?
Ou alors c'est pas ce que tu demandes...

Répondre à Rakipu

je vois pas trop ou tu bloques, par contre tu peux simplifier ton code:

Code :
  1. Sub TourJoueur()
  2.   'Gestion des tours de jeu
  3.   NumJoueur = not NumJoueur
  4. End Sub


pour la fonction adjacent, ca serait plus lisible si tu regroupais les conditions du genre, un

Code :
  1. IF not NumJoueur THEN
  2. ...
  3. END IF


pour toutes les conditions comportant un if numjoueur = false ...
ca sera plus facile de t'aider :)

Répondre à coca25

pour la gestion des pions a retourner, il faut juste dérouler un algo dans ce genre la :
- parcourir les 8 direction autour du pion placé.
- vérifier si la couleur est différente du pion placé.
si oui, continuer dans la meme direction, si on trouve un pion d'une couleur différente avant la fin de tablea.
si oui, changer les couleur.

en gros (en pseudo java) :

Code :
  1. // direction gauche
  2. // x, y les coord du pion placé
  3. // tab ton tableau
  4. if (tab[x-1][y].pion.exist && tab[x-1][y].pion.color != pionCourant.color)
  5. {
  6.   int i = x-1;
  7.   for ( ; i < 0 && tab[x-i][y].pion.exist && tab[x-i][y].pion.color != pionCourant.color; i--)
  8.   {
  9.     // ne rien faire
  10.     ;
  11.   }
  12.   if (if i >= 0 && tab[x-i].pion.color == pionCourant.color)
  13.     // reboucle en changeant la couleur des pions
  14. }



bon, c'est l'algo naif non optimiser.
mais ça devrait te permettre de débloquer.

------------------------------ Don't panic!
mouths91 à dit : "[...]des rageux comme kelnem"
Répondre à Vinz42

Citation :

pour la gestion des pions a retourner, il faut juste dérouler un algo dans ce genre la :
- parcourir les 8 direction autour du pion placé.



Merci de ta réponse.

Alors je me suis creusé la tête et j'ai créé une série de boucles qui parcoure chaque direction:

Code :
  1. Sub RecherchePionNoir(i2 As Integer, j2 As Integer)
  2. 'i2 et j2 représente les coordonnées du pion posé
  3. Dim i As Integer
  4. Dim j As Integer
  5. 'Recherche en haut
  6. i = i2
  7. j = j2
  8. Do While ((TableauEtatCase(i, j - 1) = "blanc" ) And (TableauEtatCase(i, j - 1) <> "noir" ) Or (TableauEtatCase(i, j - 1) <> "vide" ))
  9. j = j - 1
  10. Loop
  11. If (TableauEtatCase(i, j - 1) = "noir" ) Then
  12.     Call Retournement(i2, (j2 - 1), i, j)
  13. End If
  14. 'Recherche haut droit
  15. i = i2
  16. j = j2
  17. Do While ((TableauEtatCase(i + 1, j - 1) = "blanc" ) And (TableauEtatCase(i + 1, j - 1) <> "vide" ))
  18. i = i + 1
  19. j = j - 1
  20. Loop
  21. If (TableauEtatCase(i + 1, j - 1) = "noir" ) Then
  22.     Call Retournement((i2 + 1), (j2 - 1), i, j)
  23. End If
  24. 'Recherche à droite
  25. i = i2
  26. j = j2
  27. Do While ((TableauEtatCase(i + 1, j) = "blanc" ) And (TableauEtatCase(i + 1, j) <> "vide" ))
  28. i = i + 1
  29. Loop
  30. If (TableauEtatCase(i + 1, j) = "noir" ) Then
  31.     Call Retournement((i2 + 1), j2, i, j)
  32. End If
  33. 'Recherche bas droit
  34. i = i2
  35. j = j2
  36. Do While ((TableauEtatCase(i + 1, j + 1) = "blanc" ) And (TableauEtatCase(i + 1, j + 1) <> "vide" ))
  37. i = i + 1
  38. j = j + 1
  39. Loop
  40. If (TableauEtatCase(i + 1, j + 1) = "noir" ) Then
  41.     Call Retournement((i2 + 1), (j2 + 1), i, j)
  42. End If
  43. 'Recherche bas
  44. i = i2
  45. j = j2
  46. Do While ((TableauEtatCase(i, j + 1) = "blanc" ) And (TableauEtatCase(i, j + 1) <> "vide" ))
  47. j = j + 1
  48. Loop
  49. If (TableauEtatCase(i, j + 1) = "noir" ) Then
  50.     Call Retournement(i2, (j2 + 1), i, j)
  51. End If
  52. 'Recherche bas gauche
  53. i = i2
  54. j = j2
  55. Do While ((TableauEtatCase(i - 1, j + 1) = "blanc" ) And (TableauEtatCase(i - 1, j + 1) <> "vide" ))
  56. i = i - 1
  57. j = j + 1
  58. Loop
  59. If (TableauEtatCase(i - 1, j + 1) = "noir" ) Then
  60.     Call Retournement((i2 - 1), (j2 + 1), i, j)
  61. End If
  62. 'Recherche à gauche
  63. i = i2
  64. j = j2
  65. Do While ((TableauEtatCase(i - 1, j) = "blanc" ) And (TableauEtatCase(i - 1, j) <> "vide" ))
  66. i = i - 1
  67. Loop
  68. If (TableauEtatCase(i - 1, j) = "noir" ) Then
  69.     Call Retournement((i2 - 1), j2, i, j)
  70. End If
  71. 'Recherche haut gauche
  72. i = i2
  73. j = j2
  74. Do While ((TableauEtatCase(i - 1, j - 1) = "blanc" ) And (TableauEtatCase(i - 1, j - 1) <> "vide" ))
  75. i = i - 1
  76. j = j - 1
  77. Loop
  78. If (TableauEtatCase(i - 1, j - 1) = "noir" ) Then
  79.     Call Retournement((i2 - 1), (j2 - 1), i, j)
  80. End If
  81. End Sub



Code :
  1. Sub Retournement(a As Integer, b As Integer, c As Integer, d As Integer)
  2. 'Procédure retournant les pions gagnés par l'adversaire
  3. Dim i As Integer
  4. Dim j As Integer
  5. For i = a To c
  6.     For j = b To d
  7.    
  8.         If (TableauEtatCase(i, j) = "blanc" ) Then
  9.                 TableauEtatCase(i, j) = "noir"
  10.                
  11.             ElseIf (TableauEtatCase(i, j) = "noir" ) Then
  12.                 TableauEtatCase(i, j) = "blanc"
  13.         End If
  14.        
  15.     Next j
  16. Next i
  17.        
  18. End Sub

------------------------------ "Celui qui se transforme en bête se délivre de la douleur d'être un homme"
Répondre à mauriiiice
Tom's Guide > Forum > Programmation > Programmer le jeu "OTHELLO" en Visual Basic
Aller à :

Il y a 1131 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens