pong.py

Created by fedyna-kevin

Created on August 10, 2020

4.83 KB


from ion import keydown
from time import *
from random import randint
from kandinsky import draw_string, fill_rect
from math import cos,sin,radians

try:
    from kandinsky import get_keys
    clr = (192, 53, 53)
except:
    clr = (255,183,52)

def start():
    fill_rect(0,0,320,222,(24,)*3)
    draw_string("PONG",140,50,(255,)*3,(24,)*3)
    draw_string("nsi.xyz",125,70,(180,)*3,(24,)*3)
    j = 0
    d = 1
    while not (keydown(4) or keydown(52)):
        draw_string("1 joueur",120,110,1-j and clr or (180,)*3,(24,)*3)
        draw_string("Facile",50,130, d==0 and clr or (180,)*3,(24,)*3)
        draw_string("Moyen",120,130, d==1 and clr or (180,)*3,(24,)*3)
        draw_string("Difficile",180,130, d==2 and clr or (180,)*3,(24,)*3)
        draw_string("2 joueurs",115,160,j and clr or (180,)*3,(24,)*3)
        if keydown(1) or keydown(2):
            j = 1-j
            sleep(0.12)
        if keydown(0) and not j:
            d = (d-1) % 3
            sleep(0.12)
        if keydown(3) and not j:
            d = (d+1) % 3
            sleep(0.12)
    fill_rect(0,0,320,222,(24,)*3)
    fill_rect(30,18,260,2,(255,)*3)
    fill_rect(30,201,260,2,(255,)*3)
    return j,d

def rebond(a,b,f=12):
    angle = (-a+2*b)%360
    if b == 90:
        return (180*(90<angle<270)-(45-(45/12)*(abs(f-24*(not 90<angle<270)))))%360
    else:
        return angle

def deplacement(angle,x,y):
    dx = cos(radians(angle))
    dy = sin(radians(angle))
    f = 1/max(abs(dx),abs(dy))
    return x+dx*f,y-dy*f

def difficulties(d, angle):
    angle = abs((90 - ((angle + 90) % 180)) / 90 * 10)
    if d == 0:
        if angle > 2.5 and randint(1, 5) % 2:
            dist = 15
        else:
            dist = 3
    elif d == 1:
        if angle > 2.5 and randint(1, 5) == 2:
            dist = 15
        else:
            dist = 6
    elif d == 2:
        if angle > 2.5 and randint(1, 8) == 2:
            dist = 15
        else:
            dist = 9
    return int(angle) + dist

def ia(x,y,angle,o):
    global xf,yf
    if not xf and not yf:
        while 33<x<287:
            x,y = deplacement(angle,x,y)
            if not(21<y<200):
                angle = rebond(angle,0)
                x,y = deplacement(angle,x,y)
        xf,yf = x,y
    return 1*(yf/(o+12)>1 and o<177)-1*(yf/(o+12)<1 and o>20)

def move(x, y, dy):
    fill_rect(x,y+24*(dy != 1),3,1,(24,)*3)
    y += dy
    fill_rect(x,y+24*(dy == 1),3,1,(255,)*3)
    return y

def jeu(pvp, d):
    global xf,yf
    pt1, pt2 = 0, 0
    begin = 0
    while pt1 != 11 and pt2 != 11:
        xf, yf = 0, 0
        angle = 180*begin
        x = 160
        y = 111
        j = 99
        up, do = 1+pvp*29 , 2+pvp*34
        o = 99
        err = difficulties(d, angle)
        fill_rect(30,j,3,24,(255,)*3)
        fill_rect(287,o,3,24,(255,)*3)
        for i in range(21):
            if i != 10:
                fill_rect(i*15+5, 4, 10, 10, i+1 <= pt1 and (255, 0, 0) or i >= 21-pt2 and (0,0,255) or (180,)*3)
            else:
                fill_rect(i*15+3, 2, 14, 14, 11 in (pt1, pt2) and clr or (180,)*3)
        sleep(2)
        while 1:
            depart = monotonic()
            while monotonic()<depart + 0.002 - 0.0005*pvp:
                if pvp:
                    if keydown(34) and o > 20:
                        o = move(287, o, -1)
                    if keydown(40) and o < 176:
                        o = move(287, o, 1)
                else:
                    if not 90 < angle < 270 and not(o+12-err<yf<o+12+err):
                        o = move(287, o, ia(x,y,angle,o))
                if keydown(up) and j > 20:
                    j = move(30, j, -1)
                if keydown(do) and j < 176:
                    j = move(30, j, 1)

            fill_rect(int(x)-1,int(y)-1,3,3,(24,)*3)
            x,y = deplacement(angle,x,y)
            if not(21<y<200):
                angle = rebond(angle,0)
                x,y = deplacement(angle,x,y)
            if 30<x<34 and j<=y<=j+24:
                xf,yf = 0,0
                angle = rebond(angle,90,y-j)
                err = difficulties(d, angle)
                x,y = deplacement(angle,x,y)
            if 283<x<287 and o<=y<=o+24:
                xf,yf = 0,0
                angle = rebond(angle,90,y-o)
                err = difficulties(d, angle)
                x,y = deplacement(angle,x,y)
            if 30>x:
                pt2 += 1
                begin = 1-begin
                fill_rect(30, j, 3, 25, (24,) * 3)
                fill_rect(287, o, 3, 25, (24,) * 3)
                break
            if 287<x:
                pt1 += 1
                begin = 1 - begin
                fill_rect(30, j, 3, 25, (24,) * 3)
                fill_rect(287, o, 3, 25, (24,) * 3)
                break
            fill_rect(int(x)-1,int(y)-1,3,3,(255,)*3)
    draw_string("Victoire du joueur "+str(1+(pt2 == 11)),60,100,clr,(24,)*3)
    sleep(3)

r = 1
while r:
    jeu(*start())

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our <a href="https://www.numworks.com/legal/cookies-policy/">cookies policy</a>.