Before we dive into the details of this post, let us provide the previous two links that precede it.
Building solutions using LLM AutoGen in Python – Part 1
Building solutions using LLM AutoGen in Python – Part 2
For, reference, we’ll share the demo before deep dive into the actual follow-up analysis in the below section –
In this post, we will understand the initial code generated & then the revised code to compare them for a better understanding of the impact of revised prompts.
But, before that let us broadly understand the communication types between the agents.

Direct Communication:
- Agents Involved:
Agent1,Agent2 - Flow:
Agent1sends a request directly toAgent2.Agent2processes the request and sends the response back toAgent1.
- Use Case: Simple query-response interactions without intermediaries.
Mediator-Based Communication:
- Agents Involved:
UserAgent,Mediator,SpecialistAgent1,SpecialistAgent2 - Flow:
UserAgentsends input toMediator.Mediatordelegates tasks toSpecialistAgent1andSpecialistAgent2.- Specialists process tasks and return results to
Mediator. Mediatorconsolidates results and sends them back toUserAgent.

Broadcast Communication:
- Agents Involved:
Broadcaster,AgentA,AgentB,AgentC - Flow:
Broadcastersends a message to multiple agents simultaneously.- Agents that find the message relevant (
AgentA,AgentC) acknowledge or respond.
- Use Case: System-wide notifications or alerts.
Hierarchical Communication:
- Agents Involved:
Supervisor,Worker1,Worker2 - Flow:
Supervisorassigns tasks toWorker1andWorker2.- Workers execute tasks and report progress back to
Supervisor.
- Use Case: Task delegation in structured organizations.

