Advertisement
Benkex

Game 2.0

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