Created
June 16, 2023 20:31
-
-
Save MrEnder0/c949d7a44643086071343b9fd46f64dd to your computer and use it in GitHub Desktop.
Agari.io Clone
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pygame | |
import random | |
pygame.init() | |
width, height = 800, 600 | |
screen = pygame.display.set_mode((width, height)) | |
pygame.display.set_caption("Agar.io Clone") | |
clock = pygame.time.Clock() | |
class Player: | |
def __init__(self, x, y, size, color, speed): | |
self.x = x | |
self.y = y | |
self.size = size | |
self.color = color | |
self.speed = speed | |
def move(self, dx, dy): | |
self.x += dx * self.speed | |
self.y += dy * self.speed | |
def draw(self, camera_offset): | |
pygame.draw.circle(screen, self.color, (self.x - camera_offset[0], self.y - camera_offset[1]), self.size) | |
class Food: | |
def __init__(self, x, y, size, color, speed): | |
self.x = x | |
self.y = y | |
self.size = size | |
self.color = color | |
self.speed = speed | |
self.dx = random.uniform(-1, 1) # Random initial movement direction along x-axis | |
self.dy = random.uniform(-1, 1) # Random initial movement direction along y-axis | |
self.name = generate_name() # Generate a random name for the food | |
def move(self): | |
self.x += self.dx * self.speed | |
self.y += self.dy * self.speed | |
# Check if food hits the screen edges and change movement direction | |
if ( | |
self.x - self.size <= -width or self.x + self.size >= width * 2 or | |
self.y - self.size <= -height or self.y + self.size >= height * 2 | |
): | |
self.dx *= -1 # Reverse x-direction | |
self.dy *= -1 # Reverse y-direction | |
def draw(self, camera_offset): | |
pygame.draw.circle(screen, self.color, (self.x - camera_offset[0], self.y - camera_offset[1]), self.size) | |
name_text = font.render(self.name, True, (0, 0, 0)) | |
name_rect = name_text.get_rect(center=(self.x - camera_offset[0], self.y - camera_offset[1] - self.size - 10)) | |
screen.blit(name_text, name_rect) | |
def generate_name(): | |
vowels = 'aeiou' | |
consonants = 'bcdfghjklmnpqrstvwxyz' | |
name_length = random.randint(3, 5) | |
name = "" | |
for i in range(name_length): | |
if i % 2 == 0: | |
name += random.choice(consonants) | |
else: | |
name += random.choice(vowels) | |
return name.capitalize() | |
player = Player(width // 2, height // 2, 30, (0, 255, 0), 3) # Set player color to green, size, and speed | |
foods = [] | |
def generate_food(): | |
x = random.randint(-width, width * 2) | |
y = random.randint(-height, height * 2) | |
size_factor = random.uniform(0.3, 1.5) # Random size growth factor for food | |
size = player.size * size_factor | |
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) | |
speed = random.uniform(0.5, 2.0) # Random speed for food | |
food = Food(x, y, size, color, speed) | |
foods.append(food) | |
# Generate initial food | |
for _ in range(50): | |
generate_food() | |
def restart_game(): | |
player.x = width // 2 | |
player.y = height // 2 | |
player.size = 30 | |
foods.clear() | |
for _ in range(50): | |
generate_food() | |
font = pygame.font.Font(None, 24) # Create a font object for the food names | |
running = True | |
spawn_timer = 0 | |
camera_offset = [0, 0] # Camera offset from the player | |
while running: | |
screen.fill((255, 255, 255)) # Set background color to white | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
running = False | |
elif event.type == pygame.USEREVENT: | |
generate_food() | |
keys = pygame.key.get_pressed() | |
if keys[pygame.K_LEFT]: | |
player.move(-1, 0) | |
if keys[pygame.K_RIGHT]: | |
player.move(1, 0) | |
if keys[pygame.K_UP]: | |
player.move(0, -1) | |
if keys[pygame.K_DOWN]: | |
player.move(0, 1) | |
# Draw criss-cross pattern | |
for x in range(-width * 2, width * 3, 50): | |
pygame.draw.line(screen, (200, 200, 200), (x - camera_offset[0], -height - camera_offset[1]), (x - camera_offset[0], height * 2 - camera_offset[1]), 1) | |
for y in range(-height * 2, height * 3, 50): | |
pygame.draw.line(screen, (200, 200, 200), (-width - camera_offset[0], y - camera_offset[1]), (width * 2 - camera_offset[0], y - camera_offset[1]), 1) | |
# Update camera offset based on player position | |
camera_offset[0] = player.x - width // 2 | |
camera_offset[1] = player.y - height // 2 | |
# Move and draw the food | |
eaten_foods = [] | |
for food in foods: | |
food.move() | |
food.draw(camera_offset) | |
if ( | |
food.x - food.size < player.x < food.x + food.size and | |
food.y - food.size < player.y < food.y + food.size | |
): | |
if food.size > player.size: | |
restart_game() | |
break | |
elif food.size <= player.size * 0.8: | |
eaten_foods.append(food) | |
player.size += int(food.size // 10) | |
# Remove eaten food from the list | |
for food in eaten_foods: | |
foods.remove(food) | |
player.draw(camera_offset) | |
# Draw red border using camera offset | |
border_rect = pygame.Rect(-width - player.size, -height - player.size, width * 3 + player.size * 2, height * 3 + player.size * 2) | |
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(border_rect.x - camera_offset[0], border_rect.y - camera_offset[1], border_rect.width, border_rect.height), 5) | |
# Food spawn timer | |
spawn_timer += 1 | |
if spawn_timer >= 120: # Adjust the spawn rate here (120 = 2 seconds) | |
generate_food() | |
spawn_timer = 0 | |
pygame.display.flip() | |
clock.tick(60) | |
pygame.quit() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment