-
-
Save Pf-16/1f6f09b453cb21a683c1324d1ec0fce1 to your computer and use it in GitHub Desktop.
a
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from math import * |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Tetris NW | |
# par Robert V. & Fedyna K. | |
from ion import keydown | |
from kandinsky import * | |
from random import randint | |
from time import * | |
from math import sqrt,log | |
parametres = ("Jouer","Niveau","Vision","Grille","nsi.xyz") | |
options = (0,(1,16,42),(0,1,2,3),(0,1),0) | |
reglages = ["",1,2,0,""] | |
color = ((4<<5,6<<5,7<<5),(7<<5,4<<5,6<<5),(6<<5,7<<5,4<<5),(6<<5,6<<5,6<<5),(7<<5,6<<5,4<<5),(6<<5,4<<5,7<<5),(4<<5,7<<5,6<<5)) | |
formes = ([(1,1,2,1)],[(1,2,1),(0,0,1)],[(0,2,1),(1,1,0)],[(2,2),(2,2)],[(1,2,1),(0,1,0)],[(1,2,1),(1,0,0)],[(1,2,0),(0,1,1)]) | |
gl = [1,0,0] | |
try: | |
get_keys() | |
os = (192,53,53) | |
except: | |
os = (255,183,52) | |
fill_rect(74,0,2,222,os) | |
fill_rect(246,0,2,222,os) | |
draw_string("TETRIS",7,2,(120,120,120)) | |
for i in range(7): | |
fill_rect(3+10*i,25,8,8,color[i]) | |
def menu(c): | |
y,p = 40,0 | |
score() | |
for i in range(13): | |
fill_rect(76+i*14,0,2,222,(240,240,240)*(reglages[3]==1)+(255,255,255)*(reglages[3]==0)) | |
fill_rect(248,0,72,100,(255,255,255)) | |
for i in parametres: | |
draw_string(i,37 - len(i)*5,y,(120,120,120)*(p != c)+os*(p == c)) | |
if options[p] != 0: | |
op = "" | |
for j in options[p]: | |
op += str(j) | |
x = 37 - len(op)*5 - round(5*len(options[p]) / 2) | |
for j in options[p]: | |
draw_string(str(j),x,y+20,(196,196,196)*(j != reglages[p])+os*(j == reglages[p])) | |
x += 15+10*(len(str(j))-1) | |
y += 20 | |
p += 1 | |
y += 26 | |
def nav(): | |
k,c = 0,0 | |
menu(c) | |
while k != 5: | |
draw_string("Lignes", 253, 138, (120, 120, 120)) | |
draw_string("Score", 261, 184, (120, 120, 120)) | |
k = getKey() | |
if k in (4,52): | |
engine() | |
if k in (1,2): | |
c = c+(k == 2) - (k == 1) | |
c = c*(0 < c < len(reglages))+(len(reglages)-1)*(c < 0) | |
menu(c) | |
if k in (0,3): | |
if reglages[c] != "": | |
i = options[c].index(reglages[c]) | |
j = i+1*(k == 3) - 1*(k == 0) | |
j = j*(0 < j < len(options[c]))+(len(options[c])-1)*(j < 0) | |
reglages[c] = options[c][j] | |
menu(c) | |
def score(li=0, i=0): | |
gl[1] += li | |
gl[2] += gl[0]*(25*li+25*2**max(li-1,0))*(li!=0)+gl[0]*i | |
gl[0] = max(round(sqrt(gl[2] + (10 * reglages[1]) ** 2 ) / 10), reglages[1]) | |
fill_rect(270,108,30,22,(120, 120, 120)) | |
draw_string(str(gl[0]),284-5*len(str(gl[0])),110,(255,255,255),(120,120,120)) | |
draw_string(str(gl[1]),284-5*len(str(gl[1])),158,os) | |
draw_string(str(gl[2]),284-5*len(str(gl[2])),204,os) | |
def rlen(l): | |
return range(len(l)) | |
def ancr(piece): | |
for i in rlen(piece[1]): | |
for j in rlen(piece[1][i]): | |
if piece[1][i][j] == 2: | |
return piece[0][0]-14*j, piece[0][1]-14*i | |
def getKey(): | |
while True: | |
for i in range(53): | |
if keydown(i): | |
while keydown(i): | |
pass | |
return i | |
def draw_tetro(piece,clr=-1): | |
if clr == -1: | |
clr = piece[2] | |
x,y = ancr(piece) | |
for i in rlen(piece[1]): | |
for j in rlen(piece[1][i]): | |
if piece[1][i][j]: | |
fill_rect(x+14*j+1,y+14*i+1,12,12,clr) | |
def tourner(piece,s,t=0): | |
if not t: | |
draw_tetro(piece,(248,252,248)) | |
if s == "h": | |
piece[1] = list(zip(*piece[1][::-1])) | |
if s == "a": | |
piece[1] = list(zip(*(list(i)[::-1] for i in piece[1]))) | |
if not t: | |
draw_tetro(piece) | |
def move(piece,x=0,y=0): | |
draw_tetro(piece, (248, 252, 248)) | |
piece[0][0] += x*14 | |
piece[0][1] += y*14 | |
draw_tetro(piece) | |
def test_rot(piece,s): | |
x,y = ancr(piece) | |
blocs = [] | |
for i in rlen(piece[1]): | |
for j in rlen(piece[1][i]): | |
if piece[1][i][j]: | |
blocs += [[x+14*j,y+14*i]] | |
tourner(piece,s,1) | |
x,y = ancr(piece) | |
for i in rlen(piece[1]): | |
for j in rlen(piece[1][i]): | |
if not [j*14+x,i*14+y] in blocs: | |
if not(77<=x+14*j<=231) or not(11<=y+14*i<=207) or get_pixel(x+7+14*j,y+7+14*i) != (248,252,248): | |
tourner(piece,"a"*(s=="h")+"h"*(s=="a"),1) | |
return 1 | |
tourner(piece,"a"*(s=="h")+"h"*(s=="a"),1) | |
return 0 | |
def collision(d,piece): | |
x,y = ancr(piece) | |
for i in rlen(piece[1]): | |
for j in rlen(piece[1][i]): | |
if piece[1][i][j]: | |
if d in (0,3) and ((0<=j+(d==3)-(d==0)<=len(piece[1][i])-1 and not piece[1][i][j+(d==3)-(d==0)]) or (j,d) in ((0,0),(len(piece[1][i])-1,3))): | |
if get_pixel(x+7+14*(j+(d==3)-(d==0)),y+7+14*i) != (248,252,248) or x+((j+1)*14)*(d!=0) in [77,245]: | |
return 1 | |
if d == 2 and ((i != len(piece[1])-1 and not piece[1][i+1][j]) or (i == len(piece[1])-1 and piece[1][i][j])): | |
if get_pixel(x+7+14*j,y+7+14*(i+1)) != (248,252,248) or y+i*14 == 207: | |
return 1 | |
return 0 | |
def engine(): | |
global gl | |
if reglages[2]: | |
tetrominos = [] | |
for i in range(reglages[2]): | |
chx = randint(0, 6) | |
tetrominos += [[[280, 2+i*32], formes[chx], color[chx]]] | |
while get_pixel(154,18) == (248,252,248): | |
chx = randint(0, 6) | |
if reglages[2]: | |
for tet in tetrominos: | |
draw_tetro(tet,(248,252,248)) | |
tetromino = [[147, 11],tetrominos[0][1],tetrominos[0][2]] | |
tetrominos = [tetrominos[i+1] for i in range(reglages[2]-1)] + [[[0, 0], formes[chx], color[chx]]] | |
for i in range(reglages[2]): | |
tetrominos[i][0] = [280, 2+i*32] | |
for tet in tetrominos: | |
draw_tetro(tet) | |
else: | |
tetromino = [[147, 11], formes[chx], color[chx]] | |
draw_tetro(tetromino) | |
chute = 0.120 | |
while 1: | |
depart = monotonic() | |
while monotonic() < depart+round(-0.1945871*log(gl[0])+1.01122,3): | |
if keydown(0) and not collision(0, tetromino): | |
move(tetromino, x=-1) | |
sleep(0.120) | |
if keydown(3) and not collision(3,tetromino): | |
move(tetromino,x=1) | |
sleep(0.120) | |
if keydown(2): | |
sleep(chute) | |
chute /= 2 | |
score(i=1) | |
break | |
chute = 0.120 | |
if keydown(16) and not test_rot(tetromino,"h"): | |
sleep(0.160) | |
tourner(tetromino,"h") | |
if keydown(17) and not test_rot(tetromino,"a"): | |
sleep(0.160) | |
tourner(tetromino,"a") | |
if collision(2,tetromino): | |
break | |
score(i=1) | |
move(tetromino,y=1) | |
lignes = [] | |
for i in range(214,4,-14): | |
verif = 0 | |
for j in range(84,252,14): | |
verif += (get_pixel(j,i) != (248,252,248)) + 2*(get_pixel(j,i) == (248,252,248)) | |
if verif == 12: | |
lignes += [i-7] | |
if verif == 24: | |
stop = i-7 | |
break | |
if lignes: | |
score(li=len(lignes)) | |
for c in range(7): | |
for i in lignes: | |
for j in range(77,245,14): | |
fill_rect(j+1,i+1,12,12,not c%2 and (248,252,248) or os) | |
sleep(0.2*round(-0.1945871*log(gl[0])+1.01122,3)) | |
lignes = [lignes[i]+i*14 for i in rlen(lignes)] | |
for i in lignes: | |
for y in range(i,stop-14,-14): | |
for x in range(77,245,14): | |
fill_rect(x+1,y+1,12,12,get_pixel(x+7,y-7)) | |
fill_rect(120,100,80,42,os) | |
draw_string("PERDU",135,102,(248,252,248),os) | |
draw_string(str(gl[2]),160-5*len(str(gl[2])),122,(248,252,248),os) | |
getKey() | |
gl = [1, 0, 0] | |
fill_rect(77, 11, 168, 210, (248, 252, 248)) | |
fill_rect(248, 0, 72, 222, (248, 252, 248)) | |
nav() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment