Accueil

Borne Arcade

Jeux



Liens



Programmation

Linux

Mosaïque


Galaxian.xls
Othello
Mandel



Présentation du programme :

Si vous avez suivi les excellents cours ici et la, vous voyez que l'on peut faire avec Excel autre chose que =A1*365

Je vous passe les projets Excel "geek" qui n'intéresse que moi pour vous parler d'un projet amusant qui consiste à créer un jeu d'othello.



Version VBA Excel :

Pilotage de l'écran graphique

Le gros souci est de savoir comment piloter notre écran graphique en VBA. Pour afficher une image, on pourrait utiliser des composants exotiques, mais l'idée est de faire du code complètement standard. On utilise donc une énorme astuce 'gros bourrin' :

On définit une image sur la feuille comme suit :



Parallelement, On définit dans le code un tableau comme suit :
Public Const BVmaxC As Integer = 640
Public Const BVmaxL As Integer = 480
Public BVmatrix(BVmaxC - 1, BVmaxL - 1) As Long

Ce tableau contient la couleur de tous les pixels de l'image (au format 65536 * R + 256 * V + B). Par exemple, on ajoute un pixel bleu en position 100, 50 avec le code suivant :
BVmatrix(99, 49) = 255

Au moment où on souhaite rafraichir l'image définie dans le tableau, on crée un fichier temporaire sur le disque dur. Ce fichier contient toutes les données d'une image BMP 24 bits. Ensuite, il suffit de lier ce fichier à l'image avec la fonction LoadPicture . La fonction tourne en quelques secondes. Elle n'est donc pas satisfaisante pour faire un jeu d'arcade, mais suffisante pour afficher le résultat d'un calcul.

Voici ma fonction de rafraichissement :
Public Sub Brefresh(NomFeuille As String)
Dim SEntete As String * 54
Dim TabEntete(54) As Integer
Dim TailleC As Long
Dim TailleL As Long
Dim t As Integer
Dim t1 As Integer
Dim t2 As Integer
Dim Txt As String

' BVfilename contient le nom du fichier temporaire
Open BVfilename For Binary Access Write As #1

TailleC = BVmaxC
TailleL = BVmaxL

'écriture de l'entête d'une image BMP
For t = 1 To 54
TabEntete(t) = 0
Next t
TabEntete(1) = 66
TabEntete(2) = 77
TabEntete(3) = ((TailleC * TailleL * 3) + 54) Mod 256
TabEntete(4) = Int(((TailleC * TailleL * 3) + 54) / 256) Mod 256
TabEntete(5) = Int(((TailleC * TailleL * 3) + 54) / 65536) Mod 256
TabEntete(11) = 54
TabEntete(15) = 40
TabEntete(19) = TailleC Mod 256
TabEntete(20) = Int(TailleC / 256) Mod 256
TabEntete(23) = TailleL Mod 256
TabEntete(24) = Int(TailleL / 256) Mod 256
TabEntete(27) = 1
TabEntete(29) = 24
TabEntete(35) = (TailleC * TailleL * 3) Mod 256
TabEntete(36) = Int(TailleC * TailleL * 3 / 256) Mod 256
TabEntete(37) = Int(TailleC * TailleL * 3 / 65536) Mod 256
TabEntete(39) = 196
TabEntete(40) = 14
TabEntete(43) = 196
TabEntete(44) = 14

Txt = ""
For t = 1 To 54
Txt = Txt & Chr(TabEntete(t))
Next t

' écriture des pixels de l'image
For t1 = BVmaxL - 1 To 0 Step -1
For t2 = 0 To BVmaxC - 1

Txt = Txt & Chr(BVmatrix(t2, t1) Mod 256)
Txt = Txt & Chr(Int(BVmatrix(t2, t1) / 256) Mod 256)
Txt = Txt & Chr(Int(BVmatrix(t2, t1) / 65536) Mod 256)

If Len(Txt) › 240 Then
Put #1, , Txt
Txt = ""
End If
Next t2
For t2 = 1 To BVmaxC Mod 4
Txt = Txt & Chr(0)
Next t2
Next t1

