Small Basic: Exemple - Snake - Le Jeu du Serpent (fr-FR)
Voici un exemple de jeu 'Snake' ou 'Jeu du Serpent'.
Importez le code dans Small Basic : HDC228.
Code
Initialize()
While (GameState <> "")
DoGameLoop()
EndWhile
Program.End()
Sub Initialize
InitializeVariables()
InitializeScreen()
EndSub
Sub InitializeVariables
Array.SetValue("DeltaX","North",0)
Array.SetValue("DeltaX","East",1)
Array.SetValue("DeltaX","South",0)
Array.SetValue("DeltaX","West",-1)
Array.SetValue("DeltaY","North",-1)
Array.SetValue("DeltaY","East",0)
Array.SetValue("DeltaY","South",1)
Array.SetValue("DeltaY","West",0)
Array.SetValue("NorthFlag","North",1)
Array.SetValue("NorthFlag","East",0)
Array.SetValue("NorthFlag","South",0)
Array.SetValue("NorthFlag","West",0)
Array.SetValue("SouthFlag","North",0)
Array.SetValue("SouthFlag","East",0)
Array.SetValue("SouthFlag","South",1)
Array.SetValue("SouthFlag","West",0)
Array.SetValue("EastFlag","North",0)
Array.SetValue("EastFlag","East",1)
Array.SetValue("EastFlag","South",0)
Array.SetValue("EastFlag","West",0)
Array.SetValue("WestFlag","North",0)
Array.SetValue("WestFlag","East",0)
Array.SetValue("WestFlag","South",0)
Array.SetValue("WestFlag","West",1)
Array.SetValue("DirectionInput","N","North")
Array.SetValue("DirectionInput","E","East")
Array.SetValue("DirectionInput","S","South")
Array.SetValue("DirectionInput","W","West")
GameDelay = 100
Score = 0
HighScore = 0
GameState = "TitleScreen"
ScreenDirty = 1
CurrentDirectory = Text.GetSubText(File.GetSettingsFilePath(),0,Text.GetLength(File.GetSettingsFilePath())-26)
EndSub
Sub InitializeScreen
GraphicsWindow.Show()
GraphicsWindow.Width = 640
GraphicsWindow.Height = 480
GraphicsWindow.KeyDown = HandleKeyPress
EndSub
Sub HandleTitleScreenKeyPress
Key = GraphicsWindow.LastKey
If (Key = "Escape") Then
GameState=""
Else
If (Key="F2") Then
GameState = "Play"
ScreenDirty = 1
Else
If (Key="F1") Then
GameState = "Instructions"
ScreenDirty = 1
EndIf
EndIf
EndIf
EndSub
Sub HandleInstructionsKeyPress
Key = GraphicsWindow.LastKey
If (Key = "Escape") Then
GameState = "TitleScreen"
ScreenDirty = 1
EndIf
EndSub
Sub HandlePlayKeyPress
Key = GraphicsWindow.LastKey
If (Key = "Left") Then
DirectionInput = DirectionInput + "W"
Else
If (Key = "Right") Then
DirectionInput = DirectionInput + "E"
Else
If (Key = "Up") Then
DirectionInput = DirectionInput + "N"
Else
If (Key = "Down") Then
DirectionInput = DirectionInput + "S"
EndIf
EndIf
EndIf
EndIf
EndSub
Sub HandleGameOverKeyPress
Key = GraphicsWindow.LastKey
If (Key = "Escape") Then
GameState=""
Else
If (Key="F2") Then
GameState = "Play"
ScreenDirty = 1
Else
If (Key="F1") Then
GameState = "Instructions"
ScreenDirty = 1
EndIf
EndIf
EndIf
EndSub
Sub HandleKeyPress
If (GameState="TitleScreen") Then
HandleTitleScreenKeyPress()
Else
If (GameState="Instructions") Then
HandleInstructionsKeyPress()
Else
If (GameState="Play") Then
HandlePlayKeyPress()
Else
If (GameState="GameOver") Then
HandleGameOverKeyPress()
Else
EndIf
EndIf
EndIf
EndIf
EndSub
Sub DoTitleScreenLoop
If (ScreenDirty = 1) Then
ScreenDirty = 0
GraphicsWindow.Clear()
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FontSize = 32
GraphicsWindow.DrawText(0,0,"SBSnake!")
GraphicsWindow.FontSize = 16
GraphicsWindow.DrawText(0,64,"F1 pour les instructions")
GraphicsWindow.DrawText(0,80,"F2 pour une nouvelle partie")
GraphicsWindow.DrawText(0,96,"'Echap' pour quitter")
EndIf
EndSub
Sub DoInstructionLoop
If (ScreenDirty = 1) Then
ScreenDirty = 0
GraphicsWindow.Clear()
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FontSize = 32
GraphicsWindow.DrawText(0,0,"Comment jouer à SBSnake!")
GraphicsWindow.FontSize = 16
GraphicsWindow.DrawText(0,64,"Utiliser les flèches pour déplacer le serpent.")
GraphicsWindow.DrawText(0,80,"Ne touchez pas les murs, ne touchez pas votre queue.")
GraphicsWindow.DrawText(0,96,"Mangez les granules pour augementer le score.")
GraphicsWindow.DrawText(0,112,"'Echap' pour retourner au menu principal")
EndIf
EndSub
Sub AddPellet
PickPellet:
PelletX = Math.GetRandomNumber(40)-1
PelletY = Math.GetRandomNumber(30)-1
Color = GraphicsWindow.GetPixel(PelletX * 16 + 8, PelletY * 16 + 8)
If (Color = "#00FF00" Or Color="#FF0000") Then
Goto PickPellet
EndIf
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "#FF0000"
GraphicsWindow.FillRectangle(PelletX* 16+3, PelletY * 16+3,10,10)
EndSub
Sub DrawHead
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "#00FF00"
GraphicsWindow.FillRectangle(SnakeHeadX * 16+2, SnakeHeadY * 16+2,12,12)
If (Direction="South") Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16,8,4)
EndIf
If (Direction="North") Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+12,8,4)
EndIf
If (Direction="East") Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16+4,4,8)
EndIf
If (Direction="West") Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+12, SnakeHeadY*16+4,4,8)
EndIf
EndSub
Sub EraseHead
If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16)="#00FF00") Then
NorthFlag = 1
Else
NorthFlag = Array.GetValue("NorthFlag",Direction)
EndIf
If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+15)="#00FF00") Then
SouthFlag = 1
Else
SouthFlag = Array.GetValue("SouthFlag",Direction)
EndIf
If (GraphicsWindow.GetPixel(SnakeHeadX*16,SnakeHeadY*16+8)="#00FF00") Then
WestFlag = 1
Else
WestFlag = Array.GetValue("WestFlag",Direction)
EndIf
If (GraphicsWindow.GetPixel(SnakeHeadX*16+15,SnakeHeadY*16+8)="#00FF00") Then
EastFlag = 1
Else
EastFlag = Array.GetValue("EastFlag",Direction)
EndIf
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16,16,16)
GraphicsWindow.BrushColor = "#00FF00"
If (AtePellet = 1) Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+3, SnakeHeadY*16+3,10,10)
Else
GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+4,8,8)
EndIf
If (NorthFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16,8,4)
EndIf
If (SouthFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+12,8,4)
EndIf
If (WestFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16+4,4,8)
EndIf
If (EastFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeHeadX * 16+12, SnakeHeadY*16+4,4,8)
EndIf
EndSub
Sub EraseTail
If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16)="#00FF00") Then
NorthFlag = 1
Else
NorthFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16+15)="#00FF00") Then
SouthFlag = 1
Else
SouthFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16,SnakeTailY*16+8)="#00FF00") Then
WestFlag = 1
Else
WestFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16+15,SnakeTailY*16+8)="#00FF00") Then
EastFlag = 1
Else
EastFlag = 0
EndIf
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16,16,16)
If (NorthFlag = 1) Then
TailDirection = "North"
EndIf
If (SouthFlag = 1) Then
TailDirection = "South"
EndIf
If (EastFlag = 1) Then
TailDirection = "East"
EndIf
If (WestFlag = 1) Then
TailDirection = "West"
EndIf
SnakeTailX = SnakeTailX + Array.GetValue("DeltaX",TailDirection)
SnakeTailY = SnakeTailY + Array.GetValue("DeltaY",TailDirection)
If (GraphicsWindow.GetPixel(SnakeTailX*16+3,SnakeTailY*16+3)="#00FF00") Then
TailPellet = 1
Else
TailPellet = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16)="#00FF00") Then
NorthFlag = 1
Else
NorthFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16+15)="#00FF00") Then
SouthFlag = 1
Else
SouthFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16,SnakeTailY*16+8)="#00FF00") Then
WestFlag = 1
Else
WestFlag = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeTailX*16+15,SnakeTailY*16+8)="#00FF00") Then
EastFlag = 1
Else
EastFlag = 0
EndIf
If (TailDirection="North") Then
SouthFlag = 0
EndIf
If (TailDirection="South") Then
NorthFlag = 0
EndIf
If (TailDirection="East") Then
WestFlag = 0
EndIf
If (TailDirection="West") Then
EastFlag = 0
EndIf
GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16,16,16)
GraphicsWindow.BrushColor = "#00FF00"
If (TailPellet = 1) Then
GraphicsWindow.FillRectangle(SnakeTailX * 16+3, SnakeTailY*16+3,10,10)
Else
GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16+4,8,8)
EndIf
If (NorthFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16,8,4)
EndIf
If (SouthFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16+12,8,4)
EndIf
If (WestFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16+4,4,8)
EndIf
If (EastFlag = 1) Then
GraphicsWindow.FillRectangle(SnakeTailX * 16+12, SnakeTailY*16+4,4,8)
EndIf
EndSub
Sub ProcessDirectionInput
If (Text.GetLength(DirectionInput)>0) Then
Temp = Text.GetSubText(DirectionInput,1,1)
DirectionInput = Text.GetSubText(DirectionInput,1,Text.GetLength(DirectionInput)-1)
Direction = Array.GetValue("DirectionInput",Temp)
EndIf
EndSub
Sub StartGame
Direction=""
DirectionInput=""
SnakeLength = 1
SnakeMaximumLength = 4
SnakeHeadX = 20
SnakeHeadY = 15
SnakeTailX = 20
SnakeTailY = 15
AtePellet = 0
Score = 0
GraphicsWindow.Clear()
DrawHead()
AddPellet()
UpdateScore()
EndSub
Sub UpdateScore
GraphicsWindow.Title = "SBSnake - "+Score
EndSub
Sub DoPlayLoop
If (ScreenDirty = 1) Then
ScreenDirty = 0
StartGame()
Else
If (Direction <> "" Or DirectionInput<>"") Then
ProcessDirectionInput()
EraseHead()
SnakeHeadX = SnakeHeadX + Array.GetValue("DeltaX",Direction)
SnakeHeadY = SnakeHeadY + Array.GetValue("DeltaY",Direction)
If (SnakeHeadX<0 Or SnakeHeadX>39 Or SnakeHeadY < 0 Or SnakeHeadY > 29) Then
GameState = "GameOver"
ScreenDirty = 1
Else
If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+8)="#FF0000") Then
Score = Score + 1
UpdateScore()
AtePellet = 1
SnakeMaximumLength = SnakeMaximumLength + 2
AddPellet()
Else
AtePellet = 0
EndIf
If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+8)="#00FF00") Then
GameState = "GameOver"
DrawHead()
ScreenDirty = 1
Else
SnakeLength = SnakeLength + 1
DrawHead()
While (SnakeLength>SnakeMaximumLength)
EraseTail()
SnakeLength = SnakeLength - 1
EndWhile
Program.Delay(GameDelay)
EndIf
EndIf
EndIf
EndIf
EndSub
Sub DoGameOverLoop
If (ScreenDirty = 1) Then
ScreenDirty = 0
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FontSize = 32
GraphicsWindow.DrawText(0,0,"Perdu !")
GraphicsWindow.FontSize = 16
GraphicsWindow.DrawText(0,64,"F1 pour les instructions")
GraphicsWindow.DrawText(0,80,"F2 pour une nouvelle partie")
GraphicsWindow.DrawText(0,96,"'Echap' pour quitter")
EndIf
EndSub
Sub DoGameLoop
If (GameState = "TitleScreen") Then
DoTitleScreenLoop()
Else
If (GameState = "Instructions") Then
DoInstructionLoop()
Else
If (GameState = "Play") Then
DoPlayLoop()
Else
If (GameState = "GameOver") Then
DoGameOverLoop()
EndIf
EndIf
EndIf
EndIf
EndSub
Voir Aussi
Autres Langues
- Article Original : Small Basic Sample: Snake (en-US)