import pygame import sys import random import time import re # Initialize Pygame pygame.init() # Set up the display WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Python Chatbot - Pygame Edition with Improved Tank Pong AI") # Colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) BLUE = (0, 0, 255) ORANGE = (255, 165, 0) # Fonts font = pygame.font.Font(None, 32) # Chat messages messages = [] # Responses dictionary responses = {} # Inactivity responses inactivity_responses = [ "Are you still there?", "Did you fall asleep?", "Am I boring you?", "Are you angry with me?" ] # Timers last_input_time = time.time() inactivity_message_time = None timers_enabled = True # Tank Pong game variables TANK_WIDTH, TANK_HEIGHT = 60, 40 BALL_SIZE = 15 TANK_SPEED = 5 BALL_SPEED = 5 player_tank = pygame.Rect(50, HEIGHT//2 - TANK_HEIGHT//2, TANK_WIDTH, TANK_HEIGHT) ai_tank = pygame.Rect(WIDTH - 50 - TANK_WIDTH, HEIGHT//2 - TANK_HEIGHT//2, TANK_WIDTH, TANK_HEIGHT) ball = pygame.Rect(WIDTH//2 - BALL_SIZE//2, HEIGHT//2 - BALL_SIZE//2, BALL_SIZE, BALL_SIZE) ball_dx, ball_dy = BALL_SPEED, BALL_SPEED # Load responses from file def load_responses(): global responses try: with open("chatbot_phrases.txt", "r") as file: for line in file: key, value = line.strip().split(":", 1) responses[key.lower().strip()] = value.strip() except FileNotFoundError: print("No phrases file found. Starting with empty responses.") # Save responses to file def save_responses(): with open("chatbot_phrases.txt", "w") as file: for key, value in responses.items(): file.write(f"{key}:{value}\n") # Get bot response def get_bot_response(user_input): user_input = user_input.lower() for key in responses: if all(word.lower() in user_input for word in key.lower().split()): return responses[key] return "I'm not sure how to respond to that. Could you please rephrase or ask something else?" # Improved AI for Tank Pong game def ai_move(ai_tank, ball): # Predict ball position future_ball_y = ball.y + ball.dy * ((ai_tank.x - ball.x) / ball.dx) # Add some randomness to make it beatable future_ball_y += random.randint(-30, 30) # Move towards predicted position if ai_tank.centery < future_ball_y and ai_tank.bottom < HEIGHT: return TANK_SPEED elif ai_tank.centery > future_ball_y and ai_tank.top > 0: return -TANK_SPEED return 0 # Play Tank Pong game def play_tank_pong(): global player_tank, ai_tank, ball, ball_dx, ball_dy, timers_enabled timers_enabled = False clock = pygame.time.Clock() game_over = False # Clear the screen screen.fill(BLACK) pygame.display.flip() while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: return elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: return keys = pygame.key.get_pressed() if keys[pygame.K_a] and player_tank.left > 0: player_tank.x -= TANK_SPEED if keys[pygame.K_d] and player_tank.right < WIDTH: player_tank.x += TANK_SPEED # Improved AI movement ai_tank.y += ai_move(ai_tank, ball) # Ball movement ball.x += ball_dx ball.y += ball_dy # Ball collision with top and bottom if ball.top <= 0 or ball.bottom >= HEIGHT: ball_dy *= -1 # Ball collision with tanks if ball.colliderect(player_tank) or ball.colliderect(ai_tank): ball_dx *= -1 # Ball out of bounds if ball.left <= 0 or ball.right >= WIDTH: ball.center = (WIDTH//2, HEIGHT//2) ball_dx *= random.choice([-1, 1]) ball_dy *= random.choice([-1, 1]) # Draw everything screen.fill(BLACK) pygame.draw.rect(screen, BLUE, player_tank) pygame.draw.rect(screen, GREEN, ai_tank) pygame.draw.ellipse(screen, WHITE, ball) pygame.draw.aaline(screen, WHITE, (WIDTH//2, 0), (WIDTH//2, HEIGHT)) pygame.display.flip() clock.tick(60) timers_enabled = True # Main game loop def main(): global last_input_time, inactivity_message_time, timers_enabled load_responses() user_input = "" clock = pygame.time.Clock() # Add initial greeting messages.append(("Bot", "Hello! I'm WebSim, a Python-based chatbot running in a simulated Pygame environment with an improved Tank Pong AI. How can I assist you today?")) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: save_responses() pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: if user_input: messages.append(("You", user_input)) if user_input.lower() == "let's play pong": messages.append(("Bot", "Great! Let's play Tank Pong with the improved AI. Use A and D keys to move your tank. Press ESC to quit the game. Timers will be disabled during the game. The screen will be cleared when the game starts.")) play_tank_pong() elif user_input.lower() == "let's stop playing": messages.append(("Bot", "Alright, we've stopped playing Tank Pong. Timers have been re-enabled. What would you like to do now?")) else: bot_response = get_bot_response(user_input) messages.append(("Bot", bot_response)) user_input = "" last_input_time = time.time() inactivity_message_time = None elif event.key == pygame.K_BACKSPACE: user_input = user_input[:-1] else: user_input += event.unicode last_input_time = time.time() inactivity_message_time = None # Check for inactivity if timers_enabled: current_time = time.time() if current_time - last_input_time >= 60 and inactivity_message_time is None: inactivity_response = random.choice(inactivity_responses) messages.append(("Bot", inactivity_response, True)) inactivity_message_time = current_time # Remove inactivity message after 15 seconds if inactivity_message_time and current_time - inactivity_message_time >= 15: messages = [m for m in messages if len(m) < 3 or not m[2]] inactivity_message_time = None # Clear the screen screen.fill(BLACK) # Draw chat messages y = HEIGHT - 100 for message in reversed(messages[-10:]): sender, text = message[:2] color = BLUE if sender == "You" else GREEN if len(message) == 3 and message[2]: # Inactivity message color = ORANGE text_surface = font.render(f"{sender}: {text}", True, color) screen.blit(text_surface, (10, y)) y -= 40 # Draw user input input_text = font.render(f"You: {user_input}", True, WHITE) screen.blit(input_text, (10, HEIGHT - 40)) pygame.display.flip() clock.tick(30) if __name__ == "__main__": main()