If Trim(Txt) ‹› "" Then
Put #1, , Txt
End If

Close #1

' rafraichissement de l'image Excel
Worksheets(NomFeuille).Board.Picture = LoadPicture(BVfilename)
Worksheets(NomFeuille).Board.Visible = False
Worksheets(NomFeuille).Board.Visible = True


End Sub

Voici le fichier généré sur le disque



Et voici l'image rafraichie :



Présentation du jeu

Maintenant que nous avons notre écran graphique, nous pouvons programmer le cœur du jeu (on définit notamment un algorithme récursif de type alpha/beta pour l'interface IA).

Voici le jeu VBA terminé :



Version Java :

Conversion du code

La seule fonction réécrite intégralement est notre fameuse fonction Brefresh (En java, on code directement dans paint( Graphics g ) )

Pour le reste, on ne va surtout pas réinventer la roue. Comme le code VBA est standard, on fait du 1 pour 1. Le résultat n'est pas très 'objet', mais tant pis. Le principal, c'est que ça fonctionne.

Voici un extrait de la conversion :
'Defini le tableau des pions pris
Public Sub ConfigPionPris(ByVal c As Integer, ByVal l As Integer, ByVal Jcourant As Byte)

Dim Tmpc As Integer
Dim Tmpl As Integer
Dim t As Integer
Dim t1 As Integer
Dim nbpion As Integer
Dim Jadv As Byte

For Tmpc = 0 To 9
For Tmpl = 0 To 9
TabPionPris(Tmpc, Tmpl) = CarBlanc
Next Tmpl
Next Tmpc

If Jcourant = CarO Then
Jadv = CarX
Else
Jadv = CarO
End If

For t = 1 To 8
Tmpc = c + TabDX(t)
Tmpl = l + TabDY(t)
nbpion = 0

While BoardInput(Tmpc, Tmpl) = Jadv
Tmpc = Tmpc + TabDX(t)
Tmpl = Tmpl + TabDY(t)
nbpion = nbpion + 1
Wend

If nbpion › 0 And BoardInput(Tmpc, Tmpl) = Jcourant Then
Tmpc = c + TabDX(t)
Tmpl = l + TabDY(t)
For t1 = 1 To nbpion
TabPionPris(Tmpc, Tmpl) = Jcourant
Tmpc = Tmpc + TabDX(t)
Tmpl = Tmpl + TabDY(t)
Next t1
End If
Next t

End Sub
// Defini le tableau des pions pris
public void ConfigPionPris(int c, int l, char Jcourant)
{
int Tmpc;
int Tmpl;
int cpt;
int cpt1;
int nbpion;
char Jadv;

for(Tmpc = 0; Tmpc ‹= 9; Tmpc++) {
for(Tmpl = 0; Tmpl ‹= 9; Tmpl++) {
TabPionPris[Tmpc][Tmpl] = CarBlanc;
}
}

if (Jcourant == CarO) {
Jadv = CarX;
} else {
Jadv = CarO;
}

for(cpt = 1; cpt ‹= 8; cpt++) {
Tmpc = c + TabDX[cpt];
Tmpl = l + TabDY[cpt];
nbpion = 0;

while (BoardInput(Tmpc,Tmpl) == Jadv) {
Tmpc = Tmpc + TabDX[cpt];
Tmpl = Tmpl + TabDY[cpt];
nbpion++;
}

if ((nbpion › 0) && (BoardInput(Tmpc,Tmpl) == Jcourant)) {
Tmpc = c + TabDX[cpt];
Tmpl = l + TabDY[cpt];
for(cpt1 = 1; cpt1 ‹= nbpion; cpt1++) {
TabPionPris[Tmpc][Tmpl] = Jcourant;
Tmpc = Tmpc + TabDX[cpt];
Tmpl = Tmpl + TabDY[cpt];
}
}
}
}


Compilation et exécution :

Voici donc la version java de l'othello sous Eclipse :



A bientôt

Bou 1


plan du site
Généré le 16 déc 2011 par Bou1