D’autres jeux pour la NUMWORKS sur ma chaine Youtube : Rubika, solitaire, Mission missile, démineur, carré magique, TRON, défis de blanche…
Une vidéo pour en savoir plus sur ce programme
from math import * from kandinsky import * from time import sleep,monotonic from ion import * COUL={ "grey":color(0xDC,0xDC,0xDC), "red":color(0xFF,0,0), "black":color(0,0,0), "white":color(255,255,255), } CAR={'0':'XXXX XX XX XXXX','1':'XX X X X XXX',\ '2':'XXX XXXXX XXX','3':'XXX X XX XXXX',\ '4':'X XX XXXX X X','5':'XXXX XXX XXXX',\ '6':'XXXX XXXX XXXX','7':'XXX X X X X',\ '8':'XXXX XXXXX XXXX','9':'XXXX XXXX X X',\ 'S':' XXX XXX XXX ','F':'XXXX XX X X ',\ 'D':'XX X XX XX XXX ','T':'XXX X X X X ',\ 'T':'XXX X X X X ','/':' X X X ',\ 'X':' X X X X X ','+':' X XXX X '} Fast=0.03 Slow=0.04 w,h=320,222 t=13 mg,mh=(w-16*t) // 2,(h-16*t) // 2 jeu=[] Pin=[[7,5,5,3,3,3,1,1,1,1],[8,7,9,6,8,10,5,7,9,11],[0,0,0,0,0,0,0,0,0,0]] def ResetPins(): for lc in range(10): Pin[2][lc]=1 def DrawPins(): for lc in range(10): if Pin[2][lc]==1:C_On(Pin[0][lc],Pin[1][lc]) else:C_Off(Pin[0][lc],Pin[1][lc]) def DrawBg(): global jeu jeu=[] for l in range(16): jeu.append(["grey" for c in range(16)]) for (l,c) in [(1,2),(2,2),(3,2),(3,1),(4,2),(6,2),(5,2),(7,1),(7,2),\ (1,15),(2,15),(3,15),(3,16),(4,15),(5,15),(6,15),(7,16),\ (7,15),(16,1),(16,2),(16,15),(16,16) ]: jeu[l-1][c-1]="red" fill_rect(0,0,320,222,COUL["grey"]) fill_rect(mg+3*t-1,mh,1,7*t,COUL["black"]) fill_rect(mg+12*t-1,mh,1,7*t,COUL["black"]) fill_rect(mg+13*t-1,mh,1,9*t,COUL["black"]) def affCell(Row,Col): r,c=Row-1,Col-1 fill_rect(mg+c*t,mh+r*t,t-1,t-1,COUL[jeu[r][c]]) def C_On(Row,Col): jeu[Row-1][Col-1]="black" affCell(Row,Col) def C_Off(Row,Col): jeu[Row-1][Col-1]="grey" affCell(Row,Col) def ShowPlayer(): C_On(1,1) C_On(2,1) def aff(): for l in range(16): for c in range(16): fill_rect(mg+c*t,mh+l*t,t-1,t-1,COUL[jeu[l][c]]) def AffCar(Right,Left,Charac): CArray=CAR[Charac] for i in range(5): for CAD in range(3): if CArray[3*i+CAD]=="X":C_On(Right+i,Left+CAD) else:C_Off(Right+i,Left+CAD) def ClrScr(): for (x,y) in [(1,1),(2,1),(1,16),(2,16)]: C_Off(x,y) for col in range(3,15): for row in range(1,8):C_Off(row,col) for row in range(8,16): for col in range(1,17):C_Off(row,col) for col in range(3,15):C_Off(16,col) PrevR=-1 PrevC=-1 def ChSpeed(n): global StartSp if etat=="Settings": if n==1: StartSp=Fast AffCar(10,10,"F") else: StartSp=Slow AffCar(10,10,"S") def Setup(): global etat,AddOnFrame,ExtraBall global Score,BalR,BalC,BallDir,Mvt,timer timer=False DrawBg() ClrScr() etat="Settings" Fast=20 Slow=45 AffCar(10,5,"1") ChSpeed(0) Score=0 ResetPins() DrawPins() aff() BalR=1 BalC=14 BallDir="L" Mvt=False ExtraBall=0 AddOnFrame=[None for i in range(10)] def DisplayFrame(): global etat etat="DispFrame" ClrScr() ShowPlayer() if Tour<10:AffCar(10,5,str(Tour)) else: AffCar(10,1,"1") AffCar(10,5,"0") if SpareLastFrame: AffCar(10,9,"/") else: if StrikeCount>0:AffCar(10,9,"X") if StrikeCount>1:AffCar(10,13,"X") def Go(): global etat,Tour,CurrPlayer,BallSpeed,BalR,BalC,BallDir,FirstBall global TotScor,StrikeCount global SpareLastFrame,Mvt if etat=="Settings": Tour=1 CurrPlayer=1 TotScor=0 for lc in range(10):AddOnFrame[lc]=0 StrikeCount=0 SpareLastFrame=False DisplayFrame() sleep(0.5) return if etat=="DispScr": if Tour<11: DisplayFrame() sleep(0.5) return else: Setup() sleep(0.5) return ClrScr() ResetPins() DrawPins() BallSpeed=0.05 etat="StartB" Mvt=True FirstBall=True BalR=1 BalC=14 BallDir="L" C_On(BalR,BalC) if timer==False:StartT() ShowPlayer() def Bowl(): global etat,BallSpeed if etat!="WaitB":return BallSpeed=0.1 if PrevR>0 and PrevC>0:C_Off(PrevR,PrevC) etat="Bowling" def PinStillS(): PinCount=0 for lc in range(10):PinCount+=Pin[2][lc] return PinCount def CalcScore(PinsHit,TenExtra): global TotScor,AddOnFrame sleep(0.2) if not(TenExtra):TotScor+=PinsHit for lc in range(10): if AddOnFrame[lc]>0: TotScor+=PinsHit AddOnFrame[lc] -= 1 def CheckHit(): global Pin for i,(a,b,c) in enumerate([(7,6,10),(5,5,10),(5,6,11),(3,4,10),(3,5,11),(3,6,12)]): if BalR==a and BalC>b and BalC<c:Pin[2][i]=0 if ( BalR==1 and (BalC==4 or BalC==12) and Pin[2][6]==1 and Pin[2][7]==0 and Pin[2][8]==0 and Pin[2][9]==1 ): Pin[2][6]=0 Pin[2][9]=0 return if BalR==1 and BalC>3 and BalC<10 and BalC!=8:Pin[2][6]=0 if BalR==1 and BalC>3 and BalC<11:Pin[2][7]=0 if BalR==1 and BalC>5 and BalC<13:Pin[2][8]=0 if BalR==1 and BalC>6 and BalC<13 and BalC!=8:Pin[2][9]=0 def MoveBall(): global etat,BallSpeed,BalR,BalC,PrevR,PrevC,BallDir,FirstBall global TotScor,StrikeCount global AddOnFrame,SpareLastFrame,B1PinH,ExtraBall PrevR=BalR PrevC=BalC if etat=="StartB": BalR+=1 C_Off(PrevR,PrevC) C_On(BalR,BalC) if BalR==16: etat="Bend" BallSpeed=StartSp return if etat=="Bend": BalC -= 1 C_Off(PrevR,PrevC) C_On(BalR,BalC) etat="WaitB" return if etat=="WaitB": if BallDir=="L": BalC -= 1 if BalC<3: BalC=4 BallDir="R" else: BalC+=1 if BalC>13: BalC=12 BallDir="L" C_Off(PrevR,PrevC) C_On(BalR,BalC) if etat=="Bowling": C_Off(PrevR,PrevC) if BalR<8: DrawPins() if BalR>1: BalR -= 1 CheckHit() C_On(BalR,BalC) else: PinM=PinStillS() if ExtraBall>0: CalcScore(10-PinM,True) ExtraBall -= 1 if ExtraBall>0: if PinM==0: ClrScr() ShowPlayer() ResetPins() DrawPins() etat="StartB" Mvt=True BalR=1 BalC=14 C_On(BalR,BalC) if timer==False: StartT() else: DisplayScore() return if FirstBall: B1PinH=10-PinM if PinM>0: CalcScore(B1PinH,False) StrikeCount=0 SpareLastFrame=False etat="StartB" Mvt=True FirstBall=False BalR=1 BalC=14 C_On(BalR,BalC) if timer==False: StartT() else: CalcScore(10,False) SpareLastFrame=False AddOnFrame[Tour-1]=2 if StrikeCount<2:StrikeCount+=1 if Tour==10: ExtraBall=2 ClrScr() ShowPlayer() ResetPins() DrawPins() etat="StartB" Mvt=True BalR=1 BalC=14 C_On(BalR,BalC) if timer==False:StartT() return DisplayScore() else: # second if PinM==0: CalcScore(10-B1PinH,False) StrikeCount=0 SpareLastFrame=True AddOnFrame[Tour-1]=1 if Tour==10: ExtraBall=1 ClrScr() ShowPlayer() ResetPins() DrawPins() etat="StartB" Mvt=True BalR=1 BalC=14 C_On(BalR,BalC) if timer==False:StartT() return DisplayScore() else: CalcScore(10-(B1PinH+PinM),False) StrikeCount=0 SpareLastFrame=False DblBall=0 DisplayScore() def DisplayScore(): global Mvt,etat,ExtraBall,Tour sleep(.2) if PrevR>0 and PrevC>0: C_Off(PrevR,PrevC) Mvt=False etat="DispScr" ClrScr() ShowPlayer() WScore(TotScor) if (SpareLastFrame or StrikeCount>0) and Tour<10: AffCar(10,14,"+") Tour+=1 ExtraBall=0 def WScore(Score): AffCar(10,10,str(Score % 10)) if Score >= 10: AffCar(10,6,str((Score % 100) // 10)) if Score>99: AffCar(10,2,str((Score % 1000) // 100)) def StartT(): global BallSpeed,Mvt t=monotonic() while True: if Mvt==False: return else: if monotonic()-t>BallSpeed: MoveBall() t=monotonic() if keydown(KEY_ZERO): Bowl() Setup() while True: if keydown(KEY_PLUS):ChSpeed(1) elif keydown(KEY_MINUS):ChSpeed(0) elif keydown(KEY_EXE):Go()