Create Ludo Game Project in Python [Source Code Included]

Upgrade Your Skills, Upgrade Your Career - Learn more

We all would have played the Ludo Game with our friends or family members? It would be fun to take revenge by killing someone’s token right? It is more fun to play the game built on your game. So, gear up to build the Ludo Game using Python.

What is a Ludo Game?

Ludo Game is a board game for two to four-player in which the players try to move their four tokens from start to end by rolling a die at their turns. The turns are taken circularly by each player.

In each turn, he/she throws a die and moves a token by the number appearing, aiming to reach the end and trying to prevent the other player(s) from winning.

Ludo Game, a Python project

To build this game, we will be using the PyGame and Random modules. We use the PyGame module to build the main game window and to control the game. While the random module is used to get a number from 1 to 6 on throwing a die.

Download the Ludo Game in Python

Please download the source code for the Ludo Game in Python using the link: Ludo Game Project

Project Prerequisites

The knowledge of Python and the Pygame module would be required by the developer to build the project. You can download the Pygame and the random modules using the following commands:

pip install random2
pip install pygame

Project Structure

We will follow the below steps to build the Ludo Game:

1. Import the required modules

2. Creating a class each for the tokens and the grids

3. Creating global variables

4. Creating all the token and grid objects

5. Writing function to draw grid

6. Writing functions to move the tokens

7. Function to Move the Computer Token Automatically

8. Writing functions to check id, current player and collision of two players

9. Writing the function to get next player

10. Writing the main game

11. Creating the main window

1. Import the required modules

import pygame
import random
from pygame.locals import *
import sys
from pygame import font
import time

Code explanation:

a. Pygame module helps in building in window and controls for the ludo game

b. Random is used to get a number on rolling the dice

c. Pygame.locals imports all the constants in Pygame

2. Creating a class each for the tokens and the grids

class gridObj:
    def __init__(self, bgColor, playerList, safe, coordinate):
        self.bgColor = bgColor
        self.playerList = playerList
        self.safe = safe
        self.coordinate = coordinate


class Token:
    def __init__(self, Id, color, state, coordinate,size):
        self.Id = Id
        self.color = color
        self.state = state
        self.coordinate = coordinate
        self.size=size
        self.original_coordinate = coordinate

Code explanation:

a. The gridObj() class is for each grid on the window that decides the color at that particular coordinate on the window. And also holds the information about the player at the location and if that location is safe for multiple players to land.

b. The Token() class creates a token for each of the four players. Each token holds the information about its color, radius state and location.

3. Creating global variables

