SERPENT

SamuelCadieux Messages postés 31 Date d'inscription dimanche 8 septembre 2002 Statut Membre Dernière intervention 20 juin 2003 - 24 mai 2003 à 00:49
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 24 mai 2003 à 17:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/7207-serpent

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mai 2003 à 17:25
bon , accroches toi bien :

dans un nouveau projet, ajoutes : un timer et un module

colles ca dans le module :
Option Explicit

Public Type Coords
X As Single
Y As Single
End Type

Public Enum enum_Orientation
SO_HAUT = vbKeyUp
SO_BAS = vbKeyDown
SO_GAUCHE = vbKeyLeft
SO_DROITE = vbKeyRight
End Enum

Public Const KeyArrows = "&(%'" 'contient les caracteres de codes ascii les touches flechées

Public Type Serpent_Type
Pts(Taille_Max) As Coords
Longueur As Integer
Orientation As enum_Orientation
Vitesse As Single
End Type

'**********************************
'Parametrage

Public Const Taille_Min = 4
Public Const Taille_Max = 255
Public Const Debut_X = 25 'en cases
Public Const Debut_Y = 25 'en cases egalement

Public Const Plateau_W = 50 'nombre de cases
Public Const Plateau_H = 50 ' idem

Public Const Echelle 10 ' 10 pixels 1 case

Public Const Debut_Orientation = SO_DROITE
'**********************************

Public Serpent As Serpent_Type

'******************************************************************************************************

'et ca dans la form

Option Explicit

Dim Pomme As Coords

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'si on appuie sur une des touches de directions
If 0 <> InStr(1, KeyArrows, Chr$(KeyCode), vbTextCompare) Then
Serpent.Orientation = KeyCode 'onchange la direction du serpent
End If
End Sub

Private Sub Form_Load()
Me.KeyPreview = True
Me.AutoRedraw = True

Me.Width = Screen.TwipsPerPixelX * Echelle * Plateau_W
Me.Height = Screen.TwipsPerPixelY * Echelle * Plateau_H

Me.ScaleMode = vbPixels

Me.FillStyle = 0 'fond opaque

'on initialise le serpent
Serpent.Longueur = Taille_Min
Serpent.Orientation = Debut_Orientation

creerPomme
Timer1.Interval = 100

Dim a As Integer
For a = 0 To (Serpent.Longueur) + 1
With Serpent.Pts(a)
.X = Debut_X
.Y = Debut_Y
End With
Next a
End Sub

Sub creerPomme()
Randomize Timer 'place aléatoirement la pomme
Pomme.X = Int(1 + Plateau_W * Rnd)
Pomme.Y = Int(1 + Plateau_H * Rnd)
End Sub

Private Sub Timer1_Timer()
Dim a As Integer
Cls
Me.FillColor = &H8000&
For a = (Serpent.Longueur) + 1 To 0 Step -1
With Serpent.Pts(a)
If a <> (Serpent.Longueur) + 1 Then 'permet de ne pas afficher le bout de la queue du serpent
Me.Circle (.X * Echelle, .Y * Echelle), Echelle 2, &H8000&
End If
If a > 0 Then 'on ne decale pas la tete
.X = Serpent.Pts(a - 1).X 'decalage de tous les segments
.Y = Serpent.Pts(a - 1).Y
End If
End With
Next a

Me.FillColor = &H800000
Me.Circle (Pomme.X * Echelle, Pomme.Y * Echelle), Echelle 2, &H800000

With Serpent.Pts(0)
Select Case Serpent.Orientation 'on decale la tete
Case SO_DROITE: .X = .X + (Echelle * 0.1)
Case SO_GAUCHE: .X = .X - (Echelle * 0.1)
Case SO_BAS: .Y = .Y + (Echelle * 0.1)
Case SO_HAUT: .Y = .Y - (Echelle * 0.1)
End Select
If Int(.X) Pomme.X And Int(.Y) Pomme.Y Then 'si on mange la pomme......
creerPomme 'on en crée un autre
Serpent.Longueur = Serpent.Longueur + 1 'et on agrandit le serpent
End If
End With
End Sub


'***************************************************************************************************************

voila, c'est JUSTE UNE BASE !!!!!

je ne gère pas la collision, plusieurs pommes...... mais ca pose les base pour te permettre de t'amuser a programmer ca...
rclsilver02 Messages postés 130 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 10 février 2012
24 mai 2003 à 11:38
merci
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mai 2003 à 11:37
on va essayer de faire ca !
rclsilver02 Messages postés 130 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 10 février 2012
24 mai 2003 à 09:55
hum.... SamuelCadieux et Renfield, je pense que vous avez tout deux trouvé une solution, mais je ne vois pas comment faire ... ça serait possible que vous fassiez l'exemple dans ma sources ou alors, un petit exemple indépendant pour que je vois comment ça marche ?
Pour la catégorie API Renfield, je ne voulais pas la mettre dedans ... je n'ai tout simplement pas changer l'option car je n'ai pas fait attention :-)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mai 2003 à 05:34
oula !!

1 - je ne vois pas pourquoi tu as mis ca dans la catégorie 'API' !!


2 - utilises plutôt des constantes :
Case vbKeyUp 'Haut
If Deplacements <> 2 Then
If Deplacements = 0 Then

3 - Optimise ton test :

If a 0 Or a 25 Or a = 50 Or a = 75 Or ..... a = 275 Or a = 300 Or a = 325 Then
équivaut a...
if a mod 25 = 0 Then

4 - Ta structure est super étrange, et pour le coupe de la taille variable ...

essaye deja de faire un petit serpent, de 4 ou 5 cases, et qui se deplace !!
la, on ne fait que remplir la zone de bouts de serpents....

fait un truc du genre

private type Coords
X as single
Y as single
end type

dim Serpent() as Coords 'tableau dynamique, sans dimension !


dans le code , tu initialise ton serpent :

redim Serpent(4)

serpent(0).X = 20
serpent(0).Y = 20
............


quand tu dois te deplacer, tu decales en fait les cases :

for a= uBound( Serpent) to 1 step -1
Serpent ( a) = Serpent ( a-1)

et enfin, pour agrandir le serpent, la seule chose nécessaire, est d'agrandir le tableau :

redim preserve Serpent ( ubound ( serpent))


pour info, Ubound sert a renvoyer la taille d'un tableau, ici donc celle du serpent.
SamuelCadieux Messages postés 31 Date d'inscription dimanche 8 septembre 2002 Statut Membre Dernière intervention 20 juin 2003
24 mai 2003 à 00:49
pas mal mais.... tu devrai mettre une structure ds tes if...endif ça serai plus facile a lire.
Bien je te propose mon ami appeler variable ki dis sa grandeur par exemple

dim v_point as integer

et a chaque fois quil mange un point rouge:

v_point = v_point + 1

pour faire arreter les points car comme jai pu voir, ils sont a linfini.Tu pourrais faire une boucle while qui dis lorsque la longueur du serpent = a v_point etc...
Rejoignez-nous