37行代码实现一个简单的打游戏AI

来源:互联网 发布:windows bat脚本sleep 编辑:程序博客网 时间:2024/05/28 19:25

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

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

# coding=utf8from random import randint as rintimport pygamefrom pygame.locals import *class MySprite(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.master_image = None        self.frame = 0        self.old_frame = -1        self.frame_width = 1        self.frame_height = 1        self.first_frame = 0        self.last_frame = 0        self.columns = 1        self.last_time = 0        self.direction = 0        self.velocity = Point(0.0, 0.0)    # X property    def _getx(self):        return self.rect.x    def _setx(self, value):        self.rect.x = value    X = property(_getx, _setx)    # Y property    def _gety(self):        return self.rect.y    def _sety(self, value):        self.rect.y = value    Y = property(_gety, _sety)    # position property    def _getpos(self):        return self.rect.topleft    def _setpos(self, pos):        self.rect.topleft = pos    position = property(_getpos, _setpos)    def load(self, filename, width, height, columns):        self.master_image = pygame.image.load(filename).convert_alpha()        self.frame_width = width        self.frame_height = height        self.rect = Rect(0, 0, width, height)        self.columns = columns        # try to auto-calculate total frames        rect = self.master_image.get_rect()        self.last_frame = (rect.width // width) * (rect.height // height) - 1    def update(self, current_time, rate=30):        # update animation frame number        if current_time > self.last_time + rate:            self.frame += 1            if self.frame > self.last_frame:                self.frame = self.first_frame            self.last_time = current_time        # build current frame only if it changed        if self.frame != self.old_frame:            frame_x = (self.frame % self.columns) * self.frame_width            frame_y = (self.frame // self.columns) * self.frame_height            rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height)            self.image = self.master_image.subsurface(rect)            self.old_frame = self.frame    def __str__(self):        return str(self.frame) + "," + str(self.first_frame) + \               "," + str(self.last_frame) + "," + str(self.frame_width) + \               "," + str(self.frame_height) + "," + str(self.columns) + \               "," + str(self.rect)# Point classclass Point(object):    def __init__(self, x, y):        self.__x = x        self.__y = y    # X property    def getx(self): return self.__x    def setx(self, x): self.__x = x    x = property(getx, setx)    # Y property    def gety(self): return self.__y    def sety(self, y): self.__y = y    y = property(gety, sety)    def __str__(self):        return "{X:" + "{:.0f}".format(self.__x) + \               ",Y:" + "{:.0f}".format(self.__y) + "}"pygame.init()playerHealth = 100keys = [False, False, False, False]skybg = pygame.image.load("resources/images/skybg.jpg")missile = pygame.image.load("resources/images/bullet2.png")screen = pygame.display.set_mode((1024, 600))pygame.display.set_caption("SkyFight")timer = pygame.time.Clock()# warship spritewarship_group = pygame.sprite.Group()# enemy spritechopper_group = pygame.sprite.Group()# player spriteplayer_group = pygame.sprite.Group()player = MySprite()player.load("resources/images/playerchopper.png", 173, 58, 4)player.position = 0, 350player_group.add(player)# player missile spritemissile_group = pygame.sprite.Group()# enemy missile spriteenemy_missile_group = pygame.sprite.Group()# warship missile groupwarship_missile_group = pygame.sprite.Group()# flame spriteflame_group = pygame.sprite.Group()def addNewFlame(position):    flame = MySprite()    flame.load("resources/images/flame.png", 64, 64, 4)    flame.position = position    flame_group.add(flame)# warship flamewarship_flame_group = pygame.sprite.Group()def addNewWarshipFlame(position):    warship_flame = MySprite()    warship_flame.load("resources/images/warship_flame.png", 64, 64, 4)    warship_flame.position = position    warship_flame_group.add(warship_flame)badtimer = 100badtimer1 = 0missile_launched = 0missile_hit = 0missile_hit_warship = 0total_enemy_showedup = 0enemy_missile_launched = 0warship_health = 10# to make autopilot missile launch intervaltickstart = []tickstart.append(pygame.time.get_ticks())# player move speedplayer_move_speed = 5while True:    # start game ticks    timer.tick(60)    ticks = pygame.time.get_ticks()    screen.fill(0)    # draw background sky    screen.blit(skybg, (0, 0))    # add warship sprite (only one warship on the screen)    if len(warship_group) == 0:        warship = MySprite()        warship.load("resources/images/warship.png", 350, 70, 1)        warship.position = 1024, 500        warship_group.add(warship)    # adjust warship to come close to player    if warship.X < player.X + 200:        warship.X += 1    elif warship.X > player.X + 200:        warship.X -= 1    # draw warship    warship_group.update(ticks)    warship_group.draw(screen)    # warship launch missile    for warship in warship_group:        if len(warship_missile_group) == 0:            if warship.X < 800:                warship_missile = MySprite()                warship_missile.load("resources/images/warship_missile.png", 32, 121, 1)                warship_missile.position = warship.X + 160, warship.Y - 60                warship_missile_group.add(warship_missile)    # guide missile & change missile position    for warship_missilex in warship_missile_group:        warship_missilex.Y -= 1        if warship_missilex.Y < -121:            warship_missile_group.remove(warship_missilex)        # warship missile & enemy collision detect        collision = None        collision = pygame.sprite.spritecollideany(            warship_missilex, chopper_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):                chopper_group.remove(collision)                flameposition = warship_missilex.position                addNewFlame(flameposition)        # warship missile & enemy missile collision detect        collision = None        collision = pygame.sprite.spritecollideany(            warship_missilex, enemy_missile_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):                enemy_missile_group.remove(collision)                flameposition = warship_missilex.position                addNewFlame(flameposition)        # warship missile & player missile collision detect        collision = None        collision = pygame.sprite.spritecollideany(            warship_missilex, missile_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):                missile_group.remove(collision)                flameposition = warship_missilex.position                addNewFlame(flameposition)        # warship missile & player collision detect        collision = None        collision = pygame.sprite.spritecollideany(            warship_missilex, player_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision):                playerHealth -= 10                warship_missile_group.remove(warship_missilex)                flameposition = warship_missilex.position                addNewFlame(flameposition)    # add random enenmy chopper    badtimer -= 1    if badtimer == 0:        chopper = MySprite()        chopper.load("resources/images/enemychopper.png", 173, 60, 4)        chopper.position = 1024, rint(0, 400)        chopper_group.add(chopper)        total_enemy_showedup += 1        badtimer = 150 - (badtimer1 * 2)        if badtimer1 >= 35:            badtimer1 = 35        else:            badtimer1 += 5    # change enemy chopper position    for chopper in chopper_group:        chopper.X -= 2        if chopper.X < -173:            chopper_group.remove(chopper)        # enemy chopper launch missile        if chopper.X % 500 == 0:            enemy_missile_launched += 1            enemy_missile = MySprite()            enemy_missile.load("resources/images/missile.png", 64, 16, 1)            enemy_missile.position = chopper.X, chopper.Y + 25            enemy_missile_group.add(enemy_missile)    # change enemy missile position    for enemy_missilex in enemy_missile_group:        enemy_missilex.X -= 4        if enemy_missilex.X < -64:            enemy_missile_group.remove(enemy_missilex)        # enemy missile & player collision detect        collision = None        collision = pygame.sprite.spritecollideany(            enemy_missilex, player_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(enemy_missilex, collision):                enemy_missile_group.remove(enemy_missilex)                playerHealth -= 1                flameposition = player.X + 70, player.Y                addNewFlame(flameposition)        # enemy missile & player missile collision detect (to remove enemy/player missile & add flame)        collision = None        collision = pygame.sprite.spritecollideany(            enemy_missilex, missile_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(enemy_missilex, collision):                missile_group.remove(collision)                enemy_missile_group.remove(enemy_missilex)                flameposition = enemy_missilex.X, enemy_missilex.Y - 30                addNewFlame(flameposition)    # draw enemy chopper spritew    chopper_group.update(ticks)    chopper_group.draw(screen)    # draw player    player_group.update(ticks)    player_group.draw(screen)    # change player missile position    for missilex in missile_group:        missilex.velocity.x += 0.5        missilex.X += missilex.velocity.x        if missilex.X > 1056:            missile_group.remove(missilex)        # player missile & enemy chopper collision detect        collision = None        collision = pygame.sprite.spritecollideany(missilex, chopper_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(1)(missilex, collision):                missile_hit += 1                chopper_group.remove(collision)                missile_group.remove(missilex)                flameposition = missilex.X + \                                80, missilex.Y - 30                addNewFlame(flameposition)        # player missile & enemy warship collision detect        collision = None        collision = pygame.sprite.spritecollideany(missilex, warship_group)        if collision != None:            if pygame.sprite.collide_circle_ratio(0.65)(missilex, collision):                missile_hit_warship += 1                warship_health -= 1                missile_group.remove(missilex)                warshipflameposition = missilex.X + \                                       rint(1, 100), missilex.Y - 20                addNewWarshipFlame(warshipflameposition)                # random flame after warship is destroyed                if warship_health == 0:                    for i in xrange(20):                        position = warship.X + \                                   rint(-10, 300), warship.Y + \                                   rint(-20, 100)                        addNewFlame(position)                    warship_health = 10                    warship_group.remove(collision)    # enemy collision with player    collision = None    collision = pygame.sprite.spritecollideany(player, chopper_group)    if collision != None:        if pygame.sprite.collide_circle_ratio(0.65)(player, collision):            chopper_group.remove(collision)            playerHealth -= 1            flameposition = player.X + 70, player.Y            addNewFlame(flameposition)    # draw player missiles    missile_group.update(ticks)    missile_group.draw(screen)    # draw enemy missiles    enemy_missile_group.update(ticks)    enemy_missile_group.draw(screen)    # draw warship missile    warship_missile_group.update(ticks)    warship_missile_group.draw(screen)    # draw flame    for x in flame_group:        if x.frame == x.last_frame:            flame_group.remove(x)    flame_group.update(ticks)    flame_group.draw(screen)    # draw warship flame    for x in warship_flame_group:        if x.frame == x.last_frame:            warship_flame_group.remove(x)    warship_flame_group.update(ticks)    warship_flame_group.draw(screen)    # game statistics    font = pygame.font.SysFont(None, 25)    text1 = font.render("Player Health: " +                        str(playerHealth), True, (255, 0, 0))    screen.blit(text1, (0, 480))    text2 = font.render("Missile Launched: " +                        str(missile_launched), True, (255, 0, 0))    screen.blit(text2, (0, 500))    text3 = font.render("Missile Hit: " +                        str(missile_hit), True, (255, 0, 0))    screen.blit(text3, (0, 520))    if not missile_launched == 0:        hitrate = float(missile_hit) / float(missile_launched) * 100        text4 = font.render("Hit Rate: " +                            str(hitrate) + "%", True, (255, 0, 0))    else:        text4 = font.render("Hit Rate: " +                            "0%", True, (255, 0, 0))    screen.blit(text4, (0, 540))    text5 = font.render("Total Enemies: " +                        str(total_enemy_showedup), True, (255, 0, 0))    screen.blit(text5, (0, 560))    text6 = font.render("Enemy Missile Launched: " +                        str(enemy_missile_launched), True, (255, 0, 0))    screen.blit(text6, (0, 580))    pygame.display.update()    key = pygame.key.get_pressed()    if key[pygame.K_ESCAPE]:        exit()    for event in pygame.event.get():        if event.type == pygame.KEYDOWN:            if event.key == K_w:                keys[0] = True            elif event.key == K_a:                keys[1] = True            elif event.key == K_s:                keys[2] = True            elif event.key == K_d:                keys[3] = True        if event.type == pygame.KEYUP:            if event.key == pygame.K_w:                keys[0] = False            elif event.key == pygame.K_a:                keys[1] = False            elif event.key == pygame.K_s:                keys[2] = False            elif event.key == pygame.K_d:                keys[3] = False        # add missile sprite        if event.type == pygame.MOUSEBUTTONDOWN:            pressed_array = pygame.mouse.get_pressed()            for index in range(len(pressed_array)):                if pressed_array[index]:                    if index == 0:                        missile_launched += 1                        missile = MySprite()                        missile.load("resources/images/bullet2.png", 32, 16, 1)                        missile.position = player.X + \                                           120, player.Y + 35                        missile_group.add(missile)        if event.type == pygame.QUIT:            pygame.quit()            exit()    # move player sprite    if keys[0]:        if not player.Y < 0:            player.Y -= player_move_speed    elif keys[1]:        if not player.X < 0:            player.X -= player_move_speed    if keys[2]:        if not player.Y > 500:            player.Y += player_move_speed    elif keys[3]:        if not player.X > 1024:            player.X += player_move_speed    # print player.position    # auto pilot    if not len(chopper_group) == 0:        enemy = chopper_group.sprites()[0]        posdiffy = enemy.Y - player.Y        # print posdiffy        if posdiffy < -10:            for em in enemy_missile_group:                if abs(em.X - player.X) < 100 and -100 < (em.Y - player.Y) < 0:                    keys[0] = False                    keys[2] = False                    break                else:                    keys[0] = True                    keys[2] = False        elif posdiffy > 10:            for em in enemy_missile_group:                if abs(em.X - player.X) < 100 and 0 < (em.Y - player.Y) < 100:                    keys[0] = False                    keys[2] = False                    break                else:                    keys[0] = False                    keys[2] = True        elif -10 <= posdiffy <= 10:            keys[0] = False            keys[2] = False            missile_launched += 1            if len(missile_group) < 2:                if ticks - tickstart[0] > 200:                    tickstart.pop(0)                    tickstart.append(ticks)                    missile = MySprite()                    missile.load("resources/images/bullet2.png", 32, 16, 1)                    missile.position = player.X + \                                       120, player.Y + 35                    missile_group.add(missile)

资源下载地址:

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



阅读全文
0 0
原创粉丝点击