cList = [(1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 5), (6, 4), (6, 3), (6, 2), (6, 1), (6, 0), (7, 0), (8, 0), (8, 1),
          (8, 2), (8, 3), (8, 4), (8, 5), (9, 6), (10, 6), (11, 6), (12, 6), (13, 6), (14, 6), (14, 7),(14, 8), (13, 8),
          (12, 8), (11, 8), (10, 8), (9, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (7, 14),(6, 14), (6, 13),
          (6, 12), (6, 11), (6, 10), (6, 9), (5, 8), (4, 8), (3, 8), (2, 8), (1, 8), (0, 8), (0, 7),(0, 6)]
#RGBY
initPos=[[[1,1],[1,4],[4,1],[4,4]],[[10,1],[13,1],[10,4],[13,4]],[[1,10],[4,10],[1,13],[4,13]],[[10,10],[10,13],[13,10],[13,13]]]
pnames=['R','G','B','Y']

height = 1000
width = 800
initx = 0
inity = 0
currentPlayer = 'R'
compTokensLoc=[[1,1],[1,4],[4,1],[4,4]]
n=2
withComputer=False
dice_clicked = False
move_list = []
diceValue = 6


Game_grid = [[-1 for _ in range(15)] for _ in range(15)]
colors=['white','red','green','yellow','blue','black']
colorMatrix = [[-1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 2, 2, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 2, 2, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 2, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 2, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 2, 0, -1, -1, -1, -1, -1, -1],
                [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0],
                [0, 1, 1, 1, 1, 1, 0, 5, 0, 4, 4, 4, 4, 4, 0],
                [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0],
                [-1, -1, -1, -1, -1, -1, 0, 3, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 3, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 3, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 3, 3, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 3, 3, 0, -1, -1, -1, -1, -1, -1],
                [-1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1]]
coordinateMatrix = [[[initx + i * 50, inity + j * 50] for i in range(0, 15)] for j in range(0, 15)]
safeLocs=[[6,2],[8,1],[12,6],[13,8],[8,12],[6,13],[2,8],[1,6]]
safeMatrix = [[0 for i in range(15)] for j in range(15)]

for i in safeLocs:
    safeMatrix[i[0]][i[1]] = 1

diceFaces = {1: [[0, 0, 0], [0, 1, 0], [0, 0, 0]],
           2: [[0, 1, 0], [0, 0, 0], [0, 1, 0]],
           3: [[0, 1, 0], [0, 1, 0], [0, 1, 0]],
           4: [[1, 0, 1], [0, 0, 0], [1, 0, 1]],
           5: [[1, 0, 1], [0, 1, 0], [1, 0, 1]],
           6: [[1, 0, 1], [1, 0, 1], [1, 0, 1]],
               }

Code explanation:

a. In this step we create the global variables that can be used while creating and running the game

b. The cList holds the center locations of the grid and the initPos holds the initial positions of the tokens

c. The pnames variable has the names of the tokens, height and width decide the size of the game window. And the initx, inity are the initial x and y coordinates

d. The variable compTokensLoc holds the locations of the four tokens in case the game mode is with Computer. This will help in tracking the location of computer’s tokens for moving them automatically.

e. The currentPlayer holds the name of the player playing the game, the dice_clicked is a boolean variable that stores if the user pressed a mouse button. And the diceValue is the value of the dice showing on rolling.

f. The variable ‘n’ holds the number of players being played based on the user’s choice and the ‘withComputer’ variable is True when the game is being played with the computer else False.

g. The Game_grid is the mail game window, colorMatrix sets the color to the locations on the grid based on the colors in the colors list.

h. The list safeLocs is the locations where multiple tokens can stay. And these locations are set 1 in the safeMatrix

i. Finally, the diceFaces helps in showing the dice values on the screen. For example, for showing 1 we need a dot in the middle. So, the corresponding 3×3 matrix is [[0, 0, 0], [0, 1, 0], [0, 0, 0]], with 1 in the middle of the matrix.

4. Creating all the token and grid objects

for i in range(15):
    for j in range(15):
        ob = gridObj(colors[colorMatrix[i][j]], [], safeMatrix[i][j], coordinateMatrix[i][j])
        Game_grid[i][j] = ob

for j in range(4):
    for i in range(1,5):
        p=initPos[j][i-1]
        R= Token(pnames[j]+str(i), colors[j+1], 0, (50 *p[0] , 50 * p[1]), 20)
        Game_grid[p[0]][p[1]].playerList.append(R)

Code explanation:

a. Now we will create the 15×15 grid objects for the window using the loop with the color and other properties decided by the global variables above.

b. Then we create the 16 tokens, 4 of each color, with the attributes name, color, size and position.

5. Writing function to draw grid

def drawGrid():
    global Game_grid
    newSurface = pygame.display.set_mode((height, width))
    newSurface.fill('bisque')
    for i in range(15):
        for j in range(15):
            pygame.draw.rect(newSurface, Game_grid[i][j].bgColor, tuple(Game_grid[i][j].coordinate + [50, 50]))
            pygame.draw.rect(newSurface, (0, 0, 0), tuple(Game_grid[i][j].coordinate + [50, 50]), 1)

    # always constant
    pygame.draw.rect(newSurface, colors[1], (initx, inity, 300, 300))
    pygame.draw.rect(newSurface, colors[0], (initx + 50, inity + 50, 200, 200))
    pygame.draw.rect(newSurface, colors[2], (initx + 450, inity, 300, 300))
    pygame.draw.rect(newSurface, colors[0], (initx + 500, inity + 50, 200, 200))
    pygame.draw.rect(newSurface, colors[3], (initx, inity + 450, 300, 300))
    pygame.draw.rect(newSurface, colors[0], (initx + 50, inity + 500, 200, 200))
    pygame.draw.rect(newSurface, colors[4], (initx + 450, inity + 450, 300, 300))
    pygame.draw.rect(newSurface, colors[0], (initx + 500, inity + 500, 200, 200))

    for i in range(15):
        for j in range(15):
            relativeToken(Game_grid[i][j].playerList, i * 50, j * 50)
            for k in Game_grid[i][j].playerList:
                c = k.coordinates
                pygame.draw.circle(newSurface, k.color, (c[0] + 25, c[1] + 25), k.size)
                pygame.draw.circle(newSurface, colors[-1], (c[0] + 25, c[1] + 25), k.size, 1)
                # highlight
                if k.Id[0] == currentPlayer:
                    pygame.draw.circle(newSurface, colors[0], (c[0] + 25, c[1] + 25), k.size - 2, 2)
    # chess_faces

    face = diceFaces[diceValue]
    for i in range(3):
        for j in range(3):
            pygame.draw.rect(newSurface, 'black', ((0 + 800) + (50 * j), (0 + 300) + (50 * i), 50, 50))
            if face[i][j] == 1:
                cIndex=pnames.index(currentPlayer)+1
                pygame.draw.circle(newSurface, colors[cIndex], ((0 + 800) + (50 * j) + 25, (0 + 300) + (50 * i) + 25),
                                   10)
    pygame.draw.rect(newSurface, colors[pnames.index(currentPlayer)+1], ((0 + 798), (0 + 298), 150, 150), 4)
    return newSurface

Code explanation:

a. This function is used to draw the grid and this executes in the main while loop to show the updates on the screen.

b. In this, we first create the surface of the predefined height and width. Then, we place the grid objects created in the previous step.

c. After this, we draw the boxes that hold the tokens on the 4 corners and then the 16 tokens

d. Finally, we draw the dice

6. Writing functions to move the tokens

def move(initPos, value, current):
    i = 0
    j = -1
    flag = 0
    while True:
        if cList[i] == initPos or j >= 0:
            if current == 'R' and i == 50:
                flag = 1
            if current == 'G' and i == 11:
                flag = 2
            if current == 'B' and i == 37:
                flag = 3
            if current == 'Y' and i == 24:
                flag = 4
            j += 1
            if j == value:
                break
        i = (i + 1) % len(cList)
    if flag == 1:
        return (cList[i][0] + 1, cList[i][1] + 1)
    elif flag == 2:
        return (cList[i][0] + 1, cList[i][1] + 1)
    elif flag == 3:
        return (cList[i][0] + 1, cList[i][1] - 1)
    elif flag == 4:
        return (cList[i][0] - 1, cList[i][1] - 1)
    else:
        return (cList[i][0], cList[i][1])


def relativeToken(pList, x, y):
    l = len(pList)
    relRad = int((2 / (l + 1)) * 20)
    relpt = []
    j = 0
    if l % 2 == 0:
        l1 = [i + 1 for i in range((l // 2))]
        l2 = [i - 1 for i in range((l // 2))]
        relpt = l2[::-1] + l1
    else:
        l1 = [i + 1 for i in range((l // 2))]
        l2 = [i - 1 for i in range((l // 2))]
        relpt = l2[::-1] + [0] + l1
    for p in pList:
        p.size = relRad
        p.coordinates = ((x) + (relpt[j] * (relRad // 2)), (y))
        j += 1

Code explanation:

a. In the function move(), we control the movement based on the value on the dice, current position of the respective token and the set of rules.

b. And the function relativeToken() returns the relative size and position based on the coordinates

7. Writing functions to check id, current player and collision of two players

def check(pos):
    if pos in cList:
        return True
    else:
        return False
    
def gridlocation(pos):
    x = pos[0]
    y = pos[1]
    return (x // 50, y // 50)

        
def checkCollision(pList):
    global currentPlayer
    global Game_grid
    new_list=[]
    for p in pList:
        if p.Id[0] == currentPlayer:
            new_list.append(p)
        else:
            p.coordinates=p.original_coordinate
            i=p.coordinates[0]//50
            j=p.coordinates[1]//50
            Game_grid[i][j].playerList.append(p)
    return new_list

def checkId(pList):
    global currentPlayer
    for i in pList:
        if i.Id[0] == currentPlayer:
            return True
    return False

Code explanation:

a. The function check() returns if the position of the token is in the cList

b. The gridlocation() function makes sure the token moves within the grid and gives the corresponding position

c. checkCollision() function check if two token are ending up in the same grid location

d. checkId() checks which token of the current player is to be moved

8. Function to Move the Computer Token Automatically

def compLoc(diceValue):
    global compTokensLoc
    saveLocs=[(1, 7),(2, 7),(3, 7),(4, 7),(5, 7),(6, 7),(7, 7)]
    inits=[]
    players=[]
    if(compTokensLoc[0]==[1,1]):
        inits.append(0)
    else:
        players.append(0)
    if(compTokensLoc[1]==[1,4]):
        inits.append(1)
    else:
        players.append(1)
    if(compTokensLoc[2]==[4,1]):
        inits.append(2)
    else:
        players.append(2)
    if(compTokensLoc[3]==[4,4]):
        inits.append(3)
    else:
        players.append(3)
    if(diceValue==6 and len(inits)>0):
        tkn=random.randint(1,len(inits))
        compTokensLoc[tkn-1]=cList[0]
        return compTokensLoc[tkn-1]
    cnt=len(compTokensLoc)-len(inits)
    print(inits)
    if(cnt<=0):
        return (1,1)
    if(cnt>0):
        
        tkn=random.randint(1,cnt)
        tkn=players[tkn-1]
        print(tkn)
        ind=cList.index(compTokensLoc[tkn])
        if(compTokensLoc[tkn] in saveLocs):
            ind=saveLocs.index(compTokensLoc[tkn])
            if((ind+diceValue) <=(len(saveLocs-1))):
                compTokensLoc[tkn]=saveLocs[ind+diceValue]
                return compTokensLoc[tkn]
            else:
                compLoc(diceValue)
        elif(ind+diceValue<len(cList)-1):
            compTokensLoc[tkn]=cList[ind+diceValue]

        else:
            stepsLeft= diceValue-(len(cList)-1)
            compTokensLoc[tkn]=saveLocs[stepsLeft-1]
        return compTokensLoc[tkn] 

Code explanation:

a. In this, we check the number of the tokens at the initial positions and save them in the list inits and the others in players.

b. If the dice value is 6 then we move one of the tokens at the initial position, if there is any. If not, we move one of the 4 tokens.

c. While moving one of the tokens, we move them across the track using the cList to get the position to move to.

d. When the computer token (red token) is done moving on the main track, it moves across the path that leads to the center following the positions in the list saveLocs.

9. Writing the Function to get the Next Player

def nextPlayer():
    global n,currentPlayer
    if(n==2):
        if currentPlayer == 'R':
            currentPlayer = 'B'
        elif currentPlayer == 'B':
            currentPlayer = 'R'
    elif(n==3):
        if currentPlayer == 'R':
            currentPlayer = 'G'
        elif currentPlayer == 'G':
            currentPlayer = 'Y'
        elif currentPlayer == 'Y':
            currentPlayer = 'R'
    elif(n==4):
        if currentPlayer == 'R':
            currentPlayer = 'G'
        elif currentPlayer == 'G':
            currentPlayer = 'Y'
        elif currentPlayer == 'Y':
            currentPlayer = 'R'
        elif currentPlayer == 'B':
            currentPlayer = 'R'

Code explanation:

a. In this, based on the number of players, we switch from one player to another.

b. If the number of players is 2, the switching is between ‘R’, and ‘B. If 3, then ‘R’, ‘G’, and ‘G’. And If all the four players are playing, then switch between all the 4 of them.

10. Writing the main game

global DISPLAYSURF

def mainGame():
    height = 1000
    width = 800
    pygame.init()
    DISPLAYSURF = pygame.display.set_mode((height, width))
    pygame.display.set_caption('PythonGeeks Ludo Game')
    global cList, initPos,pnames,initx,inity,currentPlayer,n,dice_clicked,move_list,diceValue,Game_grid,colors,colorMatrix, coordinateMatrix,safeMatrix,safeLocs,diceFaces
    

    font = pygame.font.SysFont("Calibri", 30,'bold')
    label = font.render("LUDO GAME", 1, 'black')

    while (True):
        for event in pygame.event.get():
            if(withComputer and currentPlayer=='R') or event.type == MOUSEBUTTONDOWN:
                if(withComputer and currentPlayer=='R'):
                    loc=compLoc(random.randint(1, 6))
                    dice_clicked == True
                elif event.type == MOUSEBUTTONDOWN:
                    loc = gridlocation(event.pos)
                if (loc[0] >= 16 and loc[0] <= 18 and loc[1] >= 6 and loc[1] <= 8 and dice_clicked == False):
                    # dice_value = 6
                    diceValue = random.randint(1, 6)
                    print("dice clicked", currentPlayer)
                    dice_clicked = True
                if diceValue != 6 and dice_clicked == True:
                    print(1)
                    flag = 0
                    for i in cList:
                        for p in Game_grid[i[0]][i[1]].playerList:
                            if p.Id[0] == currentPlayer:
                                flag = 1
                    if flag == 0:
                        nextPlayer()
                        dice_clicked = False

                if currentPlayer == 'R' and diceValue == 6 and (loc in [(1, 1), (4, 1), (4, 4), (1, 4)]) and dice_clicked == True:
                    print(2)
                    print(Game_grid[1][6].playerList)
                    Game_grid[1][6].playerList.append(Game_grid[loc[0]][loc[1]].playerList[0])
                    Game_grid[1][6].playerList[-1].coordinates = (50 * 1, 50 * 6)
                    for p in Game_grid[1][6].playerList:
                        print(p.coordinates)
                    Game_grid[loc[0]][loc[1]].playerList = []
                    dice_clicked = False
                elif currentPlayer == 'G' and diceValue == 6 and (loc in [(10, 1), (13, 1), (13, 4), (10, 4)]) and dice_clicked == True:
                    print(3)
                    print(Game_grid[8][1].playerList)
                    Game_grid[8][1].playerList.append(Game_grid[loc[0]][loc[1]].playerList[0])
                    Game_grid[8][1].playerList[-1].coordinates = (50 * 8, 50 * 1)
                    Game_grid[loc[0]][loc[1]].playerList = []
                    print(Game_grid[8][1].playerList[0].Id)
                    dice_clicked = False
                elif currentPlayer == 'B' and diceValue == 6 and (loc in [(1, 10), (4, 10), (4, 13), (1, 13)]) and dice_clicked == True:
                    print(5)
                    print(Game_grid[6][13].playerList)
                    Game_grid[6][13].playerList.append(Game_grid[loc[0]][loc[1]].playerList[0])
                    Game_grid[6][13].playerList[-1].coordinates = (50 * 6, 50 * 13)
                    Game_grid[loc[0]][loc[1]].playerList = []
                    dice_clicked = False

                elif currentPlayer == 'Y' and diceValue == 6 and (loc in [(10, 10), (13, 10), (13, 13), (10, 13)]) and dice_clicked == True:
                    print(4)
                    print(Game_grid[13][8].playerList)
                    Game_grid[13][8].playerList.append(Game_grid[loc[0]][loc[1]].playerList[0])
                    Game_grid[13][8].playerList[-1].coordinates = (50 * 13, 50 * 8)
                    Game_grid[loc[0]][loc[1]].playerList = []
                    dice_clicked = False


                elif currentPlayer == 'R' and (loc in [(1, 7), (2, 7), (3, 7), (4, 7), (5, 7)]) and len(
                        Game_grid[loc[0]][loc[1]].playerList) > 0 and dice_clicked == True:
                    if loc[0] + diceValue <= 6:
                        Game_grid[loc[0] + diceValue][loc[1]].playerList.append(Game_grid[loc[0]][loc[1]].playerList[-1])
                        Game_grid[loc[0] + diceValue][loc[1]].playerList[-1].coordinates = (
                        50 * (loc[0] + diceValue), 50 * (loc[1]))
                        Game_grid[loc[0]][loc[1]].playerList = Game_grid[loc[0]][loc[1]].playerList[:-1]
                    dice_clicked = False

                elif currentPlayer == 'G' and (loc in [(7, 1), (7, 2), (7, 3), (7, 4), (7, 5)]) and len(
                        Game_grid[loc[0]][loc[1]].playerList) > 0 and dice_clicked == True:
                    if loc[1] + diceValue <= 6:
                        Game_grid[loc[0]][loc[1] + diceValue].playerList.append(Game_grid[loc[0]][loc[1]].playerList[-1])
                        Game_grid[loc[0]][loc[1] + diceValue].playerList[-1].coordinates = (
                            50 * (loc[0]), 50 * (loc[1] + diceValue))
                        Game_grid[loc[0]][loc[1]].playerList = Game_grid[loc[0]][loc[1]].playerList[:-1]
                    dice_clicked = False

                elif currentPlayer == 'B' and (loc in [(7, 9), (7, 10), (7, 11), (7, 12), (7, 13)]) and len(
                        Game_grid[loc[0]][loc[1]].playerList) > 0 and dice_clicked == True:
                    if loc[1] + diceValue >= 8:
                        Game_grid[loc[0]][loc[1] + diceValue].playerList.append(Game_grid[loc[0]][loc[1]].playerList[-1])
                        Game_grid[loc[0]][loc[1] + diceValue].playerList[-1].coordinates = (
                            50 * (loc[0]), 50 * (loc[1] + diceValue))
                        Game_grid[loc[0]][loc[1]].playerList = Game_grid[loc[0]][loc[1]].playerList[:-1]
                    dice_clicked = False

                elif currentPlayer == 'Y' and (loc in [(9, 7), (10, 7), (11, 7), (12, 7), (13, 7)]) and len(
                    Game_grid[loc[0]][loc[1]].playerList) > 0 and dice_clicked == True:
                    if loc[0] - diceValue >=8:
                        Game_grid[loc[0] - diceValue][loc[1]].playerList.append(Game_grid[loc[0]][loc[1]].playerList[-1])
                        Game_grid[loc[0] - diceValue][loc[1]].playerList[-1].coordinates = (
                            50 * (loc[0] - diceValue), 50 * (loc[1]))
                        Game_grid[loc[0]][loc[1]].playerList = Game_grid[loc[0]][loc[1]].playerList[:-1]
                    dice_clicked = False

                elif (check(loc)) and checkId(Game_grid[loc[0]][loc[1]].playerList) and dice_clicked == True:
                    print(6)
                    newpos = move(loc, diceValue, currentPlayer)
                    new_list = []
                    flg = 0
                    for i in Game_grid[loc[0]][loc[1]].playerList:
                        if i.Id[0] == currentPlayer and flg == 0:
                            Game_grid[newpos[0]][newpos[1]].playerList.append(i)
                            Game_grid[newpos[0]][newpos[1]].playerList[-1].coordinates = (50 * newpos[0], 50 * newpos[1])
                            #eating pieces
                            Game_grid[newpos[0]][newpos[1]].playerList=checkCollision(Game_grid[newpos[0]][newpos[1]].playerList)
                            flg = 1
                        else:
                            new_list.append(i)
                    Game_grid[loc[0]][loc[1]].playerList = new_list
                    dice_clicked = False

                    if diceValue != 6:
                        nextPlayer()

                # DISPLAYSURF.blit(drawGrid(), (0, 0))
                # pygame.display.update()
            font1 = pygame.font.SysFont("Calibri", 50)
            label1 = font1.render(str(diceValue), 1, 'black')

            DISPLAYSURF.blit(drawGrid(), (0, 0))
            DISPLAYSURF.blit(label, (800, 10))
            DISPLAYSURF.blit(label1, (850, 500))
            pygame.display.update()


            if event.type == QUIT:
                pygame.quit()
                sys.exit()

Code explanation:

a. This part of the code controls the whole game with the help of the program we wrote in the previous steps

b. In this, first we create the game window. Then run the code in an infinite while loop that runs till the exit button is pressed by the user.

c. We check if the user presses the button and then we get a random diceValue.

d. And if the player is playing with the computer, the dice value is randomly choosen when computer’s chance arrives. And use the compLoc() function to get the location where the token needs to be moved.

e. After this, we check if the dice value is 6 and if the token selected is in the starting position. Based on that we move the corresponding token to the main track.

f. And if the above conditions are not met, then we check if the token is in the track area that points to the center final location and move the token if the dice value is valid.

g. If not, then we move the token normally on the main track. After this, we give the chance to the next player to roll the dice.

h. Finally, we update the whole grid by calling drawGrid() function. And then adding labels to show the value on the dice

i. And if the user presses the exit button, then we close the game.

11. Code of the Main Window

pygame.init()
screen = pygame.display.set_mode((1000, 600))
pygame.display.set_caption('PythonGeeks Ludo Game')
clock = pygame.time.Clock()
font = pygame.font.SysFont("Arial", 20)
 
class Button:
    """Create a button, then blit the surface in the while loop"""
 
    def __init__(self, text,num,comp,pos, font, bg="blue", feedback=""):
        self.x, self.y = pos
        self.font = pygame.font.SysFont("Arial", font)
        self.no=num
        self.text=text
        self.text = self.font.render(self.text, 1, pygame.Color("White"))
        self.cmp=comp
        self.change_text(bg)
 
    def change_text(self, bg="blue"):
        self.size = self.text.get_size()
        self.surface = pygame.Surface(self.size)
        self.surface.fill(bg)
        self.surface.blit(self.text, (0, 0))
        self.rect = pygame.Rect(self.x, self.y, self.size[0], self.size[1])
 
    def show(self):
        screen.blit(self.text , (self.x, self.y))
 
    def click(self, event):
        x, y = pygame.mouse.get_pos()
        font1 = pygame.font.SysFont("Calibri", 50)
        label1 = font1.render("PythonGeeks Ludo Game", 1, 'yellow')
        screen.blit(label1, (230, 30))
        if event.type == pygame.MOUSEBUTTONDOWN:
            if pygame.mouse.get_pressed()[0]:
                if self.rect.collidepoint(x, y):
                    global n,withComputer
                    n=self.no
                    withComputer=self.cmp
                    print(n,",",withComputer)
                    pygame.quit()
                    mainGame()
 
 
def mainloop():
    """ The infinite loop where things happen """
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            button1.click(event)
            button2.click(event)
            button3.click(event)
            button4.click(event)
        button1.show()
        button2.show()
        button3.show()
        button4.show()
      
        clock.tick(30)
        pygame.display.update()
 

button1 = Button(
    "Play with Computer",2,True,
    (400, 150),
    font=30,
    bg="navy")


button2 = Button(
    "2 Players",2,False,
    (400, 250),
    font=30,
    bg="navy")

button3 = Button(
    "3 Players",3,False,
    (400, 350),
    font=30,
    bg="navy",)

button4 = Button(
    "4 Players",4,False,
    (400, 450),
    font=30,
    bg="navy",)
 
mainloop()

Code explanation:

a. In this we create a window and add the buttons

b. A Button class is created to name the buttons, place them on screen based on the position given. And then run the respective function based on the button clicked by modifying n, withComputer, and running mainGame() function.

c. The click of any of the buttons is checked continuously using a while loop.

Python Ludo Game Output

ludo game output

Summary

Congratulations! We have successfully built the Ludo game using Python. In this project, we got to deal with the random and Pygame modules of Python. Hope this project was helpful. What are you waiting for? Pull your friends and family members to play the game!

If you are Happy with PythonGeeks, do not forget to make us happy with your positive feedback on Google | Facebook


PythonGeeks Team

The PythonGeeks Team offers industry-relevant Python programming tutorials, from web development to AI, ML and Data Science. With a focus on simplicity, we help learners of all backgrounds build their coding skills.

14 Responses

  1. Vivek Kumar says:

    Sir muje apna ludu gem banana he

  2. Devashish Rattan says:

    There us no logic implemented to win the game.
    The peice keeps on moving in the same circle even if the peice travels through the board.

  3. Ravta ram says:

    Escod

  4. Ravta ram says:

    Code sahiye

  5. Ludo Game says:

    Play the game

  6. Ludo Game says:

    Lodo game

  7. Ludo Game says:

    Creating a Ludo game involves several components, such as game logic, user interface, and multiplayer functionality. Below is a simplified guide and an example for coding a basic Ludo game in Python using Pygame. You can expand it further for advanced features.

    Steps to Code a Ludo Game

    1. Plan the Game Logic

    Define the board structure (4 player zones with paths leading to the center).

    Define rules like dice rolls, movement, safe spots, and winning conditions.

    2. Set Up the Environment

    Install Python and the Pygame library using:

    pip install pygame

    3. Build the Board

    Create a visual representation of the Ludo board using Pygame.

    4. Add Dice Functionality

    Use random.randint(1, 6) to simulate a dice roll.

    5. Piece Movement

    Define how pieces move based on dice rolls and validate legal moves.

    6. Multiplayer Functionality

    Allow multiple players to take turns and implement basic AI if needed.

    7. Winning Conditions

    Check if all pieces of a player reach the home area to declare the winner.

    Example Code: Simple Ludo Game in Python (Pygame)

    Here’s a basic structure for a Ludo game:

    import pygame
    import random

    # Initialize Pygame
    pygame.init()

    # Screen Dimensions
    WIDTH, HEIGHT = 600, 600
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption(“Ludo Game”)

    # Colors
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    BLUE = (0, 0, 255)
    GREEN = (0, 255, 0)
    YELLOW = (255, 255, 0)

    # Dice Function
    def roll_dice():
    return random.randint(1, 6)

    # Draw Board Function
    def draw_board():
    screen.fill(WHITE)
    pygame.draw.rect(screen, RED, (0, 0, WIDTH//3, HEIGHT//3))
    pygame.draw.rect(screen, GREEN, (WIDTH*2//3, 0, WIDTH//3, HEIGHT//3))
    pygame.draw.rect(screen, BLUE, (0, HEIGHT*2//3, WIDTH//3, HEIGHT//3))
    pygame.draw.rect(screen, YELLOW, (WIDTH*2//3, HEIGHT*2//3, WIDTH//3, HEIGHT//3))
    pygame.draw.rect(screen, BLACK, (WIDTH//3, HEIGHT//3, WIDTH//3, HEIGHT//3), 3)

    # Main Loop
    running = True
    current_player = 1
    dice_roll = 0

    while running:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    running = False
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE: # Roll dice with SPACE key
    dice_roll = roll_dice()
    print(f”Player {current_player} rolled a {dice_roll}”)
    current_player = current_player % 4 + 1 # Rotate turns

    # Drawing
    draw_board()

    # Display Dice Roll
    font = pygame.font.Font(None, 74)
    dice_text = font.render(f”Dice: {dice_roll}”, True, BLACK)
    screen.blit(dice_text, (WIDTH//2 – dice_text.get_width()//2, HEIGHT//2 – dice_text.get_height()//2))

    pygame.display.flip()

    # Quit Pygame
    pygame.quit()

    How This Works

    1. Board Setup: The board is divided into 4 colored zones for players.

    2. Dice Rolls: The roll_dice() function simulates dice rolls when the space key is pressed.

    3. Player Turns: Turns alternate between 4 players, and the dice roll is displayed on the screen.

    Next Steps

    Add Player Pieces: Create movable pieces with their positions stored as coordinates or indexes.

    Define Rules: Include safe spots, block capturing, and movement logic.

    Add Multiplayer: Allow user input or implement AI for single-player mode.

    Visual Enhancements: Add animations for dice rolls and piece movement.

    If you want a more advanced version or specific functionality, let me know!

  8. Ludo Game says:

    A game name is Ludo game play ▶️
    Injoy the game

  9. Nirbhay tank says:

    No one programming one erray

  10. Lodo says:

    Hello

  11. Emmanuel Amegashie says:

    I like it

  12. Amrit says:

    Mere ko ludo banana hai bro

  13. Virk Shahib says:

    Is best but there is no players and how we can play this ludo game

Leave a Reply

Your email address will not be published. Required fields are marked *