Nusrat_Ullah

Random Game

Aug 18th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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