Skip to content

Instantly share code, notes, and snippets.

@MrEnder0
Created June 16, 2023 20:31
Show Gist options
  • Save MrEnder0/c949d7a44643086071343b9fd46f64dd to your computer and use it in GitHub Desktop.
Save MrEnder0/c949d7a44643086071343b9fd46f64dd to your computer and use it in GitHub Desktop.
Agari.io Clone
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