Python Game 🎮 v3.0 for Numworks, all models.
By Vivien G.R. décembre 2024.
Un projet libre réalisé dans la cadre de l'enseignement de spécialité NSI,
participation au Concours Python 2024-2025 de tiplanet
Learn more aboutThe Map on: nsi.xyz/themap (FR)
from kandinsky import fill_rect as f_r,draw_string as d_s,get_pixel as g_p from random import randint as rd from ion import keydown as kd from time import sleep as sl # Version 3.0 du 05/01/2025 col=('white','white','green','green','green','red','red','gray') zombie = {"PV":30,"AT":13,"DEF":1} squelette = {"PV":35,"AT":15,"DEF":3} araigne = {"PV":50,"AT":20,"DEF":4} gobelin = {"PV":40,"AT":25,"DEF":2} blob = {"PV":90,"AT":12,"DEF":7} shadow = {"PV":70,"AT":42,"DEF":4} hydre = {"PV":200,"AT":60,"DEF":20} en = ((zombie,'Zombie'),(squelette,'Squelette'),(araigne,'Araignée'),(gobelin,'Gobelin'),(blob,'Blob'),(shadow,'Shadow'),(hydre,'Hydre')) def event(n_e): if n_e == 2: a_s_h(2,0) modif = rd(10,30-8*(n//10)) h["PV"] += modif elif n_e == 3: h["AT"] += 5 modif = 5 elif n_e == 4: h["DEF"] += 2 modif = 2 elif n_e == 5: modif = rd(10,15+10*(n//10))-h["DEF"] h["PV"] -= modif if h["PV"] <= 0: sl(1) init_jeu() elif n_e == 6: a_s_h(n_e) combat(en[rd(0,1+(n//4)*(n<24)+5*(n>=24))]) modif=0 a_s_h(n_e*(n_e!=6),0,modif) return def combat(m_i): e_c = 1 a_s_h(0,e_c,0,m_i[0],m_i[1]) sl(1) while e_c == 1: m_i[0]["PV"] -= h["AT"]-m_i[0]["DEF"] m_i[0]["PV"]*=(m_i[0]["PV"]>0) a_s_h(0,e_c,0,m_i[0],m_i[1]) sl(1) if m_i[0]["PV"] <= 0: e_c = 0 return h["PV"] -= m_i[0]["AT"]-h["DEF"] h["PV"]*=(h["PV"]>0) a_s_h(0,e_c,0,m_i[0],m_i[1]) sl(1) if h["PV"] <= 0: e_c = 0 sl(1) return init_jeu() def jeu(): f_r(0,0,320,222,'black') title(100,10,0.75) for i in range(t_p): for j in range(t_p): red=(80+int((144-2)/t_p+1)*j,30+int((144-2)/t_p+1)*i,int((144-2)/t_p),int((144-2)/t_p)) if g[i][j] == 'P': f_r(red[0],red[1],red[2],red[3],'gray') d_c(red[0],red[1],red[2]) else: f_r(red[0],red[1],red[2],red[3],'white') d_q_m(red[0],red[1],red[2]) a_g() a_g2() a_s_h() barre_bas() def a_g(ori=[0,0]): for char in range(len(g)): for pers in range(len(g[char])): if g[char][pers] == 'P': g[char][pers] = 1 eve = g[h["pos"][1]][h["pos"][0]] g[h["pos"][1]][h["pos"][0]] = 'P' f_r(80+int((144-2)/t_p+1)*ori[0],30+int((144-2)/t_p+1)*ori[1],int((144-2)/t_p),int((144-2)/t_p),'white') f_r(80+int((144-2)/t_p+1)*h["pos"][0],30+int((144-2)/t_p+1)*h["pos"][1],int((144-2)/t_p),int((144-2)/t_p),'gray') d_c(80+int((144-2)/t_p+1)*h["pos"][0]+9*(t_p==3)+7*(t_p==4)+5*(t_p==5)+3*(t_p==6),30+int((144-2)/t_p+1)*h["pos"][1]+9*(t_p==3)+7*(t_p==4)+5*(t_p==5)+3*(t_p==6),30*(t_p==3)+21*(t_p==4)+18*(t_p==5)+18*(t_p==6)) return eve def a_g2(): for j in range(0,t_p): for i in range(0+1*(j%2!=0),t_p,2): if not(j==0 and i==0): comp=(80+int((144-2)/t_p+1)*j,30+int((144-2)/t_p+1)*i,int((144-2)/t_p),int((144-2)/t_p)) comp2=(80+int((144-2)/t_p+1)*j+9*(t_p==3)+7*(t_p==4)+5*(t_p==5)+3*(t_p==6),30+int((144-2)/t_p+1)*i+9*(t_p==3)+7*(t_p==4)+5*(t_p==5)+3*(t_p==6),30*(t_p==3)+21*(t_p==4)+18*(t_p==5)+18*(t_p==6)) f_r(comp[0],comp[1],comp[2],comp[3],col[int(g[i][j])]) if g[i][j] != 1: f_t[str(g[i][j])](comp2[0],comp2[1],comp2[2]) def pixel_heart(x,y,t): for j in range(9): for i in range((j==0)+(j==3)+(j==4)*2+(j==5)+(j==8),4+1*((j==1)+(j==7))+2*((j==2)+(j==6))+3*((j==3)+(j==5))+4*(j==4)): f_r(x+int(t/9)*j+int(1/2*((t+5)/9)),y+int(t/9)*i+int(1/2*((t+15)/7)),int(t/9),int(t/9),'red') def draw_cross(x,y,t): for j in range(5): for i in range(((j==1)+(j==3))+((j==2)+(j==5))*2,5,4*((j==0)+(j==4))+2*((j==1)+(j==3))+3*(j==2)): f_r(x+int(t/5)*j,y+int(t/5)*i,int(t/5),int(t/5),'red') def draw_sword(x,y,t): for j in range(7): for i in range(6*(j==0)+3*((j==1)+(j==2))+2*(j==3)+1*(j==4),7-2*(j==2)-1*(j==3)-3*(j==4)-4*(j==5)-5*(j==6),1+1*(j==1)): f_r(x+int(t/7)*j,y+int(t/7)*i,int(t/7),int(t/7),'gray') def draw_sword_m(x,y,t): for j in range(7): for i in range(6*(j==6)+3*((j==5)+(j==4))+2*(j==3)+1*(j==2),7-2*(j==4)-1*(j==3)-3*(j==2)-4*(j==1)-5*(j==0),1+1*(j==5)): f_r(x+int(t/7)*j,y+int(t/7)*i,int(t/7),int(t/7),'gray') def draw_spike(x,y,t): for j in range(5): for i in range(3*((j==0)+(j==4))+1*((j==1)+(j==3)),4): f_r(x+int(t/5)*j,y+int(t/5)*i+int(1/2*(t/5)),int(t/5),int(t/5),'gray') def draw_shield(x,y,t): for j in range(5): for i in range(6-2*((j==0)+(j==4))-1*((j==1)+(j==3))): f_r(x+int(t/6)*j+int(1/2*(t/6)),y+int(t/6)*i,int(t/6),int(t/6),'#7C3626') def d_c(x,y,t): for j in range(5): for i in range(5*((j==0)+(j==4)),6*((j==0)+(j==4))+7*(j==2)+1*((j==1)+(j==3))): if (j==1)+(j==3): for k in range(3): f_r(x+int(t/9)*j+int(2*(t/9)),y+int(t/9)*k,int(t/9),int(t/9),'black') f_r(x+int(t/9)*j+int(2*(t/9)),y+int(t/9)*4,int(t/9),int(t/9),'black') for k in range(2): f_r(x+int(t/9)*j+int(2*(t/9)),y+int(t/9)*(k+7),int(t/9),int(t/9),'black') break else: f_r(x+int(t/9)*j+int(2*(t/9)),y+int(t/9)*i,int(t/9),int(t/9),'black') def d_q_m(x,y,t): for j in range(5): for i in range(1*((j==0)+(j==4)),1*((j==2)+(j==1))+3*((j==0)+(j==4))+4*(j==3),1*(j!=3)+3*(j==3)): if (j==2): f_r(x+int(t/8)*j+int(1.9*(t/8)),y+int(t/8),int(t/8),int(t/8),'black') for k in range(2): f_r(x+int(t/8)*j+int(1.9*(t/8)),y+int(t/8)*(k+4)+int(t/8),int(t/8),int(t/8),'black') f_r(x+int(t/8)*j+int(1.9*(t/8)),y+int(t/8)*7+int(t/8),int(t/8),int(t/8),'black') break else: f_r(x+int(t/8)*j+int(1.9*(t/8)),y+int(t/8)*i+int(t/8),int(t/8),int(t/8),'black') def barre_bas(): f_r(0, 200, 320, 22, (148, 113, 222)) d_s( "nsi.xyz/themap", 2, 202, (242,)*3, (148, 113,222)) d_s("Niveau "+str(n), 170, 202, (242,)*3, (148, 113,222)) #inspiré de nsi.xyz/escape def a_s_h(n_e=0,e_c=0,modif=0,m='',n_m=''): f_r(0, 179, 320, 20, 'black') d_s("Heros",5,160,'white','black') txt=[] txt.append(str(int(h["PV"]))) txt.append(str(int(h["AT"]))) txt.append(str(int(h["DEF"]))) d_s(txt[0],5, 180,(242,)*3, 'black') pixel_heart(7+10*len(txt[0]),180,18) d_s(txt[1],30+10*len(txt[0]), 180,(242,)*3, 'black') draw_sword(32+10*(len(txt[0])+len(txt[1])),180,18) d_s(txt[2],50+10*(len(txt[0])+len(txt[1])), 180,(242,)*3, 'black') draw_shield(52+10*(len(txt[0])+len(txt[1])+len(txt[2])),180,18) if n_e != 0 and n_e != 1: f_t[str(n_e)](151,180,18) if n_e == 2 or n_e == 3 or n_e == 4: d_s('+'+str(modif),200,180,(242,)*3, 'black') f_t[str(n_e)](215+10*len(str(modif)),180,18) if n_e == 5: d_s('-'+str(modif),200,180,(242,)*3, 'black') f_t["2"](215+10*len(str(modif)),180,18) if e_c == 1: f_t["6"](151,180,18) d_s(str(n_m),225,160,'white','black') txt=[] txt.append(str(int(m["PV"]))) txt.append(str(int(m["AT"]))) txt.append(str(int(m["DEF"]))) d_s(txt[0],175, 180,(242,)*3, 'black') pixel_heart(177+10*len(txt[0]),180,18) d_s(txt[1],200+10*len(txt[0]), 180,(242,)*3, 'black') draw_sword(202+10*(len(txt[0])+len(txt[1])),180,18) d_s(txt[2],220+10*(len(txt[0])+len(txt[1])), 180,(242,)*3, 'black') draw_shield(222+10*(len(txt[0])+len(txt[1])+len(txt[2])),180,18) elif e_c == 0: f_r(225, 160, 95, 19,'black') m=[hydre,shadow,blob,araigne,gobelin,squelette,zombie] for i in range(len(m)): m[i]["PV"] = 200*(i==0)+70*(i==1)+90*(i==2)+40*(i==3)+50*(i==4)+35*(i==5)+30*(i==6) def title(x=90,y=35,t=1): for j in range(5): for i in range(5-4*((j==0) or (j==1) or (j==3) or (j==4))): f_r(int(x+4*j*t),int(y+4*i*t),int(4*t),int(4*t),'gray') for j in range(4): for i in range(2*((j==1)+(j==2)),5-2*((j==1)+(j==2))): f_r(int(x+25*t+4*j*t),int(y+4*i*t),int(4*t),int(4*t),'gray') for j in range(3): for i in range(0,5,1*(j==0)+2*(j==1)+4*(j==2)): f_r(int(x+50*t+4*j*t),int(y+4*i*t),int(4*t),int(4*t),'gray') for j in range(5): for i in range(1*((j==1) or (j==3))+2*(j==2),5-3*((j==1) or (j==3))-2*(j==2)): f_r(int(x+75*t+4*j*t),int(y+4*i*t),int(4*t),int(4*t),'gray') for j in range(5): for i in range(3*((j==0) or (j==4))+1*((j==1) or (j==3)),5-2*((j!=0) and (j!=4)),1+1*(j==2)): f_r(int(x+100*t+4*j*t),int(y+4*i*t),int(4*t),int(4*t),'gray') for j in range(3): for i in range(1*(j==2),5-2*(j==1)-3*(j==2),1*(j!=1)+2*(j==1)): f_r(int(x+125*t+4*j*t),int(y+4*t*i),int(4*t),int(4*t),'gray') def init_jeu(): global t_p,g,h t_p = (3+n//(4+n//7)*(n<32)+3*(n>=32)) g = [[rd(0,1) for i in range(t_p)] for j in range(t_p)] for i in range(t_p): for j in range(t_p): if g[i][j] == 0: g[i][j] = rd(1,4) else: g[i][j] = rd(5,6) g[rd(t_p-2,t_p-1)][rd(t_p-2,t_p-1)] = 0 g[0][0] = 'P' h = {"PV":int(50+5*(n//5)),"AT":int(10+1*(n//5)),"DEF":int(0+1*(n//10)),"pos":[0,0]} return jeu() f_t = {'P':d_c,'0':draw_cross,'2':pixel_heart,'3':draw_sword,'4':draw_shield,'5':draw_spike,'6':draw_sword_m} n = 1 init_jeu() while True: sl(0.5) stop = 0 while stop == 0: orig=[h["pos"][0],h["pos"][1]] if kd(2): stop = 1 h["pos"][1] += 1*(h["pos"][1]+1<t_p) eve = a_g(orig) if eve == 0: n += 1 init_jeu() elif eve !=1: event(eve) stop = 0 sl(0.4) elif kd(3): stop = 1 h["pos"][0] += 1*(h["pos"][0]+1<t_p) eve = a_g(orig) if eve == 0: n += 1 init_jeu() elif eve !=1: event(eve) stop = 0 sl(0.4) elif kd(1): stop = 1 h["pos"][1] -= 1*(h["pos"][1]-1>=0) eve = a_g(orig) if eve == 0: n += 1 init_jeu() elif eve !=1: event(eve) stop = 0 sl(0.4) elif kd(0): stop = 1 h["pos"][0] -= 1*(h["pos"][0]-1>=0) eve = a_g(orig) if eve == 0: n += 1 init_jeu() elif eve !=1: event(eve) stop = 0 sl(0.4)