Advertisement
Benkex

Game 4.0 + black design

Aug 18th, 2019
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.00 KB | None | 0 0
  1. from tkinter import *
  2. from math import *
  3. from time import time
  4. from random import *
  5.  
  6. ##############################
  7. #Defining variables
  8.  
  9. #~Nenyúljhozzá részleg
  10.  
  11. timeborder=0.03
  12.  
  13. r=3
  14. cr=40
  15. scr=30
  16. br=5
  17. d=br
  18. kulso=500
  19.  
  20. x, y = 350, 350
  21. change=90.0
  22. point=[]
  23.  
  24. gosmaller=90
  25. gosmperiod=35
  26. getpts=[]
  27. delay=60
  28. acc=200
  29.  
  30. color='red'
  31. simplecolor='black'
  32. fullcolor='#00ffff'
  33. outlinecolor='white'
  34. pressing=False
  35. first=True
  36. shootnow=0
  37. direction=0
  38. shoots=[]
  39.  
  40. #*****************************************
  41. #~Hozzányúlhatsz részleg
  42.  
  43. db=20 # töltények száma
  44. plus=5# lőtorony forgási sebesség
  45.  
  46. enenum=20 # enemyk száma
  47. blackene=3 # fekete enemyk száma
  48. enespeed=0.7 # enemyk sebessége
  49. startdist=500 # első enemy milyen korán jön
  50. between=50# enemyk közötti táv
  51.  
  52. #Ezekkel vicces játszani ;)
  53. min=20 # enemyk mininum mérete
  54. max=40 # enemyk maximum mérete
  55.  
  56. ########
  57. eredb=db
  58. ##############################
  59. #Defining good functions
  60.  
  61. def cd(which, i):
  62.     if db<=15: vmi=db
  63.     else: vmi=15
  64.     if not which: #tehát x coord
  65.         return x+cos(radians(360*(i/vmi) -change))*cr
  66.     else: #tehát y coord
  67.         return y+sin(radians(360*(i/vmi) -change))*cr
  68.        
  69. def cdp(which, i, rad):
  70.     if db<=15: vmi=db
  71.     else: vmi=db-15
  72.     if not shootnow: chan=change+360/(db-15)/2
  73.     else: chan=change
  74.     if not which: #tehát x coord
  75.         return x+cos(radians(360*(i/vmi) -chan))*rad
  76.     else: #tehát y coord
  77.         return y+sin(radians(360*(i/vmi) -chan))*rad
  78.        
  79. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  80.  
  81. def rotate(dir):
  82.     global pressing, direction
  83.     direction=dir
  84.     pressing=True
  85.        
  86. def stop_rot():
  87.     global pressing
  88.     pressing=False
  89.    
  90. def eneinside(xy):
  91.     if xy[0] >= 0 and xy[0] <= 700 and xy[1] >= 0 and xy[1] <= 700:
  92.         return True
  93.     else: return False
  94.    
  95. def ng():
  96.     #global newgame
  97.     #newgame=True
  98.     global change, alive
  99.     rajz.delete(ALL)
  100.     change=90.0
  101.     setnewgame()
  102.     alive=True
  103.    
  104. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  105.    
  106. def fire():
  107.     global shoots, alive, enedied, lab, shootnow
  108.     if db==1 or not alive:
  109.         return 0
  110.     shootnow=True
  111.     shoots.append([rajz.create_line(cdp(0, 0, cr+d), cdp(1, 0, cr+d), cdp(0, 0, kulso), cdp(1, 0, kulso), fill='#ff0000', width=br), time()])
  112.     shootnow=False
  113.    
  114.     for enemy in enearr:
  115.         enexy=[350+cos(enemy[1]) *enemy[2], 350+sin(enemy[1])*enemy[2]]
  116.         diff=radians(change*-1) - enemy[1]
  117.         if abs(sin(diff)*enemy[2])< min and eneinside(enexy) and cos(diff)>0 and enemy[3]==1:
  118.             enemy[3]=0
  119.            
  120.     changepts(db-1)
  121.    
  122. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  123.    
  124. def changepts(how):
  125.     global point, db
  126.     for pt in point:
  127.         rajz.delete(pt)
  128.     db=how
  129.     if db<=15:
  130.         point=[rajz.create_oval(cd(0, i)-r, cd(1, i)-r, cd(0, i)+r, cd(1, i)+r, width=r, outline=outlinecolor) for i in range(db)]
  131.     else:
  132.         point=[rajz.create_oval(cd(0, i)-r, cd(1, i)-r, cd(0, i)+r, cd(1, i)+r, width=r, outline=outlinecolor) for i in range(15)]
  133.         point+=[rajz.create_oval(cdp(0, i, scr)-r, cdp(1, i, scr)-r, cdp(0, i, scr)+r, cdp(1, i, scr)+r, width=r, outline=outlinecolor) for i in range(db-15)]
  134.            
  135.     rad=br
  136.     rajz.coords(point[0], cd(0, 0)-rad, cd(1, 0)-rad, cd(0, 0)+rad, cd(1, 0)+rad)
  137.     rajz.itemconfig(point[0], outline=color, width=br)
  138.    
  139. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  140.    
  141. def randdeg():
  142.     return uniform(0, 2*pi)
  143.  
  144. def help(i):
  145.     global min, max
  146.     r=radians(uniform(0, 90)+i*90)
  147.     d=uniform(min, max)
  148.     #alseg.append([r, d])
  149.     enedeg=deg[ind]
  150.     if first:
  151.         enedist=dist[ind]
  152.     else:
  153.         enedist=enearr[ind][2]
  154.     kx, ky= x+cos(enedeg)*enedist, y+sin(enedeg)* enedist
  155.     a, b = cos(r)*d+kx, sin(r)*d+ky
  156.     return [a, b]
  157.    
  158. def getshape(index):
  159.     global ind
  160.     ind=index
  161.     return help(0)+help(1)+help(2)+help(3)
  162.    
  163. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  164.  
  165. def calcDeg(start, Ln):
  166.     def easy(x):
  167.         if x >= 0:
  168.             return 1
  169.         elif x < 0:
  170.             return -1
  171.     """def correct(x):
  172.         if x<0:
  173.             return 360+x
  174.         else:
  175.             return x"""
  176.     try:
  177.         c = (Ln[2]-Ln[0])/hypot(Ln[1]-Ln[3], Ln[0]-Ln[2])
  178.         s = (Ln[3]-Ln[1])/hypot(Ln[1]-Ln[3], Ln[0]-Ln[2])
  179.     except:
  180.         c, s = 0, 0
  181.     recovery=acos(c)*easy(s)-radians(start)
  182.     dgc=acos(cos(recovery))
  183.     elojel=sin(recovery)
  184.     return dgc*easy(elojel)
  185.  
  186. #~~~~~~~~~~~~~~~~~~~~~~~~~~
  187.  
  188. def animation():
  189.     for enemy in enearr:
  190.         if enemy[3]<1:
  191.             enexy=[350+cos(enemy[1]) *enemy[2], 350+sin(enemy[1])*enemy[2]]
  192.             if (enemy[4]==simplecolor and enemy[3] > -gosmperiod) or (enemy[4]==fullcolor and enemy[3] > -gosmperiod/2):
  193.                 eneshape= [[rajz.coords(enemy[0])[2*j+i] for i in range(2)] for j in range(4)]
  194.                 enedegs=[calcDeg(0, enexy+eneshape[i]) for i in range(4)]
  195.                 eneptdists=[hypot(enexy[0]- eneshape[i][0], enexy[1]-eneshape[i][1])* gosmaller/100 for i in range(4)]
  196.                 def shape(i):
  197.                     return [enexy[0]+ cos(enedegs[i])* eneptdists[i], enexy[1]+ sin(enedegs[i])*eneptdists[i]]
  198.                 newshape=[]
  199.                 for i in range(4):
  200.                     newshape+=shape(i)
  201.                 rajz.coords(enemy[0], newshape)
  202.                 enemy[3]-=1
  203.             else:
  204.                 rajz.coords(enemy[0], enexy+ enexy+enexy+enexy)
  205.                 enemy[3]=2
  206.                 if enemy[4]==fullcolor:
  207.                     for i in range(randint(2, 5)):
  208.                         getpts.append([ rajz.create_oval(enexy[0]-r, enexy[1]-r, enexy[0]+r, enexy[1]+r, width=r, outline=outlinecolor), -i*delay, time(), enemy[1]+pi, rajz.coords(enemy[0])[:2]])
  209.        
  210.         rem=[]
  211.         if len(getpts)>0:
  212.             for pt in getpts:
  213.                 t=pow(time()-pt[2], 2)
  214.                 npx, npy = pt[4][0]+ cos(pt[3])*acc*t, pt[4][1]+sin(pt[3])*acc*t
  215.                 pdist=hypot(350-npx, 350-npy)
  216.                 if pt[1]<0:
  217.                     pt[1]+=1
  218.                     pt[2]=time()
  219.                 elif pdist > cr:
  220.                     rajz.coords(pt[0], npx-r, npy-r, npx+r, npy+r)
  221.                 else:
  222.                     changepts(db+1)
  223.                     rem.append(pt)
  224.                     rajz.delete(pt[0])
  225.             for item in rem:
  226.                 getpts.remove(item)
  227.                
  228. def stop(arg):
  229.     f=open('sth.txt', 'w')
  230.     f.write(str(arg))
  231.     f.close()
  232.     while 1:
  233.         pass
  234.                
  235. """hatar1=2
  236. hatar2=2
  237.  
  238. def mozgat():
  239.     global alak
  240.     for i in range(4):
  241.         r=alseg[i][0]+uniform(-hatar1, hatar1)
  242.         d=alseg[i][1]+uniform(-hatar2, hatar2)
  243.         if r>90+i*90:
  244.             r=90+i*90
  245.         elif r<i*90:
  246.             r=i*90
  247.         if d < min:
  248.             d=min
  249.         elif d > max:
  250.             d=max
  251.         a, b = cos(r)*d+x, sin(r)*d+y
  252.         alak[i][0]=a
  253.         alak[i][1]=b"""
  254.  
  255. ##############################
  256. #Setting program
  257.  
  258. ablak=Tk()
  259.  
  260. rajz=Canvas(width=700, height=700, bg=simplecolor)
  261. rajz.grid(columnspan=2)
  262.  
  263. def setnewgame():
  264.     global centralline, deg, dist, enearr, first
  265.     first=True
  266.     changepts(eredb)
  267.  
  268.     centralline=rajz.create_line(350, 350, 350, 350-cr, fill='red', width=4)
  269.  
  270.     deg=[randdeg() for i in range(enenum)]
  271.     dist=[startdist+i*between for i in range(enenum)]
  272.     shuffle(dist)
  273.     enearr=[[rajz.create_polygon( getshape(i), fill=simplecolor, outline=outlinecolor), deg[i],dist[i], 1, simplecolor] for i in range(enenum)]
  274.     for i in range(blackene):
  275.         enearr[i][4]=fullcolor
  276.         rajz.itemconfig(enearr[i][0], fill=fullcolor)
  277.     first=False
  278.  
  279. dir=["Balra", "Jobbra"]
  280. dirbut=[]
  281. for i in range(2):
  282.     dirbut.append(Button(text=dir[i], width=14, height=3))
  283.     dirbut[i].grid(column=i, row=1)
  284.     dirbut[i].bind('<ButtonPress-1>', lambda event, i=i: rotate(i))
  285.     dirbut[i].bind('<ButtonRelease-1>', lambda event: stop_rot())
  286.  
  287. firebut=Button(text='FIRE!!!!', command=fire, width=20, height=3)
  288. firebut.grid(row=2, columnspan=2)
  289.  
  290. newgamebut=Button(text='New Game', command=ng, width=20, height=3)
  291. newgamebut.grid(row=3, columnspan=2)
  292.  
  293. alive=True
  294. rogzit=time()
  295. lab=Label()
  296. lab.grid(columnspan=2)
  297.  
  298. setnewgame()
  299.  
  300. #~~~~~~~~~Main loop~~~~~~~~~~~
  301. """
  302. STATISZTIKA:
  303. Alap várási idő: 0.02 sec
  304. Iterációk 0.025 sec feletti idővel: 45%
  305. Iterációk 0.03 sec feletti idővel: 14%
  306. Iterációk 0.035 sec feletti idővel: 5%
  307.  
  308. Ebbe beleszámítandó az iterációnkénti
  309. időellenőrzés
  310. """
  311. while alive:
  312.     while time()-rogzit < timeborder:
  313.         pass
  314.     rogzit=time()
  315.     animation()
  316.     ablak.update()
  317.     if len(shoots)!=0:
  318.         for sh in shoots:
  319.             kul=time()-sh[1]
  320.             if kul <= 1:
  321.                 ertek=str(hex(int(255- 255*kul)))[2:]
  322.                 if len(ertek)==1:
  323.                     ertek='0'+ertek
  324.                 #rajz.itemconfig(sh[0], fill='#ff'+ertek+ertek)
  325.                 rajz.itemconfig(sh[0], fill='#'+ertek+'0000')
  326.             else:
  327.                 rajz.delete(sh[0])
  328.                 shoots.remove(sh)
  329.     if pressing:
  330.         if direction:
  331.             plus=abs(plus)*-1
  332.         else:
  333.             plus=abs(plus)
  334.         change+=plus
  335.         for i in range(db):
  336.             if i==0: rad=br
  337.             else: rad=r
  338.             if db<=15:
  339.                 rajz.coords(point[i], cd(0, i)-rad, cd(1, i)-rad, cd(0, i)+rad, cd(1, i)+rad)
  340.             else:
  341.                 if i<=14:
  342.                     rajz.coords(point[i], cd(0, i)-rad, cd(1, i)-rad, cd(0, i)+rad, cd(1, i)+rad)
  343.                 else:
  344.                     rajz.coords(point[i], cdp(0, i, scr)-rad, cdp(1, i, scr)-rad, cdp(0, i, scr)+rad, cdp(1, i, scr)+rad)
  345.         rajz.coords(centralline, 350, 350, cd(0, 0), cd(1, 0))
  346.    
  347.     h=0
  348.     for enemy in enearr:
  349.         if enemy[2]<cr:
  350.             alive=False
  351.             break
  352.         elif enemy[3]==1:
  353.             enemy[2] -= enespeed
  354.             rajz.coords(enemy[0], getshape(h))
  355.         h+=1
  356.     if not alive:
  357.         rajz.delete(ALL)
  358.         rajz.create_text(350, 350, text='GAME OVER')
  359.         """for i in [0,1]:
  360.             dirbut[i].grid_forget()
  361.         firebut.grid_forget()
  362.         newgamebut.grid(row=1, columnspan=2)
  363.        
  364.         newgame=False
  365.         while not newgame:
  366.             ablak.update()
  367.         rajz.delete(ALL)
  368.            
  369.         newgamebut.grid_forget()
  370.         for i in [0,1]:
  371.             dirbut[i].grid(column=i, row=1)
  372.         firebut.grid(row=2, columnspan=2)
  373.        
  374.         change=90.0
  375.         setnewgame()
  376.         alive=True"""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement