minecraft.py

Created by antarctus

Created on December 10, 2020

7.84 KB

COMMENT JOUER: 1) On se déplace avec les flèches. 2) On peut changer la direction du regard en appuyant sur le bouton off et la flèche voulue. 3) On peut ouvrir et fermer l’inventaire avec la touche “home” 4)On sélectionne quelque chose dans l’inventaire avec la touche correspondante parmi les trois premières lignes du clavier. 5)Pour changer le place d’un outil on sélectionne cet outil, on appuie sur “‘OK” et en même temps on appuie sur la touche correspondante à la case où vous voulez qu’il arrive.


from random import *
from kandinsky import *
from ion import *
from time import *

cx=-2
vie=100
armure=80
ex=(0,0)
direction=(0,0)

break_mode=(
(4,3,0,3,4),
(0,0,2,0,0),
(3,0,1,0,3),
(4,0,2,2,0),
(0,3,0,0,4),
)

map=[
[0,5,5,5,0,0,0,1,3 ,3 ,3 ,10,3,1 ,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,1 ,2,3 ,11,3 ,2,1 ,0,0,0,0,0,0,0,0 ,0 ,0 ,0,0,0,0,5,5,5,5,0,0,0,0,1,0,0,0,0,0,15,16,16,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15],
[0,5,4,5,0,0,1,2,3 ,11,3 ,3 ,3,10,1,1,0,1,1,1,0,0,0,0,0,0,5,5,4,5,5,0,0,0,1,2 ,3,3 ,9 ,3 ,3,2 ,1,0,0,0,0,0,1,13,13,13,1,0,0,5,5,4,4,5,5,0,0,1,2,1,0,0,0,0,15,16,0 ,14,0 ,16,16,0 ,0 ,0 ,0 ,0 ,16,16,16,16,16,16,15],
[1,0,4,0,0,1,2,3,10,9 ,3 ,11,3,3 ,3,2,1,2,2,2,1,0,0,0,1,0,0,0,4,0,0,0,1,1,2,10,3,12,3 ,10,3,3 ,2,1,0,0,0,1,2,2 ,13,13,2,1,0,0,0,4,4,0,0,0,1,2,3,2,1,0,0,0,15,16,0 ,14,0 ,0 ,0 ,0 ,16,16,16,16,16,16,16,16,16,16,15],
[2,1,2,1,1,3,3,3,3 ,3 ,12,3 ,3,11,3,3,2,3,3,2,2,1,1,1,2,1,1,1,1,1,1,1,2,2,3,11,3,11,3 ,3 ,3,10,3,2,1,1,1,2,2,14,15,13,3,2,1,1,1,1,1,1,1,1,2,3,3,3,2,1,1,1,15,16,16,16,16,16,16,16,16,14,14,14,16,16,16,16,16,16,15]
]

max_map=len(map[1])

blocks=(
("air",10000,0,1,1,((0,0,50,50,(130,230,255)),)),
("gazon",10,4,0,0,((0,10,50,40,(190,90,0)),(0,0,50,10,(0,220,0)))),
("terre",10,4,0,0,((0,0,50,50,(190,90,0)),)),
("pierre",40,2,0,0,((0,0,50,50,(180,180,180)),)),
("buche",20,3,0,0,(((0,0,50,50,(200,100,10)),(20,0,10,50,(210,110,20))))),
("feuille",2,3,0,0.75,((0,0,50,50,(100,120,0)),)),
(),#("table",15,3,0,0,()),
("planche",15,3,0,0,((0,0,50,50,(230,130,40)),(0,20,50,10,(210,110,20)),)),
(),#("four",30,2,0,0,()),
("torche",10,3,1,1,((0,0,50,50,(130,230,255)),(20,20,10,30,(200,100,10)),(20,20,10,10,(255,255,0)))),
("minerai_charbon",50,2,0,0,((0,0,50,50,(180,180,180)),(10,30,10,10,(20,20,20)),(30,10,10,10,(20,20,20)))),
("minerai_fer",50,2,0,0,((0,0,50,50,(180,180,180)),(10,30,10,10,(250,100,100)),(30,10,10,10,(250,100,100)))),
("diamant",40,2,0,0,((0,0,50,50,(180,180,180)),(10,30,10,10,(0,255,255)),(30,10,10,10,(0,255,255)))),
("eau",10000,5,0.75,0.5,((0,0,50,50,(0,0,180)),)),
("lave",10000,5,0.25,1,((0,0,50,50,(255,100,0)),)),
("obsidienne",200,2,0,0,((0,0,50,50,(0,0,20)),)),
("pierre_trefond",40,2,0,0,((0,0,50,50,(250,20,0)),)),
#("spawner",200,2,0,0,()),
#("pierre_ender",80,2,0,0,((0,0,50,50,(235,235,235)),)),
#("toile",20,1,0.2,0.9,((0,0,50,50,(130,230,255)),(0,10,40,10,(230,230,230)),(30,0,10,40,(230,230,230)),(10,30,40,10,(230,230,230)),(10,10,10,40,(230,230,230))))
)


