当前位置:   article > 正文

37行代码实现一个简单的打游戏AI_最简单的ai代码

最简单的ai代码

不废话,直接上码,跟神经网络一点关系都没有,这37行代码只能保证电脑的对敌牺牲率是1:10左右,如果想手动操控,注释掉autopilot后边的代码即可。

哪个大神有兴趣可以用tensorflow或者serpentai来玩一下这个游戏。

  1. # coding=utf8
  2. from random import randint as rint
  3. import pygame
  4. from pygame.locals import *
  5. class MySprite(pygame.sprite.Sprite):
  6. def __init__(self):
  7. pygame.sprite.Sprite.__init__(self)
  8. self.master_image = None
  9. self.frame = 0
  10. self.old_frame = -1
  11. self.frame_width = 1
  12. self.frame_height = 1
  13. self.first_frame = 0
  14. self.last_frame = 0
  15. self.columns = 1
  16. self.last_time = 0
  17. self.direction = 0
  18. self.velocity = Point(0.0, 0.0)
  19. # X property
  20. def _getx(self):
  21. return self.rect.x
  22. def _setx(self, value):
  23. self.rect.x = value
  24. X = property(_getx, _setx)
  25. # Y property
  26. def _gety(self):
  27. return self.rect.y
  28. def _sety(self, value):
  29. self.rect.y = value
  30. Y = property(_gety, _sety)
  31. # position property
  32. def _getpos(self):
  33. return self.rect.topleft
  34. def _setpos(self, pos):
  35. self.rect.topleft = pos
  36. position = property(_getpos, _setpos)
  37. def load(self, filename, width, height, columns):
  38. self.master_image = pygame.image.load(filename).convert_alpha()
  39. self.frame_width = width
  40. self.frame_height = height
  41. self.rect = Rect(0, 0, width, height)
  42. self.columns = columns
  43. # try to auto-calculate total frames
  44. rect = self.master_image.get_rect()
  45. self.last_frame = (rect.width // width) * (rect.height // height) - 1
  46. def update(self, current_time, rate=30):
  47. # update animation frame number
  48. if current_time > self.last_time + rate:
  49. self.frame += 1
  50. if self.frame > self.last_frame:
  51. self.frame = self.first_frame
  52. self.last_time = current_time
  53. # build current frame only if it changed
  54. if self.frame != self.old_frame:
  55. frame_x = (self.frame % self.columns) * self.frame_width
  56. frame_y = (self.frame // self.columns) * self.frame_height
  57. rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)
  58. self.image = self.master_image.subsurface(rect)
  59. self.old_frame = self.frame
  60. def __str__(self):
  61. return str(self.frame) + "," + str(self.first_frame) + \
  62. "," + str(self.last_frame) + "," + str(self.frame_width) + \
  63. "," + str(self.frame_height) + "," + str(self.columns) + \
  64. "," + str(self.rect)
  65. # Point class
  66. class Point(object):
  67. def __init__(self, x, y):
  68. self.__x = x
  69. self.__y = y
  70. # X property
  71. def getx(self): return self.__x
  72. def setx(self, x): self.__x = x
  73. x = property(getx, setx)
  74. # Y property
  75. def gety(self): return self.__y
  76. def sety(self, y): self.__y = y
  77. y = property(gety, sety)
  78. def __str__(self):
  79. return "{X:" + "{:.0f}".format(self.__x) + \
  80. ",Y:" + "{:.0f}".format(self.__y) + "}"
  81. pygame.init()
  82. playerHealth = 100
  83. keys = [False, False, False, False]
  84. skybg = pygame.image.load("resources/images/skybg.jpg")
  85. missile = pygame.image.load("resources/images/bullet2.png")
  86. screen = pygame.display.set_mode((1024, 600))
  87. pygame.display.set_caption("SkyFight")
  88. timer = pygame.time.Clock()
  89. # warship sprite
  90. warship_group = pygame.sprite.Group()
  91. # enemy sprite
  92. chopper_group = pygame.sprite.Group()
  93. # player sprite
  94. player_group = pygame.sprite.Group()
  95. player = MySprite()
  96. player.load("resources/images/playerchopper.png", 173, 58, 4)
  97. player.position = 0, 350
  98. player_group.add(player)
  99. # player missile sprite
  100. missile_group = pygame.sprite.Group()
  101. # enemy missile sprite
  102. enemy_missile_group = pygame.sprite.Group()
  103. # warship missile group
  104. warship_missile_group = pygame.sprite.Group()
  105. # flame sprite
  106. flame_group = pygame.sprite.Group()
  107. def addNewFlame(position):
  108. flame = MySprite()
  109. flame.load("resources/images/flame.png", 64, 64, 4)
  110. flame.position = position
  111. flame_group.add(flame)
  112. # warship flame
  113. warship_flame_group = pygame.sprite.Group()
  114. def addNewWarshipFlame(position):
  115. warship_flame = MySprite()
  116. warship_flame.load("resources/images/warship_flame.png", 64, 64, 4)
  117. warship_flame.position = position
  118. warship_flame_group.add(warship_flame)
  119. badtimer = 100
  120. badtimer1 = 0
  121. missile_launched = 0
  122. missile_hit = 0
  123. missile_hit_warship = 0
  124. total_enemy_showedup = 0
  125. enemy_missile_launched = 0
  126. warship_health = 10
  127. # to make autopilot missile launch interval
  128. tickstart = []
  129. tickstart.append(pygame.time.get_ticks())
  130. # player move speed
  131. player_move_speed = 5
  132. while True:
  133. # start game ticks
  134. timer.tick(60)
  135. ticks = pygame.time.get_ticks()
  136. screen.fill(0)
  137. # draw background sky
  138. screen.blit(skybg, (0, 0))
  139. # add warship sprite (only one warship on the screen)
  140. if len(warship_group) == 0:
  141. warship = MySprite()
  142. warship.load("resources/images/warship.png", 350, 70, 1)
  143. warship.position = 1024, 500
  144. warship_group.add(warship)
  145. # adjust warship to come close to player
  146. if warship.X < player.X + 200:
  147. warship.X += 1
  148. elif warship.X > player.X + 200:
  149. warship.X -= 1
  150. # draw warship
  151. warship_group.update(ticks)
  152. warship_group.draw(screen)
  153. # warship launch missile
  154. for warship in warship_group:
  155. if len(warship_missile_group) == 0:
  156. if warship.X < 800:
  157. warship_missile = MySprite()
  158. warship_missile.load("resources/images/warship_missile.png", 32, 121, 1)
  159. warship_missile.position = warship.X + 160, warship.Y - 60
  160. warship_missile_group.add(warship_missile)
  161. # guide missile & change missile position
  162. for warship_missilex in warship_missile_group:
  163. warship_missilex.Y -= 1
  164. if warship_missilex.Y < -121:
  165. warship_missile_group.remove(warship_missilex)
  166. # warship missile & enemy collision detect
  167. collision = None
  168. collision = pygame.sprite.spritecollideany(
  169. warship_missilex, chopper_group)
  170. if collision != None:
  171. if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):
  172. chopper_group.remove(collision)
  173. flameposition = warship_missilex.position
  174. addNewFlame(flameposition)
  175. # warship missile & enemy missile collision detect
  176. collision = None
  177. collision = pygame.sprite.spritecollideany(
  178. warship_missilex, enemy_missile_group)
  179. if collision != None:
  180. if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):
  181. enemy_missile_group.remove(collision)
  182. flameposition = warship_missilex.position
  183. addNewFlame(flameposition)
  184. # warship missile & player missile collision detect
  185. collision = None
  186. collision = pygame.sprite.spritecollideany(
  187. warship_missilex, missile_group)
  188. if collision != None:
  189. if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):
  190. missile_group.remove(collision)
  191. flameposition = warship_missilex.position
  192. addNewFlame(flameposition)
  193. # warship missile & player collision detect
  194. collision = None
  195. collision = pygame.sprite.spritecollideany(
  196. warship_missilex, player_group)
  197. if collision != None:
  198. if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):
  199. playerHealth -= 10
  200. warship_missile_group.remove(warship_missilex)
  201. flameposition = warship_missilex.position
  202. addNewFlame(flameposition)
  203. # add random enenmy chopper
  204. badtimer -= 1
  205. if badtimer == 0:
  206. chopper = MySprite()
  207. chopper.load("resources/images/enemychopper.png", 173, 60, 4)
  208. chopper.position = 1024, rint(0, 400)
  209. chopper_group.add(chopper)
  210. total_enemy_showedup += 1
  211. badtimer = 150 - (badtimer1 * 2)
  212. if badtimer1 >= 35:
  213. badtimer1 = 35
  214. else:
  215. badtimer1 += 5
  216. # change enemy chopper position
  217. for chopper in chopper_group:
  218. chopper.X -= 2
  219. if chopper.X < -173:
  220. chopper_group.remove(chopper)
  221. # enemy chopper launch missile
  222. if chopper.X % 500 == 0:
  223. enemy_missile_launched += 1
  224. enemy_missile = MySprite()
  225. enemy_missile.load("resources/images/missile.png", 64, 16, 1)
  226. enemy_missile.position = chopper.X, chopper.Y + 25
  227. enemy_missile_group.add(enemy_missile)
  228. # change enemy missile position
  229. for enemy_missilex in enemy_missile_group:
  230. enemy_missilex.X -= 4
  231. if enemy_missilex.X < -64:
  232. enemy_missile_group.remove(enemy_missilex)
  233. # enemy missile & player collision detect
  234. collision = None
  235. collision = pygame.sprite.spritecollideany(
  236. enemy_missilex, player_group)
  237. if collision != None:
  238. if pygame.sprite.collide_circle_ratio(0.65)(enemy_missilex, collision):
  239. enemy_missile_group.remove(enemy_missilex)
  240. playerHealth -= 1
  241. flameposition = player.X + 70, player.Y
  242. addNewFlame(flameposition)
  243. # enemy missile & player missile collision detect (to remove enemy/player missile & add flame)
  244. collision = None
  245. collision = pygame.sprite.spritecollideany(
  246. enemy_missilex, missile_group)
  247. if collision != None:
  248. if pygame.sprite.collide_circle_ratio(0.65)(enemy_missilex, collision):
  249. missile_group.remove(collision)
  250. enemy_missile_group.remove(enemy_missilex)
  251. flameposition = enemy_missilex.X, enemy_missilex.Y - 30
  252. addNewFlame(flameposition)
  253. # draw enemy chopper spritew
  254. chopper_group.update(ticks)
  255. chopper_group.draw(screen)
  256. # draw player
  257. player_group.update(ticks)
  258. player_group.draw(screen)
  259. # change player missile position
  260. for missilex in missile_group:
  261. missilex.velocity.x += 0.5
  262. missilex.X += missilex.velocity.x
  263. if missilex.X > 1056:
  264. missile_group.remove(missilex)
  265. # player missile & enemy chopper collision detect
  266. collision = None
  267. collision = pygame.sprite.spritecollideany(missilex, chopper_group)
  268. if collision != None:
  269. if pygame.sprite.collide_circle_ratio(1)(missilex, collision):
  270. missile_hit += 1
  271. chopper_group.remove(collision)
  272. missile_group.remove(missilex)
  273. flameposition = missilex.X + \
  274. 80, missilex.Y - 30
  275. addNewFlame(flameposition)
  276. # player missile & enemy warship collision detect
  277. collision = None
  278. collision = pygame.sprite.spritecollideany(missilex, warship_group)
  279. if collision != None:
  280. if pygame.sprite.collide_circle_ratio(0.65)(missilex, collision):
  281. missile_hit_warship += 1
  282. warship_health -= 1
  283. missile_group.remove(missilex)
  284. warshipflameposition = missilex.X + \
  285. rint(1, 100), missilex.Y - 20
  286. addNewWarshipFlame(warshipflameposition)
  287. # random flame after warship is destroyed
  288. if warship_health == 0:
  289. for i in xrange(20):
  290. position = warship.X + \
  291. rint(-10, 300), warship.Y + \
  292. rint(-20, 100)
  293. addNewFlame(position)
  294. warship_health = 10
  295. warship_group.remove(collision)
  296. # enemy collision with player
  297. collision = None
  298. collision = pygame.sprite.spritecollideany(player, chopper_group)
  299. if collision != None:
  300. if pygame.sprite.collide_circle_ratio(0.65)(player, collision):
  301. chopper_group.remove(collision)
  302. playerHealth -= 1
  303. flameposition = player.X + 70, player.Y
  304. addNewFlame(flameposition)
  305. # draw player missiles
  306. missile_group.update(ticks)
  307. missile_group.draw(screen)
  308. # draw enemy missiles
  309. enemy_missile_group.update(ticks)
  310. enemy_missile_group.draw(screen)
  311. # draw warship missile
  312. warship_missile_group.update(ticks)
  313. warship_missile_group.draw(screen)
  314. # draw flame
  315. for x in flame_group:
  316. if x.frame == x.last_frame:
  317. flame_group.remove(x)
  318. flame_group.update(ticks)
  319. flame_group.draw(screen)
  320. # draw warship flame
  321. for x in warship_flame_group:
  322. if x.frame == x.last_frame:
  323. warship_flame_group.remove(x)
  324. warship_flame_group.update(ticks)
  325. warship_flame_group.draw(screen)
  326. # game statistics
  327. font = pygame.font.SysFont(None, 25)
  328. text1 = font.render("Player Health: " +
  329. str(playerHealth), True, (255, 0, 0))
  330. screen.blit(text1, (0, 480))
  331. text2 = font.render("Missile Launched: " +
  332. str(missile_launched), True, (255, 0, 0))
  333. screen.blit(text2, (0, 500))
  334. text3 = font.render("Missile Hit: " +
  335. str(missile_hit), True, (255, 0, 0))
  336. screen.blit(text3, (0, 520))
  337. if not missile_launched == 0:
  338. hitrate = float(missile_hit) / float(missile_launched) * 100
  339. text4 = font.render("Hit Rate: " +
  340. str(hitrate) + "%", True, (255, 0, 0))
  341. else:
  342. text4 = font.render("Hit Rate: " +
  343. "0%", True, (255, 0, 0))
  344. screen.blit(text4, (0, 540))
  345. text5 = font.render("Total Enemies: " +
  346. str(total_enemy_showedup), True, (255, 0, 0))
  347. screen.blit(text5, (0, 560))
  348. text6 = font.render("Enemy Missile Launched: " +
  349. str(enemy_missile_launched), True, (255, 0, 0))
  350. screen.blit(text6, (0, 580))
  351. pygame.display.update()
  352. key = pygame.key.get_pressed()
  353. if key[pygame.K_ESCAPE]:
  354. exit()
  355. for event in pygame.event.get():
  356. if event.type == pygame.KEYDOWN:
  357. if event.key == K_w:
  358. keys[0] = True
  359. elif event.key == K_a:
  360. keys[1] = True
  361. elif event.key == K_s:
  362. keys[2] = True
  363. elif event.key == K_d:
  364. keys[3] = True
  365. if event.type == pygame.KEYUP:
  366. if event.key == pygame.K_w:
  367. keys[0] = False
  368. elif event.key == pygame.K_a:
  369. keys[1] = False
  370. elif event.key == pygame.K_s:
  371. keys[2] = False
  372. elif event.key == pygame.K_d:
  373. keys[3] = False
  374. # add missile sprite
  375. if event.type == pygame.MOUSEBUTTONDOWN:
  376. pressed_array = pygame.mouse.get_pressed()
  377. for index in range(len(pressed_array)):
  378. if pressed_array[index]:
  379. if index == 0:
  380. missile_launched += 1
  381. missile = MySprite()
  382. missile.load("resources/images/bullet2.png", 32, 16, 1)
  383. missile.position = player.X + \
  384. 120, player.Y + 35
  385. missile_group.add(missile)
  386. if event.type == pygame.QUIT:
  387. pygame.quit()
  388. exit()
  389. # move player sprite
  390. if keys[0]:
  391. if not player.Y < 0:
  392. player.Y -= player_move_speed
  393. elif keys[1]:
  394. if not player.X < 0:
  395. player.X -= player_move_speed
  396. if keys[2]:
  397. if not player.Y > 500:
  398. player.Y += player_move_speed
  399. elif keys[3]:
  400. if not player.X > 1024:
  401. player.X += player_move_speed
  402. # print player.position
  403. # auto pilot
  404. if not len(chopper_group) == 0:
  405. enemy = chopper_group.sprites()[0]
  406. posdiffy = enemy.Y - player.Y
  407. # print posdiffy
  408. if posdiffy < -10:
  409. for em in enemy_missile_group:
  410. if abs(em.X - player.X) < 100 and -100 < (em.Y - player.Y) < 0:
  411. keys[0] = False
  412. keys[2] = False
  413. break
  414. else:
  415. keys[0] = True
  416. keys[2] = False
  417. elif posdiffy > 10:
  418. for em in enemy_missile_group:
  419. if abs(em.X - player.X) < 100 and 0 < (em.Y - player.Y) < 100:
  420. keys[0] = False
  421. keys[2] = False
  422. break
  423. else:
  424. keys[0] = False
  425. keys[2] = True
  426. elif -10 <= posdiffy <= 10:
  427. keys[0] = False
  428. keys[2] = False
  429. missile_launched += 1
  430. if len(missile_group) < 2:
  431. if ticks - tickstart[0] > 200:
  432. tickstart.pop(0)
  433. tickstart.append(ticks)
  434. missile = MySprite()
  435. missile.load("resources/images/bullet2.png", 32, 16, 1)
  436. missile.position = player.X + \
  437. 120, player.Y + 35
  438. missile_group.add(missile)


资源下载地址:

http://download.csdn.net/download/jailman/10160613

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号