def play_pytank(): pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) bullet = None game_speed = 30 hit_count = 0 fire_count = 0 model = Network.TwoLayerNet(3, 10, 10, 3) model.load_model() while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEDOWN: game_speed -= 30 elif event.key == pygame.K_PAGEUP: game_speed += 30 if game_speed < 0: game_speed = 0 if game_speed > 150: game_speed = 150 data = [ #Util.get_distance(my_tank.position, enemy.position), Util.normalize_angle(my_tank.angle), Util.normalize_angle(enemy.angle), Util.normalize_angle( Util.get_angle(enemy.position.copy(), my_tank.position.copy())) ] p = model.predict(data) i = p.index(max(p)) print(p) print() if i == 0: #print("fire") if my_tank.is_fire == False: bullet = Object.Bullet(screen, [my_tank.c_x, my_tank.c_y], my_tank.angle) my_tank.is_fire = True fire_count += 1 elif i == 1: #print("angle left") my_tank.angle += 3 elif i == 2: #print("angle right") my_tank.angle -= 3 my_tank.update_status() enemy.update_status() if my_tank.is_fire: bullet.update_status() # check Status if my_tank.is_fire: if Util.check_collision(enemy, bullet): hit_count += 1 bullet.alive = False del enemy enemy = Object.Tank(1, screen) if my_tank.is_fire: if bullet.alive == False: del bullet my_tank.is_fire = False # Update display screen.fill((255, 255, 255)) text = font.render("hit : " + str(hit_count) + "/" + str(fire_count), True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (1000, 50) screen.blit(text, text_rect) text = font.render("Speed : " + str(game_speed / 30) + 'X', True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (100, 50) screen.blit(text, text_rect) my_tank.draw() enemy.draw() if my_tank.is_fire: if bullet.alive: bullet.draw() pygame.display.flip() clock.tick(game_speed)
def control_pytank(): pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) font2 = pygame.font.SysFont("Arial", 150) done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) enemy.speed = 0 bullet = None game_speed = 30 hit_count = 0 fire_count = 0 while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEUP: game_speed -= 30 elif event.key == pygame.K_PAGEDOWN: game_speed += 30 if game_speed < 0: game_speed = 0 if game_speed > 150: game_speed = 150 elif event.type == pygame.KEYUP: if event.key == pygame.K_UP or event.key == pygame.K_DOWN: my_tank.speed = 0 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: my_tank.angle -= 5 if keys[pygame.K_RIGHT]: my_tank.angle += 5 if keys[pygame.K_UP]: my_tank.speed = 10 if keys[pygame.K_DOWN]: my_tank.speed = -10 if keys[pygame.K_SPACE]: if my_tank.is_fire == False: bullet = Object.Bullet(screen, [my_tank.c_x, my_tank.c_y], my_tank.angle) my_tank.is_fire = True fire_count += 1 abs_angle = Util.get_angle(enemy.position, my_tank.position) print("abs : " + str(abs_angle) + " / " + "my : " + str(my_tank.angle)) my_tank.update_status() enemy.update_status() if my_tank.is_fire: bullet.update_status() # check Status if my_tank.is_fire: if Util.check_collision(enemy, bullet): text = font2.render("Assasinated", True, (255, 0, 0)) text_rect = text.get_rect() text_rect.center = (600, 400) screen.blit(text, text_rect) pygame.display.flip() clock.tick(1) hit_count += 1 bullet.alive = False del enemy enemy = Object.Tank(1, screen) enemy.speed = 0 if my_tank.is_fire: if bullet.alive == False: del bullet my_tank.is_fire = False # Update display screen.fill((255, 255, 255)) text = font.render("hit : " + str(hit_count) + "/" + str(fire_count), True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (1000, 50) screen.blit(text, text_rect) text = font.render("Speed : " + str(game_speed / 30) + 'X', True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (100, 50) screen.blit(text, text_rect) my_tank.draw() enemy.draw() if my_tank.is_fire: if bullet.alive: bullet.draw() pygame.display.flip() clock.tick(game_speed)
def play_pytank_avoid(): pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) enemy.speed = 0 bullet = None game_speed = 30 hit_count = 0 fire_count = 0 model = Network.TwoLayerNet(2, 10, 2) model.load_model() while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEUP: game_speed -= 30 elif event.key == pygame.K_PAGEDOWN: game_speed += 30 if game_speed < 0: game_speed = 0 if game_speed > 150: game_speed = 150 elif event.type == pygame.KEYUP: if event.key == pygame.K_UP or event.key == pygame.K_DOWN: my_tank.speed = 0 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: my_tank.angle -= 5 if keys[pygame.K_RIGHT]: my_tank.angle += 5 if keys[pygame.K_UP]: my_tank.speed = 10 if keys[pygame.K_DOWN]: my_tank.speed = -10 if keys[pygame.K_SPACE]: if my_tank.is_fire == False: bullet = Object.Bullet(screen, [my_tank.c_x, my_tank.c_y], my_tank.angle) my_tank.is_fire = True print("shoooooooooooooooot") fire_count += 1 my_tank.update_status() enemy.update_status() if my_tank.is_fire: bullet.update_status() text = font.render("", True, (0, 0, 0)) #predict if my_tank.is_fire == True: decision = enemy.predict_hit(bullet) if decision == 1: action = enemy.emergency_avoid(bullet) if action == 0: # angle left enemy.angle -= 5 elif action == 1: # angle right enemy.angle += 5 elif action == 2: # forward print("forward!") enemy.speed = 10 else: enemy.speed = 0 # check Status if my_tank.is_fire: if Util.check_collision(enemy, bullet): hit_count += 1 bullet.alive = False #del enemy #enemy = Object.Tank(1, screen) #enemy.speed = 0 if my_tank.is_fire: if bullet.alive == False: del bullet my_tank.is_fire = False # Update display screen.fill((255, 255, 255)) text = font.render("hit : " + str(hit_count) + "/" + str(fire_count), True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (1000, 50) screen.blit(text, text_rect) text = font.render("Speed : " + str(game_speed / 30) + 'X', True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (100, 50) screen.blit(text, text_rect) my_tank.draw() enemy.draw() if my_tank.is_fire: if bullet.alive: bullet.draw() pygame.display.flip() clock.tick(game_speed)
def play_pytank_v2(): pygame.mixer.pre_init(44100, -16, 2, 2048) pygame.mixer.init() pygame.init() hit_sound = pygame.mixer.Sound("hit.wav") fire_sound = pygame.mixer.Sound("fire.wav") cloud = pygame.image.load("cloud.png") screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) is_start = False done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) bullet = None game_speed = 30 hit_count = 0 fire_count = 0 model = Network.TwoLayerNet(3, 10, 10, 3) model.load_model() while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEDOWN: game_speed -= 30 elif event.key == pygame.K_PAGEUP: game_speed += 30 if game_speed < 0: game_speed = 0 if game_speed > 150: game_speed = 150 elif event.key == pygame.K_SPACE: if is_start == False: is_start = True if is_start == False: continue abs_angle = Util.get_angle(enemy.position.copy(), my_tank.position.copy()) a1 = (my_tank.angle - abs_angle + 360) % 360 a2 = (abs_angle - my_tank.angle + 360) % 360 is_right = 0 is_left = 0 if a1 > a2: is_right = 1 else: is_left = 1 data = [ #Util.get_distance(my_tank.position, enemy.position), Util.normalize_angle(my_tank.angle), Util.normalize_angle(enemy.angle), Util.normalize_angle( Util.get_angle(enemy.position.copy(), my_tank.position.copy())) ] p = model.predict(data) i = p.index(max(p)) print(p) if i == 0: #if p[0] >= 0.4: #print("angle left") my_tank.angle -= 5 elif i == 1: #if p[1] >= 0.4: #print("angle right") my_tank.angle += 5 elif i == 2: if my_tank.is_fire == False: fire_sound.play() bullet = Object.Bullet(screen, [my_tank.c_x, my_tank.c_y], my_tank.angle) my_tank.is_fire = True fire_count += 1 my_tank.update_status() enemy.update_status() if my_tank.is_fire: bullet.update_status() if fire_count > 30: break # check Status if my_tank.is_fire: if Util.check_collision(enemy, bullet): hit_sound.play() for i in range(60): screen.blit( cloud, (bullet.position[0] - 70, bullet.position[1] - 70)) pygame.display.flip() hit_count += 1 bullet.alive = False del enemy enemy = Object.Tank(1, screen) if my_tank.is_fire: if bullet.alive == False: del bullet my_tank.is_fire = False # Update display screen.fill((255, 255, 255)) text = font.render("hit : " + str(hit_count) + "/" + str(fire_count), True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (1000, 50) screen.blit(text, text_rect) text = font.render("Speed : " + str(game_speed / 30) + 'X', True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (100, 50) screen.blit(text, text_rect) my_tank.draw() enemy.draw() if my_tank.is_fire: if bullet.alive: bullet.draw() pygame.display.flip() clock.tick(game_speed)
def train_pytank_avoid(): pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) trained_count = 0 game_speed = 15 num_bullet = 100 bullets = [] flag_get_train_data = False train_input_data = [None] * num_bullet train_result_data = [None] * num_bullet model = Network.TwoLayerNet(2, 10, 2) is_start = False is_fire = False threshold = 30 while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEDOWN: game_speed -= 30 if game_speed < 0: game_speed = 0 elif event.key == pygame.K_PAGEUP: game_speed += 30 if game_speed > 300: game_speed = 300 elif event.key == pygame.K_SPACE: is_start = True if is_start == False: continue if is_fire == False: random_position = [random.randrange(50, screen_width - 50), random.randrange(50, screen_height - 50)] my_tank.position = random_position for i in range(num_bullet): # random position random_position = [random.randrange(50, screen_width - 50), random.randrange(50, screen_height - 50)] b = Object.Bullet(screen, random_position) b.set_new_direction() abs_angle = Util.get_angle(b.position.copy(), my_tank.position.copy()) is_left = 0 is_right = 0 a1 = (b.angle - abs_angle + 360) % 360 a2 = (abs_angle - b.angle + 360) % 360 if a1 > a2: big = a1 small = a2 else: big = a2 small = a1 while small >= threshold and big <= 360 - threshold: b.set_new_direction() a1 = (b.angle - abs_angle + 360) % 360 a2 = (abs_angle - b.angle + 360) % 360 if a1 > a2: big = a1 small = a2 else: big = a2 small = a1 b.angle -= 180 bullets.append(b) # direction_bullet, abs_angle, distance, my_angle data = [Util.normalize_angle(Util.get_angle(my_tank.position.copy(), b.position.copy())), Util.get_distance(my_tank.position.copy(), b.position.copy()) / 1400] train_input_data[i] = data is_fire = True flag_get_train_data = True my_tank.update_status() for i in range(len(bullets)): bullets[i].update_status() # check Status for i in range(len(bullets)): if Util.check_collision(my_tank, bullets[i]): bullets[i].hit = True # update Status if flag_get_train_data: count = 0 for i in range(len(bullets)): if train_result_data[i] != None: count += 1 elif bullets[i].alive == False: hit = int(bullets[i].hit) avoid = 0 if hit == 0: avoid = 1 data = [int(bullets[i].hit), avoid] train_result_data[i] = data count += 1 if count == num_bullet: model.save_data(train_input_data, train_result_data) if model.data_count >= 500: break if model.data_count == 250: threshold = 3 # init train_input_data = [None] * num_bullet train_result_data = [None] * num_bullet bullets.clear() trained_count += 1 flag_get_train_data = False is_fire = False # Update display screen.fill((255, 255, 255)) text = font.render("Trained : " + str(trained_count), True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (1000, 50) screen.blit(text, text_rect) text = font.render("Speed : " + str(game_speed / 30) + 'X', True, (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (100, 50) screen.blit(text, text_rect) my_tank.draw() for b in bullets: if b.alive: b.draw() pygame.display.flip() clock.tick(game_speed)
def train_pytank_v2(): pygame.init() screen = pygame.display.set_mode((screen_width, screen_height)) clock = pygame.time.Clock() font = pygame.font.SysFont("Arial", 30) done = False my_tank = Object.Tank(0, screen) my_tank.speed = 0 enemy = Object.Tank(1, screen) trained_count = 0 game_speed = 15 num_bullet = 100 bullets = [] flag_get_train_data = False train_input_data = [None] * num_bullet train_result_data = [None] * num_bullet model = Network.TwoLayerNet(3, 10, 10, 3) is_start = False enemy_was_at = [] enemy_was_angle = 0 threshold = 30 while not done: # Check input for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_PAGEDOWN: game_speed -= 30 if game_speed < 0: game_speed = 0 elif event.key == pygame.K_PAGEUP: game_speed += 30 if game_speed > 300: game_speed = 300 elif event.key == pygame.K_SPACE: is_start = True if is_start == False: continue if my_tank.is_fire == False: my_tank.fire() flag_get_train_data = True abs_angle = Util.get_angle(enemy.position.copy(), my_tank.position.copy()) is_left = 0 is_right = 0 for i in range(num_bullet): b = Object.Bullet(screen, my_tank.position.copy()) a1 = (b.angle - abs_angle + 360) % 360 a2 = (abs_angle - b.angle + 360) % 360 if a1 > a2: big = a1 small = a2 else: big = a2 small = a1 while small >= threshold and big <= 360 - threshold: b.set_new_direction() a1 = (b.angle - abs_angle + 360) % 360 a2 = (abs_angle - b.angle + 360) % 360 if a1 > a2: big = a1 small = a2 else: big = a2 small = a1 bullets.append(b) is_left = 0 is_right = 0 if a1 > a2: is_right = 1 else : is_left = 1 data = [#Util.get_distance(my_tank.position, enemy.position), Util.normalize_angle(my_tank.angle), Util.normalize_angle(enemy.angle), Util.normalize_angle(Util.get_angle(enemy.position.copy(), my_tank.position.copy()))] #print(data) train_input_data[i] = data my_tank.update_status() enemy.update_status() for i in range(len(bullets)): bullets[i].update_status() # check Status for i in range(len(bullets)): if Util.check_collision(enemy, bullets[i]): bullets[i].hit = True # update Status if flag_get_train_data: count = 0 for i in range(len(bullets)): if train_result_data[i] != None: count += 1 elif bullets[i].alive == False: abs_angle = Util.get_angle(enemy.position, my_tank.position) p1 = (bullets[i].angle - abs_angle + 360) % 360 p2 = (abs_angle - bullets[i].angle + 360) % 360 left, right = 0, 0 if bullets[i].hit == 0: if p1 > p2: right = 1 else : left = 1 data = [left, right, int(bullets[i].hit)] train_result_data[i] = data count += 1 if count == num_bullet: model.save_data(train_input_data, train_result_data) if model.data_count >= 10000: break # init train_input_data = [None] * num_bullet train_result_data = [None] * num_bullet bullets.clear() trained_count += 1 del enemy enemy = Object.Tank(1, screen) #if model.data_count >= 4000: #enemy.speed = 0 flag_get_train_data = False my_tank.is_fire = False """