Advertisement
Benkex

Game 3.0

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