To learn to program on my first computer, a HP model 85, I create a little game 45 years ago. I want to write it with PB, but I found a difference between PB 6,20 on Imac Sequoia and PB 6.20 on MacBook M1 pb 6.20
On each case , it is the same code share via google drive.
The game compile on Imac, everything is correct

The game compile on M1 , graphic is divided by 2

The code
To control player 1 use arrows right and left, and player2 key "w" and key "x"
Code: Select all
EnableExplicit  ;n'accepte que les variables déclarées
Global LargBox = 10, HautBox = 10,X1,Y1,X2,Y2,largeur=400,hauteur=400,delta = 20
Global dir1, dir2, coul1, coul2, h1,h2, v1,v2, fin
Debug largeur/delta
Global Dim tab(largeur/delta,hauteur/delta)
Global max = (largeur/delta)-1
Debug "max" + max
Procedure serpent1Aff()
  ;Debug "1 "+x1+" "+y1
  If X1 > largeur/delta Or Y1 > hauteur/delta Or x1 < 0 Or y1 < 0
    SetGadgetColor(14, #PB_Gadget_FrontColor , coul2)
    SetGadgetText(14,"Joueur 2 gagné") 
    fin = #True
  ElseIf tab(x1,y1) > 0
    SetGadgetColor(14, #PB_Gadget_FrontColor , coul2)
    SetGadgetText(14,"Joueur 2 gagné")
    fin = #True
  Else
    tab(x1,y1) = 1
    StartDrawing(CanvasOutput(10))
    Box(X1*delta, Y1*delta,delta, delta , coul1)
    StopDrawing()  
  EndIf
  
  
EndProcedure
Procedure serpent1()
  ; direction 1>h, 2>b, 3>d, 4>g
  Debug "dir1 1 "+dir1
  
  Debug "S1 x1:"+x1+" y1:"+y1 +" h1:"+h1+" v1:"+v1
  
  Debug ">>>>>>>>>>>>>>>>>"+tab(x1,y1)
  
  
  Select dir1 ; changement de direction si case non libre
    Case 1    ;^
      If tab(X1,y1-1) > 0 And tab(x1+1,Y1) > 0; coin 
        dir1 = 4
      ElseIf tab(X1,y1-1) > 0 And tab(x1-1,Y1) > 0 ; coin 
        dir1 = 3
      ElseIf tab(x1,y1-1) > 0
        dir1=Random(4,3)
      EndIf
    Case 2 ;v      
      If tab(X1,y1+1) > 0 And tab(x1-1,Y1) > 0; coin 
        dir1 = 3
      ElseIf tab(X1+1,y1) > 0 And tab(x1,Y1+1) > 0 ; coin 
        dir1 = 4
      ElseIf tab(x1,y1+1) > 0
        dir1=Random(4,3)
      EndIf
    Case 3 ;>
      If tab(X1,y1-1) > 0 And tab(x1+1,Y1) > 0; coin 
        dir1 = 2
      ElseIf tab(X1+1,y1) > 0 And tab(x1,Y1+1) > 0 ; coin 
        dir1 = 1
      ElseIf tab(x1+1,y1) > 0
        dir1=Random(2,1)
      EndIf
    Case 4 ;<
      If tab(X1-1,y1) > 0 And tab(x1,Y1-1) > 0; coin 
        dir1 = 2
      ElseIf tab(X1-1,y1) > 0 And tab(x1,Y1+1) > 0 ; coin 
        dir1 = 1
      ElseIf tab(x1-1,y1) > 0
        dir1=Random(2,1)
      EndIf
  EndSelect   
  
  
  Select dir1
    Case 1 ;^
      Y1 = y1 - 1 ; haut
    Case 2        ;v
      y1 = y1 + 1
    Case 3 ;>
      x1 = x1 + 1
    Case 4 ;<
      X1 = X1 - 1
  EndSelect
  
  serpent1Aff()
  
EndProcedure
Procedure serpent2Aff()
  ;Debug "2 "+x2+" "+y2
  
  If X2 > largeur/delta Or Y2 > hauteur/delta Or x2 < 0 Or y2 < 0
    SetGadgetColor(14, #PB_Gadget_FrontColor , coul1)
    SetGadgetText(14,"Joueur 1 gagné") 
    fin = #True
  ElseIf tab(x2,y2) >0
    SetGadgetColor(14, #PB_Gadget_FrontColor , coul1)
    SetGadgetText(14,"Joueur 1 gagné")
    fin = #True
  Else
    tab(x2,y2) = 2
    StartDrawing(CanvasOutput(10))
    Box(X2*delta, Y2*delta,delta, delta , coul2)
    StopDrawing()  
  EndIf
  
EndProcedure
Procedure serpent2()
  ; direction 1>h, 2>b, 3>d, 4>g
  Debug "2-1 x2:"+x2+" y2:"+y2+" d2"+dir2
  Select dir2 ; changement de direction si case non libre
    Case 1    ;^
      If tab(X2,y2-1) > 0 And tab(x2+1,y2) > 0; coin 
        dir2 = 4
      ElseIf tab(x2,y2-1) > 0 And tab(x2-1,y2) > 0 ; coin 
        dir2 = 3
      ElseIf tab(x2,y2-1) > 0
        dir2=Random(4,3)
      EndIf
    Case 2 ;v      
      If tab(x2,y2+1) > 0 And tab(x2-1,y2) > 0; coin 
        dir2 = 3
      ElseIf tab(x2+1,y2) > 0 And tab(x2,y2+1) > 0 ; coin 
        dir2 = 4
      ElseIf tab(x2,y2+1) > 0
        dir2=Random(4,3)
      EndIf
    Case 3 ;>
      If tab(x2,y2-1) > 0 And tab(x2+1,y2) > 0; coin 
        dir2 = 2
      ElseIf tab(x2+1,y2) > 0 And tab(x2,y2+1) > 0 ; coin 
        dir2 = 1
      ElseIf tab(x2+1,y2) > 0
        dir2=Random(2,1)
      EndIf
    Case 4 ;<
      If tab(x2-1,y2) > 0 And tab(x2,y2-1) > 0; coin 
        dir2 = 2
      ElseIf tab(x2-1,y2) > 0 And tab(x2,y2+1) > 0 ; coin 
        dir2 = 1
      ElseIf tab(x2-1,y2) > 0
        dir2=Random(2,1)
      EndIf
  EndSelect   
  Debug "2-2 x:"+x2+" y"+y2+" d"+dir2
  
  
  Select dir2
    Case 1
      Y2 = y2 - 1
    Case 2
      y2 = y2 + 1
    Case 3
      x2 = x2 + 1
    Case 4    
      X2 = X2 - 1
  EndSelect
  
  
  serpent2Aff()
EndProcedure
Procedure EffaceTab()
  Define i,j
  For i = 1 To max-1
    For j = 1 To max-1
      tab (i,j) = 0      
    Next
    Next
    
  EndProcedure
  Procedure limite()
    Define i,j
  For i = 0 To max
    StartDrawing(CanvasOutput(10))
    tab (max,i) = 2
    Box(max*delta, i*delta,delta, delta , $BDBDBD)
    tab (0,i) = 2
    Box(0, i*delta,delta, delta , $BDBDBD)
    tab (i,max) = 2
    Box(i*delta, max*delta,delta, delta , $BDBDBD)
    tab (i,0) = 2
    Box(i*delta, 0*delta,delta, delta , $BDBDBD)
    StopDrawing() 
  Next
EndProcedure
Procedure PrepareCanvas()
   StartDrawing(CanvasOutput(10))
            Box(delta, delta,largeur-2*delta, hauteur-2*delta , $ffffff)
            StopDrawing()  
            coul1 = RGB(Random(255),Random(255),Random(255))
            dir1 = Random(4,1)
            X1 = Random(largeur/delta-5,5)
            Y1 = Random(hauteur/delta-5,5)
            Debug "1: "+x1+"/"+y1+" "+dir1+" "+coul1
            serpent1aff()
            coul2 = RGB(Random(255),Random(255),Random(255))
            dir2 = Random(4,1)
            X2 = Random(largeur/delta-5,5)
            Y2 = Random(hauteur/delta-5,5)
            Debug "2: "+x2+"/"+y2+ " "+dir2+" "+coul2
            serpent2aff()
  
  EndProcedure
Procedure bordure()
  
EndProcedure
If OpenWindow(0, 0, 0, largeur, hauteur+50, "Le mur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Define Event, gadget, type,D, EventMenu, i
  
  AddWindowTimer(0, 123, 200)
  AddKeyboardShortcut(0, #PB_Key_Right, 31)   
  AddKeyboardShortcut(0, #PB_Key_Left, 33)    
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 34)  
  AddKeyboardShortcut(0, #PB_Key_Up, 32)           
  
  AddKeyboardShortcut(0, #PB_Key_X, 35)        ;w sepent 2 gauche  
  AddKeyboardShortcut(0, #PB_Key_W, 36)        ;x sepent 2 droite
  AddKeyboardShortcut(0, #PB_Key_Space, 37)
  
  TextGadget(14, 10, hauteur+20,150,20,"XXXXXXXXXX")
  
  ButtonGadget(15, largeur - 110, hauteur+20 , 100, 20, "NOUVEAU")
  
  CanvasGadget(10, 0, 0, largeur, hauteur, #PB_Canvas_Container)
  
  ;limite
  For i = 0 To max
    StartDrawing(CanvasOutput(10))
    tab (max,i) = 2
    Box(max*delta, i*delta,delta, delta , $BDBDBD)
    tab (0,i) = 2
    Box(0, i*delta,delta, delta , $BDBDBD)
    tab (i,max) = 2
    Box(i*delta, max*delta,delta, delta , $BDBDBD)
    tab (i,0) = 2
    Box(i*delta, 0*delta,delta, delta , $BDBDBD)
    StopDrawing() 
  Next
  
  
  coul1 = RGB(Random(255),Random(255),Random(255))
  dir1 = Random(4,1)
  X1 = Random(largeur/delta-5,5)
  Y1 = Random(hauteur/delta-5,5)
  Debug "1: "+x1+"/"+y1+" "+dir1+" "+coul1
  serpent1aff()
  coul2 = RGB(Random(255),Random(255),Random(255))
  dir2 = Random(4,1)
  X2 = Random(largeur/delta-5,5)
  Y2 = Random(hauteur/delta-5,5)
  Debug "2: "+x2+"/"+y2+ " "+dir2+" "+coul2
  serpent2aff()
  CloseGadgetList()
  
  Repeat
    Event = WaitWindowEvent()
    gadget = EventGadget()
    type = EventType() 
    
    Select Event
      Case #PB_Event_Menu
        EventMenu = EventMenu()
        Select EventMenu 
          Case 31
            Debug "droite"
            Select dir1
              Case 1 ;^
                dir1 = 3
              Case 2 ;v
                dir1 = 4
              Case 3 ;>
                dir1 = 2
              Case 4 ;<
                dir1 = 1
            EndSelect 
            
            
          Case 33 ;gauche 
            Debug "gauche"
            
            Select dir1
              Case 1 ;^
                dir1 = 4
              Case 2 ;v
                dir1 = 3
              Case 3 ;>
                dir1 = 1
              Case 4 ;<
                dir1 = 2
            EndSelect
            
          Case 36 ;w <
            Debug "2 gauche"
            Select dir2
              Case 1 ;^
                dir2 = 4
              Case 2 ;v
                dir2 = 3
              Case 3 ;>
                dir2 = 1
              Case 4 ;<
                dir2 = 2
            EndSelect
            
          Case 35 ;x >
            Debug "2 droite"
            
            Select dir2
              Case 1 ;^
                dir2 = 3
              Case 2 ;v
                dir2 = 4
              Case 3 ;>
                dir2 = 2
              Case 4 ;<
                dir2 = 1
            EndSelect 
            
          Case 34
            Debug "fin"
            fin  = #True
            
          Case 37  
            serpent1()
            
        EndSelect        
      Case #PB_Event_Timer
        If EventTimer() = 123
          If fin = 0
            serpent1()
            serpent2()
          EndIf
          
        EndIf  
        
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 15
            PrepareCanvas()
            EffaceTab()
            fin =#False
          Case 1 
            CloseWindow(0)
            End  
        EndSelect
        
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf







