Je me suis lancé dans la programmation d'un jeu de plateau du genre de "Pentamino" (où il faut placer des pièces de formes différentes sur un plateau de 10 sur 10).
Pour la partie AI du code, je vais utiliser un algo style Minimax => comme il va falloir tester un grand nombre de "coups" jouables, je vais devoir m'arranger pour que ça speede.
J'ai donc fait des petits tests préalables sur les différentes façons de stocker la forme des pièces et de placer ces pièces sur le plateau, avec dans l'idée que PeekB et PokeB seraient plus rapides que la manipulation de tableaux.
Or, ce n'est pas le cas.

- Pour aller relire la forme de la pièce jouée, PeekB est plus rapide qu'un tableau (jusque là, ça va).
- Par contre, pour "cocher" les cases du plateau occupées par la pièce, c'est plus rapide d'écrire dans un tableau que de faire du PokeB.

Pouvez-vous me confirmer ça en testant le petit code ci-dessous ? Merci d'avance !
(chez moi, c'est le test n°2, "Ecrire dans un tableau à partir de PeekB", qui est le plus rapide)
P.S.: Si c'est trop rapide ou trop long chez vous, faites varier la valeur de la constante #NBITERATIONS.
P.S. 2: N'oubliez pas de désactiver le debugger...

Code : Tout sélectionner
#TAILLEPLATEAU = 10
#NBITERATIONS = 10000000
; Définissons un plateau de jeu de 10 sur 10
; Grâce à un tableau:
Dim plateau.b(#TAILLEPLATEAU * #TAILLEPLATEAU)
; et dans un espace mémoire:
*plateau.b = AllocateMemory(#TAILLEPLATEAU * #TAILLEPLATEAU)
; soit un tableau pouvant recevoir 10 pièces de 5 cases maxi chacunes, avec chacune une coord X et une coord Y
taille.b=5
Dim casesPieces.b(10,taille,2)
; Pour le test, seule la pièce n°1 est décrite:
; X : Y
casesPieces(1,1,1) = 0 : casesPieces(1,1,2) = 0
casesPieces(1,2,1) = 0 : casesPieces(1,2,2) = 1
casesPieces(1,3,1) = 0 : casesPieces(1,3,2) = 2
casesPieces(1,4,1) = -1: casesPieces(1,4,2) = 1
casesPieces(1,5,1) = 1 : casesPieces(1,5,2) = 2
; Pour comparer, on va stocker les mêmes infos dans un espace mémoire
Dim *ptrCases.b(10)
*piecesPtr.b = AllocateMemory(10 * taille * 2) ; un seul espace mémoire pour toutes les pièces
*ptrCases(1) = *piecesPtr ; la pièce n°1 est au début de cet espace mémoire
; X : Y
PokeB(*ptrCases(1) , 0) : PokeB(*ptrCases(1) +1 , 0)
PokeB(*ptrCases(1) +2, 0) : PokeB(*ptrCases(1) +3 , 1)
PokeB(*ptrCases(1) +4, 0) : PokeB(*ptrCases(1) +5 , 2)
PokeB(*ptrCases(1) +6,-1) : PokeB(*ptrCases(1) +7 , 1)
PokeB(*ptrCases(1) +8, 1) : PokeB(*ptrCases(1) +9 , 2)
; On va poser la pièce n°1 à la case E5
piece.b = 1
x.b = 5: y.b = 5
; Tests A: Ecrire dans un tableau
; Test A1: à l'aide du tableau
t1 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
For i=1 To taille
plateau(x+casesPieces(piece,i,1) + (y+casesPieces(piece,i,2))*#TAILLEPLATEAU) = piece
Next i
Next k
t2 = ElapsedMilliseconds()
; Test A2: à l'aide de PeekB
t3 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
*tempptr = *ptrCases(piece)
For i=1 To taille
plateau(x+PeekB(*tempPtr) + (y+PeekB(*tempPtr+1))*#TAILLEPLATEAU) = piece
*tempPtr+2
Next i
Next k
t4 = ElapsedMilliseconds()
; Tests B: Ecrire dans un espace mémoire
; Test B1: à l'aide du tableau
t5 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
For i=1 To taille
PokeB(*plateau + x+casesPieces(piece,i,1) + (y+casesPieces(piece,i,2))*#TAILLEPLATEAU ,piece)
Next i
Next k
t6 = ElapsedMilliseconds()
; Test B2: à l'aide de PeekB
t7 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
*tempptr = *ptrCases(piece)
For i=1 To taille
PokeB(*plateau + x+PeekB(*tempPtr) + (y+PeekB(*tempPtr+1))*#TAILLEPLATEAU ,piece)
*tempPtr+2
Next i
Next k
t8 = ElapsedMilliseconds()
MessageRequester("Test tps exécution", "Ecriture dans un tableau" + Chr(10) + " - à partir d'un tableau: " + Str(t2 - t1) + Chr(10) + " - à partir de PeekB: " + Str(t4 - t3) + Chr(10) + Chr(10) + "Ecriture par PokeB" + Chr(10) + " - à partir d'un tableau: " + Str(t6 - t5) + Chr(10) + " - à partir de PeekB: " + Str(t8 - t7) )