breakout.py
Created by
zecake
Created on
September 27, 2023
6.21 KB
from math import *
from random import *
from kandinsky import *
from ion import *
from time import *
default_config = [ 1 , 0 , 0 , 1 ]
wc , bl = color ( 90 , 90 , 90 ), color ( 0 , 0 , 0 )
wh = color ( 255 , 255 , 255 )
puc = color ( 240 , 240 , 0 )
themecols = ((( 0 , 1 , 2 , 3 , 4 , 5 ),( 0 , 1 , 2 , 3 , 4 , 5 )),(( 0 , 1 , 2 , 3 , 4 , 5 ),( 6 , 6 )),(( 8 , 8 ),( 7 , 7 )),(( 5 , 9 ),( 5 , 9 )),(( 0 , 1 , 2 , 2 , 1 ),( 0 , 1 , 2 , 2 , 1 )),(( 6 , 6 ),( 6 , 6 )),(( 0 , 0 ),( 0 , 0 )))
colors = (( 255 , 0 , 0 ),( 255 , 125 , 0 ),( 255 , 255 , 0 ),( 0 , 255 , 0 ),( 0 , 0 , 255 ),( 255 , 0 , 255 ),( 0 , 4 , 0 ),
( 200 , 200 , 200 ),( 150 , 150 , 150 ),( 255 , 100 , 255 ))
def game ( score , cg ):
fill_rect ( 0 , 0 , 320 , 240 , bl )
x , y , r = 158 , 150 , 0
cx , cy = 158 , 150
px , py = 158 , 146
padx = 160
pup = [ 160 , 240 ]
ppup = pup
padxn = padx
fill_rect ( 0 , 0 , 16 , 222 , wc )
fill_rect ( 304 , 0 , 16 , 222 , wc )
fill_rect ( 0 , 0 , 320 , 16 , wc )
defs = score
swap = 1
botr = 0
pc = [ 247 , 247 , 247 ]
predx = 160
lb = []
for yb in range ( 6 ):
for xb in range ( 13 ):
cb = themecols [ cg [ 0 ]][ 0 ]
cb = colors [ cb [ yb % len ( cb )]]
inc = themecols [ cg [ 0 ]][ 1 ]
inc = colors [ inc [ yb % len ( inc )]]
fill_rect ( 18 + xb * 22 , 50 + yb * 11 , 20 , 9 , cb )
fill_rect ( 19 + xb * 22 , 51 + yb * 11 , 18 , 7 , inc )
lb . append ([ 22 + xb * 22 , 55 + yb * 11 ])
print ( len ( lb ))
botb = lb [ 0 ]
d = 0.03
for i in range ( 3 ): draw_string ( str ( 3 - i ), 155 , 150 , wh , bl ); sleep ( 1 )
draw_string ( " " , 155 , 150 , wh , bl )
while True :
mt = monotonic ()
if cg [ 2 ] == 1 : pc = [ 240 * swap , 0 , 240 * (( swap + 1 ) % 2 )]
fill_rect ( ceil ( padxn ) - 16 , 200 , 32 , 4 , pc )
if padxn > padx : fill_rect ( floor ( padx ) - 16 , 200 , ceil ( padxn - padx ), 4 , bl )
if padxn < padx : fill_rect ( floor ( padxn ) + 17 , 200 , ceil ( padx - padxn ), 4 , bl )
padx = padxn
if ( swap or cg [ 2 ] != 1 ): padxn += ( 800 * d / 3 ) * ( int ( keydown ( KEY_RIGHT )) - int ( keydown ( KEY_LEFT )))
if not swap and cg [ 2 ] == 1 : padxn += ( 800 * d / 3 ) * ( int ( keydown ( KEY_SIX )) - int ( keydown ( KEY_FOUR )))
#if cg[2]==2:padxn=padx
rr = radians ( r )
predx = x + tan ( rr ) * ( 200 - y )
botr = degrees ( atan (( padxn - botb [ 0 ]) / ( 200 - botb [ 1 ]))) / 3
if abs ( botr ) > 13 :
botr = copysign ( 8 , botr )
botr = round ( botr )
if cg [ 2 ] == 2 and cos ( rr ) > 0 : padxn += copysign ( sqrt ( abs ( predx - padx + botr )), predx - padx + botr )
px , py = cx , cy
x += sin ( rr ) * 130 * d
c , pup , rdb = collisions ( x , y , pup , pc )
if c > 1 :
x +=- ( 130 * d ) * sin ( rr )
r = ( 360 - r ) % 360 + randrange ( - 15 , 15 ) / 10
if c > 2 :
score += c - 2
lb [ rdb ] = [ 0 , 0 ]
rdm = 0
botb = lb [ rdm ]
while botb [ 0 ] == 0 and rdm < 77 :
rdm += 1
botb = lb [ rdm ]
if c == 1 :
y -= ( 130 * d )
r = ( 360 - r ) % 360
swap = ( swap + 1 ) % 2
rr = radians ( r )
y += cos ( rr ) * ( 130 * d )
c , pup , rdb = collisions ( x , y , pup , pc )
if c > 1 :
y -= ( 130 * d ) * cos ( rr )
r = ( 180 - r ) % 360 + randrange ( - 20 , 20 ) / 10
if c > 2 :
score += c - 2
lb [ rdb ] = [ 0 , 0 ]
rdm = 0
botb = lb [ rdm ]
while botb [ 0 ] == 0 and rdm < 77 :
rdm += 1
botb = lb [ rdm ]
if c == 1 :
y -= ( 130 * d ) * cos ( rr )
r = ( 180 - r ) % 360
r = 180 - (( x - padx ) * 3 )
swap = ( swap + 1 ) % 2
cx , cy = ceil ( x ), ceil ( y )
fill_rect ( px , py , 4 , 4 , bl )
fill_rect ( cx , cy , 4 , 4 , wh )
d = monotonic () - mt
if cg [ 2 ] == 2 : d *= cg [ 3 ] + 1
if cg [ 1 ] == 1 :
pup [ 1 ] += 70 * d
fill_rect ( ceil ( pup [ 0 ]), ceil ( pup [ 1 ] - 70 * d ), 5 , 5 , bl )
if 204 > pup [ 1 ] > 196 and padx + 16 > pup [ 0 ] > padx - 20 :
pup [ 1 ] = 300
fill_rect ( ceil ( pup [ 0 ]), ceil ( pup [ 1 ]), 5 , 5 , puc )
#if d!=0:print(1/d)
padxn = min ( max ( padxn , 33 ), 287 )
draw_string ( " Score: " + str ( score ), 0 , - 2 , wh , wc )
if y > 220 : return False
if score >= 468 + defs : return True
def collisions ( xc0 , yc0 , cpup , cccp ):
xc0 , yc0 = ceil ( xc0 ), ceil ( yc0 )
hasCollided = False
db = 0
for t in range ( 4 ):
xc , yc = xc0 + ( t % 2 ) * 4 , yc0 + ( t // 2 ) * 4
cc = collision ( xc , yc , cccp )
if cc > 0 :
if cc > 2 :
db = int (( xc - 18 ) / 22 ) + int (( yc - 50 ) / 11 ) * 13
xc = xc - (( xc - 18 ) % 22 )
yc = yc - (( yc - 50 ) % 11 )
fill_rect ( xc , yc , 22 , 10 , bl )
if randrange ( 2 ) == 0 and cpup [ 1 ] > 230 :
cpup = [ xc + 8 , 115 ]
return cc , cpup , db
return 0 , cpup , db
def collision ( xc , yc , pcc ):
pixel = get_pixel ( xc , yc )
if pixel == wh :
return 0
if pixel == color ( pcc ):
return 1
if pixel == wc :
return 2
if pixel == bl :
return 0
if pixel == puc :
return - 1
return 3 + 2 * ( int ( - ( yc - 50 ) / 11 ) + 5 )
def menu ( conf ):
logo ( conf )
m = 0
themes = ( " Filled (Default) " , " Outlines " , " Gray " , " Pink " , " Reds " , " Void " , " Custom Theme " )
bol = ( " [ ] " , " [X] " )
modes = ( " Solo " , " Multi " , " Bot " )
while keydown ( 4 ): pass
while True :
draw_string ( " Play " , 30 , 80 , wh , bl )
draw_string ( " Theme: " , 30 , 105 , wh , bl )
draw_string ( " Power-Ups: " , 30 , 130 , wh , bl )
draw_string ( " Mode: " , 30 , 155 , wh , bl )
if conf [ 2 ] == 2 :
draw_string ( " Speed: " , 30 , 180 , wh , bl )
draw_string ( " x " + str ( conf [ 3 ] + 1 ), 100 , 180 , wh , bl )
draw_string ( str ( themes [ conf [ 0 ]]), 100 , 105 , wh , bl )
draw_string ( bol [ conf [ 1 ]], 140 , 130 , wh , bl )
draw_string ( modes [ conf [ 2 ]], 100 , 155 , wh , bl )
draw_string ( " > " , 15 , 80 + m * 25 , wh , bl )
if keydown ( 0 ) and ( m % 2 == 1 or m == 4 ):
while keydown ( 0 ): pass
conf [ m - 1 ] = max ( conf [ m - 1 ] - 1 , 0 )
logo ( conf )
fill_rect ( 100 , 105 , 200 , 20 , bl )
if keydown ( 3 ) and ( m % 2 == 1 or m == 4 ):
while keydown ( 3 ): pass
if m == 1 :
conf [ 0 ] = min ( conf [ 0 ] + 1 , 6 )
if m == 3 :
conf [ 2 ] = min ( conf [ 2 ] + 1 , 2 )
if m == 4 :
conf [ 3 ] = min ( conf [ 3 ] + 1 , 7 )
logo ( conf )
fill_rect ( 100 , 105 , 200 , 20 , bl )
if keydown ( 0 ) or keydown ( 3 ) and m == 2 :
if m == 2 :
conf [ 1 ] = ( conf [ 1 ] + 1 ) % 2
fill_rect ( 140 , 130 , 200 , 20 , bl )
while keydown ( 0 ) or keydown ( 3 ): pass
if keydown ( 2 ):
while keydown ( 2 ): pass
draw_string ( " " , 15 , 80 + m * 25 , wh , bl )
m = min ( m + 1 , 3 + int ( conf [ 2 ] > 1 ))
if keydown ( 1 ):
while keydown ( 1 ): pass
draw_string ( " " , 15 , 80 + m * 25 , wh , bl )
m = max ( m - 1 , 0 )
if keydown ( 4 ) and m == 0 :
if game ( 0 , conf ):
if game ( 468 , conf ):
draw_string ( " You Win! " , 125 , 150 , wh , bl )
sleep ( 3 )
logo ( conf )
def logo ( cfg ):
ll = (
( 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 ),
( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 ),
( 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 ),
( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 ),
( 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 0 ))
fill_rect ( 0 , 0 , 320 , 222 , bl )
for yl , line in enumerate ( ll ):
bcl = themecols [ cfg [ 0 ]][ 0 ]
bcl = colors [ bcl [ yl % len ( bcl )]]
icl = themecols [ cfg [ 0 ]][ 1 ]
icl = colors [ icl [ yl % len ( icl )]]
for xl , sq in enumerate ( line ):
if sq == 1 :
fill_rect ( 21 + xl * 9 , 20 + yl * 7 , 8 , 6 , bcl )
fill_rect ( 22 + xl * 9 , 21 + yl * 7 , 6 , 4 , icl )
menu ( default_config )