Benkex

Game 3.1 new design

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