Publication initiale :
Lien vers le script : https://workshop.numworks.com/python/cent20/demine
Ne fonctionnera que sur l'os Omega pour l'instant. Tout est expliqué dans l'article de présentation.
Vous pouvez commenter / critiquer en utilisant le forum ci-dessous.
Le programme avant optimisation, il pèse alors 3.09 ko :
- Code: Select all
from ion import keydown
from kandinsky import *
from random import randint
from time import sleep
# cut
co=color
a,r,t,l,k,s=set_pixel,fill_rect,draw_string,range,keydown,sleep
# couleurs
f,h,n = 255,127,0
c=[co(f,f,f), co(45,125,210), co(151,204,4), co(238,185,2), co(244,93,1), co(215,65,167), co(n,n,n), co(n,n,n), co(n,n,n),
co(h,h,h),co(192,192,192),co(96,96,96),co(253,236,185)]
nb=[19,0,0]
# init
p=[[6,5],[7,5]]
m = []
def deminage():
t(str(nb[1]),12,2,c[2]);t("/"+str(150-nb[0]),42,2,c[1]);
t("Demineur",120,2)
t("mines:"+str(nb[0]),220,2,c[5])
if nb[1]+nb[0]>=150:t("Gagné ! ",120,2)
def decouvre(x,y):
i=1
while i>0:
chiffre(x,y)
for p in l(max(0,x-1),min(15,x+2)):
for q in l(max(0,y-1),min(10,y+2)):
if m[p][q]>=100:chiffre(p,q)
elif m[p][q]==0:m[p][q]+=1
i=0
for p in l(15):
for q in l(10):
if m[p][q]%100==1:i=1;x=p;y=q;p=14;q=9
def terrain():
r(8,21,300,200,c[9])
for y in l(21,243,20):
for x in l(8,309):
a(x,y,c[10])
for x in l(8,320,20):
for y in l(21,222):
a(x,y,c[10])
def chiffre(x,y):
cl(x,y)
nb[1]+=(m[x][y]%100!=42)
i=m[x][y]-m[x][y]%100
m[x][y]=i+42
if i>=100:v=int(i/100);t(str(v),13+20*(x),23+20*(y),c[v],c[0])
deminage()
def minage(b=nb[0]):
if nb[2]==0:start()
nb[2]+=1;terrain();m.clear();t(" "*28,12,2)
for x in range(15):m.append([0 for y in range(10)])
nb[1]=0
while b>0:
x, y = randint(0,14),randint(0,9)
if m[x][y]!=999:
m[x][y]=999;b-=1
for p in l(max(0,x-1),min(15,x+2)):
for q in l(max(0,y-1),min(10,y+2)):
if m[p][q]!=999:m[p][q]+=100
deminage();drone()
def start():
t("Demineur",120,42,c[4])
t("par cent20",110,62,c[1])
t("https://nsi.xyz/demine",42,82,c[6])
t("[OK] [Clear] [+] [-] [EXE]",32,122,c[2])
s(4)
def explose():
t("perdu ! ",120,2)
for x in l(15):
for y in l(10):
if m[x][y]==999:mine(x,y)
def marche(x,y):
if m[x][y]>=999:explose()
elif m[x][y]>=100:chiffre(x,y)
else:decouvre(x,y)
def survol():
x, y = p[1][0], p[1][1]
v = m[x][y]
gps(x,y)
# t(str(int(v/100)),20,2)
x, y = p[0][0], p[0][1]
v = m[x][y]
if p[1][0]!=x or p[1][1]!=y:
if (v-42)%100==0:gps(x,y,0)
else:gps(x,y,9)
del p[0]
def gps(x,y,i=6):
r(9+20*x,22+20*y,19,2,c[i]);r(26+20*x,22+20*y,2,19,c[i]);r(9+20*x,22+20*y,2,19,c[i]);r(9+20*x,39+20*y,19,2,c[i])
def drone():
while not k(5):
if k(0):p.append([max(p[0][0]-1,0),p[0][1]])
if k(3):p.append([min(p[0][0]+1,14),p[0][1]])
if k(1):p.append([p[0][0],max(p[0][1]-1,0)])
if k(2):p.append([p[0][0],min(p[0][1]+1,9)])
if k(4):marche(p[0][0],p[0][1])
if k(17) or k(16):drapeau(p[0][0],p[0][1])
if k(52):nb[0]=19;minage(nb[0]);s(1)
if k(45):nb[0]=min(nb[0]+3,42);minage(nb[0]);s(1)
if k(46):nb[0]=max(nb[0]-3,11);minage(nb[0]);s(1)
if len(p)>1:survol();s(0.120)
print(42)
def drapeau(x,y):
r(17+20*x,26+20*y,3,9,c[12]);r(17+20*x,36+20*y,3,3,c[12])
def mine(x,y):
cl(x,y);r(12+20*x,36+20*y,13,4,c[9]);r(14+20*x,34+20*y,9,2,c[11]);r(17+20*x,32+20*y,3,2,c[5])
def cl(x,y):
r(9+20*x,22+20*y,19,19,c[0])
minage()
Multiples mise à jour :
Avec l'aide des membres du forum, une version optimisée tournant sous Epsilon à été publiée.
Un autre membre de tiplanet à lui aussi codé un démineur.
Il y a donc à la date du 07/03 trois démineurs en python compatibles et optimisés pour la NumWorks :
demine.py, script initial compatible uniquement avec la ROM Omega. Lien workshop
deminime2.py script optimisé compatible avec la ROM Epsilon et la ROM Omega. Lien workshop
demineur.py script de Arthur Jacquin, annoncé ici, Lien workshop