inv=[
[0,1,2,3,4,13],
[31,41,51,32,42,52],
[9,7,61,62,63,64]
]

select=0
selectY=0

def casser(outil=0):
  if not -1<p.y+direction[1]<4:
    return
  block=blocks[map[p.y+direction[1]][(p.x+direction[0])%max_map]]
  outil_destine=block[2]
  temps=0.2*block[1]/10
  if outil!=0:
    if outil_destine==outil%10:
      temps/=2
    else:
      temps*=2
    temps/=(int(outil/10)-3)+1

  if block[1]==10000:
    return
  for h in range(1,5):
    for i in range(0,5):
      for j in range(0,5):
        if h==break_mode[i][j]:
          fill_rect(50*(p.x-cx+direction[0])+10*i,50*(p.y+direction[1])+10*j,10,10,(0,0,0))
    sleep(temps)

  map[p.y+direction[1]][(p.x+direction[0])%max_map]=0


class Perso():
  def __init__(self):
    self.x=0
    self.y=0

  def move(self,x,y):
    global direction,cx
    direction=(x,y)
    if keydown(KEY_ONOFF) or (self.y+y in (-1,4)):
      return
    if blocks[map[(self.y+y)%4][(self.x+x)%max_map]][3]>0:
      self.x+=x
      self.y+=y
    if cx+4<self.x or self.x<cx+1:
      cx+=x


  def draw(self):
    rx=(self.x-cx)*50
    ry=self.y*50
    fill_rect(rx+15,ry+10,20,40,(255,0,255))
    fill_rect(rx+15,ry,20,20,(250,160,130))

    fill_rect(rx+18,ry+5,5,5,(255,255,255))
    fill_rect(rx+27,ry+5,5,5,(255,255,255))

    fill_rect(rx+19+(direction[0]),ry+6+(direction[1]),3,3,(0,0,255))
    fill_rect(rx+28+(direction[0]),ry+6+(direction[1]),3,3,(0,0,255))
    
    if 0<inv[0][select%6]<20:
      block=blocks[inv[0][select]]
      for k in block[5]:
        fill_rect(int(30+rx+(k[0]*1/5)),int(30+ry+(k[1]*1/5)),int(k[2]*1/5),int(k[3]*1/5),k[4])
    if 30<inv[0][select%6]<70:
      draw_outil(30+rx,30+ry,1/5,inv[0][select%6]-30)

p=Perso()


def draw():
  if open_inv:
    draw_inv()
    bouger_inv()
    return
  else:
    for i in range(0,4):
      for j in range(0,7):
        block=blocks[map[i][(j+(cx))%max_map]]
        for k in block[5]:
          fill_rect(k[0]+(j*50),k[1]+(i*50),k[2],k[3],k[4])

    p.draw()

  if armure!=ex[0] or vie!=ex[1]:
    draw_life()

def draw_life():
  global ex
  ex=(armure,vie)
  fill_rect(0,200,320,22,(255,255,255))
  fill_rect(0,200,int(armure/100*320),22,(120,120,150))
  fill_rect(3,203,int(vie/100*314),16,(255,0,0))

drawed_inv=0