Publish/Subscribe Communication:
- Agents Involved:
Publisher,Subscriber1,Topic - Flow:
Publisherpublishes an event or message to aTopic.Subscriber1, who is subscribed to theTopic, receives the event.
- Use Case: Decoupled systems where publishers and subscribers do not need direct knowledge of each other.
Event-Driven Communication:
- Agents Involved:
TriggerEvent,ReactiveAgent,NextStep - Flow:
- An event occurs (
TriggerEvent). ReactiveAgentdetects the event and acts.- The action leads to the
NextStepin the process.
- An event occurs (
- Use Case: Systems that need to respond to asynchronous events or changes in the environment.
Since, we now understand the basic communication types. Let us understand the AutoGen generated first code & the last code (That satisfies our need) –
# filename: simple_snake.py (Generated by AutoGen)
import pygame
import time
import random
snake_speed = 15
# Window color
white = pygame.Color(255, 255, 255)
# Snake color
green = pygame.Color(0, 255, 0)
snake_position = [100, 50]
# defining first 4 blocks
# of snake body
snake_body = [ [100, 50],
[90, 50],
[80, 50],
[70, 50]
]
# fruit position
fruit_position = [random.randrange(1, (1000//10)) * 10,
random.randrange(1, (600//10)) * 10]
fruit_spawn = True
direction = 'RIGHT'
change_to = direction
score = 0
# Initialising pygame
pygame.init()
# Initialise game window
win = pygame.display.set_mode((1000, 600))
pygame.display.set_caption("Snake game for kids")
# FPS (frames per second) controller
fps_controller = pygame.time.Clock()
while True:
# handling key events
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
change_to = 'UP'
if event.key == pygame.K_DOWN:
change_to = 'DOWN'
if event.key == pygame.K_LEFT:
change_to = 'LEFT'
if event.key == pygame.K_RIGHT:
change_to = 'RIGHT'
# If two keys pressed simultaneously
# we don't want snake to move into two
# directions simultaneously
if change_to == 'UP' and direction != 'DOWN':
direction = 'UP'
if change_to == 'DOWN' and direction != 'UP':
direction = 'DOWN'
if change_to == 'LEFT' and direction != 'RIGHT':
direction = 'LEFT'
if change_to == 'RIGHT' and direction != 'LEFT':
direction = 'RIGHT'
# Moving the snake
if direction == 'UP':
snake_position[1] -= 10
if direction == 'DOWN':
snake_position[1] += 10
if direction == 'LEFT':
snake_position[0] -= 10
if direction == 'RIGHT':
snake_position[0] += 10
# Snake body growing mechanism
# if fruits and snakes collide then scores
# will increase by 10
snake_body.insert(0, list(snake_position))
if snake_position[0] == fruit_position[0] and snake_position[1] == fruit_position[1]:
score += 10
fruit_spawn = False
else:
snake_body.pop()
if not fruit_spawn:
fruit_position = [random.randrange(1, (1000//10)) * 10,
random.randrange(1, (600//10)) * 10]
fruit_spawn = True
win.fill(white)
for pos in snake_body:
pygame.draw.rect(win, green, pygame.Rect(pos[0], pos[1], 10, 10))
pygame.draw.rect(win, white, pygame.Rect(
fruit_position[0], fruit_position[1], 10, 10))
# Game Over conditions
if snake_position[0] < 0 or snake_position[0] > 1000-10:
break
if snake_position[1] < 0 or snake_position[1] > 600-10:
break
# Touching the snake body
for block in snake_body[1:]:
if snake_position[0] == block[0] and snake_position[1] == block[1]:
break
# refresh game screen
pygame.display.update()
# Frame Per Second /Refresh rate
fps_controller.tick(snake_speed)
# displaying final score after game over
print(f"You scored {score} in the game.")Now, let us remember the prompt refinement that we’ve done (We’ve already posted that in our last post as well) –
I want to place the snake within the boundary of the visual wall & it should bounce each wall & then hit the target. And, it should increase the size. And, every time when it hits the target it will increase the score by 10. And, the application will run for 2 minutes, which will be displayed on the screen. This will exit once 2 minute is over.
# filename: simple_snake.py (Generated by AutoGen)
import pygame
import time
import random
import math
pygame.init()
white = (255, 255, 255)
yellow = (255, 255, 102)
green = (0, 255, 0)
red = (255, 0, 0)
black = (0, 0, 0)
blue = (0, 0, 255)
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game')
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 30
font_style = pygame.font.SysFont(None, 50)
score_font = pygame.font.SysFont(None, 35)
def our_snake(snake_block, snake_List):
for x in snake_List:
pygame.draw.rect(dis, green, [x[0], x[1], snake_block, snake_block])
def message(msg,color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 3, dis_height / 3])
def gameLoop(): # creating a function
game_over = False
game_close = False
# snake starting coordinates
x1 = dis_width / 2
y1 = dis_height / 2
# snake initial movement direction
x1_change = 0
y1_change = 0
# initialize snake length and list of coordinates
snake_List = []
Length_of_snake = 1
# random starting point for the food
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
# initialize score
score = 0
# store starting time
start_time = time.time()
while not game_over:
# Remaining time
elapsed_time = time.time() - start_time
remaining_time = 120 - elapsed_time # 2 minutes game
if remaining_time <= 0:
game_over = True
# event handling loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True # when closing window
if event.type == pygame.MOUSEBUTTONUP:
# get mouse click coordinates
pos = pygame.mouse.get_pos()
# calculate new direction vector from snake to click position
x1_change = pos[0] - x1
y1_change = pos[1] - y1
# normalize direction vector
norm = math.sqrt(x1_change ** 2 + y1_change ** 2)
if norm != 0:
x1_change /= norm
y1_change /= norm
# multiply direction vector by step size
x1_change *= snake_block
y1_change *= snake_block
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, red, [foodx, foody, snake_block, snake_block])
pygame.draw.rect(dis, green, [x1, y1, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
our_snake(snake_block, snake_List)
# Bounces the snake back if it hits the edge
if x1 < 0 or x1 > dis_width:
x1_change *= -1
if y1 < 0 or y1 > dis_height:
y1_change *= -1
# Display score
value = score_font.render("Your Score: " + str(score), True, black)
dis.blit(value, [0, 0])
# Display remaining time
time_value = score_font.render("Remaining Time: " + str(int(remaining_time)), True, blue)
dis.blit(time_value, [0, 30])
pygame.display.update()
# Increase score and length of snake when snake gets the food
if abs(x1 - foodx) < snake_block and abs(y1 - foody) < snake_block:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
score += 10
# Snake movement speed
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
Now, let us understand the difference here –
The first program is a snake game controlled by arrow keys that end if the Snake hits a wall or itself. The second game uses mouse clicks for control, bounces off walls instead of ending, includes a 2-minute timer, and displays the remaining time.
So, we’ve done it. 🙂
You can find the detailed code in the following Github link.
I’ll bring some more exciting topics in the coming days from the Python verse.
Till then, Happy Avenging! 🙂
Note: All the data & scenarios posted here are representational data & scenarios & available over the internet & for educational purposes only. There is always room for improvement in this kind of model & the solution associated with it. I’ve shown the basic ways to achieve the same for educational purposes only.
One thought on “Building solutions using LLM AutoGen in Python – Part 3”