def draw_inv():
  global drawed_inv
  if drawed_inv:
    return

  fill_rect(20,20,280,160,(125,225,250))
  for i in range(0,6):
    for j in range(0,3):

      if i==select and j==selectY:
        fill_rect(27+i*45-5,10*(j!=0)+30+j*45-5,50,50,(220,200,200))

      if 0<=inv[j][i]<20:
        block=blocks[inv[j][i]]
        for k in block[5]:
          fill_rect(int(27+i*45+(k[0]*4/5)),int(10*(j!=0)+30+j*45+(k[1]*4/5)),int(k[2]*4/5),int(k[3]*4/5),k[4])
      elif 30<inv[j][i]<70:
        draw_outil(27+i*45,10*(j!=0)+30+j*45,4/5,inv[j][i]-30)
      else:
        fill_rect(27+i*45,10*(j!=0)+30+j*45,40,40,(0,0,0))
  drawed_inv=1

open_inv=0  

def draw_outil(x,y,scale,id):
  couleur=((200,100,10),(180,180,180),(235,235,235),(0,255,255))[int(id/10)]
  if id%10==1:
    fill_rect(x+int(15*scale),y+int(5*scale),int(20*scale),int(30*scale),couleur)
    fill_rect(x+int(20*scale),y+int(35*scale),int(10*scale),int(15*scale),(220,120,30))

  if id%10==2:
    fill_rect(x+int(5*scale),y+int(5*scale),int(40*scale),int(10*scale),couleur)
    fill_rect(x+int(20*scale),y+int(15*scale),int(10*scale),int(30*scale),(220,120,30))

  if id%10==3:
    fill_rect(x+int(20*scale),y,int(25*scale),int(10*scale),couleur)
    fill_rect(x+int(30*scale),y+int(10*scale),int(15*scale),int(10*scale),couleur)
    fill_rect(x+int(20*scale),y+int(10*scale),int(10*scale),int(35*scale),(220,120,30))

  if id%10==4:
    fill_rect(x+int(15*scale),y+int(5*scale),int(20*scale),int(20*scale),couleur)
    fill_rect(x+int(20*scale),y+int(25*scale),int(10*scale),int(25*scale),(220,120,30))


def bouger_inv():
  global select,selectY,drawed_inv
  if not open_inv:
    return
  for i in range(18):
    if keydown(i+12):
      if keydown(KEY_OK):
        inv[int(i/6)][i%6],inv[selectY][select]=inv[selectY][select],inv[int(i/6)][i%6]
      else:
        selectY=int(i/6)
        select=i%6
  for i in range(4):
    if keydown(i):
      select=(select+(-1,0,0,1)[i])%6
      selectY=(selectY+(0,-1,1,0)[i])%3

  drawed_inv=0
  draw_inv()

while True:
  draw()
  sleep(0.2)

  if keydown(KEY_HOME):
    drawed_inv=0
    open_inv=1-open_inv
  if open_inv:
    continue

  if p.y<3:
    if blocks[map[(p.y+1)%4][p.x%max_map]][3]==1 and p.y<3:
      p.y+=1
  if map[p.y][p.x%max_map]==14:
    vie-=10-(5*(vie<=armure))

  for i in range(6):
    if keydown(12+i):
      select=i

  if keydown(KEY_OK):
    if 0<inv[0][select%6]<20:
      if map[(p.y+direction[1])%4][(p.x+direction[0])%max_map] in (0,13,14):
        map[(p.y+direction[1])%4][(p.x+direction[0])%max_map]=inv[0][select]
    else:
      casser(inv[0][select%6])

  if keydown(KEY_UP) and (map[(p.y+1)%4][p.x%max_map]!=0 or p.y==3):
    p.move(0,-1)
  if keydown(KEY_DOWN):
    p.move(0,1)
  if keydown(KEY_LEFT):
    p.move(-1,0)
  if keydown(KEY_RIGHT):
    p.move(1,0)

#COMMENT JOUER: 
#1) On se deplace avec les fleches.

#2) On peut changer la direction du
# regard en appuyant sur le bouton off
# et la fleche voulue. 

#3) On peut ouvrir et fermer l'inventaire
# avec la touche "home"

#4)On selectionne quelque chose dans l'inventaire avec la touche correspondante parmi les trois premieres lignes du clavier.

#5)Pour changer le place d'un outil on selectionne cet outil, on appuie sur "'OK" et en même temps on appuie sur la touche correspondante à la case où vous voulez qu'il arrive.

#6)