banner



2048 Computer Programming

In this article we will look python code and logic to design a 2048 game you have played very often in your smartphone. If you are not familiar with the game, it is highly recommended to first play the game so that you can understand the basic functioning of it.

How to play 2048 :

 Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning - Basic Level Course

1. There is a 4*4 grid which can be filled with any number. Initially two random cells are filled with 2 in it. Rest cells are empty.


2. we have to press any one of four keys to move up, down, left, or right. When we press any key, the elements of the cell move in that direction such that if any two identical numbers are contained in that particular row (in case of moving left or right) or column (in case of moving up and down) they get add up and extreme cell in that direction fill itself with that number and rest cells goes empty again.

3. After this grid compression any random empty cell gets itself filled with 2.

4. Following the above process we have to double the elements by adding up and make 2048 in any of the cell. If we are able to do that we wins.

5. But if during the game there is no empty cell left to be filled with a new 2, then the game goes over.


In above process you can see the snapshots from graphical user interface of 2048 game. But all the logic lies in the main code. So to solely understand the logic behind it we can assume the above grid to be a 4*4 matrix ( a list with four rows and four columns). You can see below the way to take input and output without GUI for the above game.

Example :

Commands are as follows :  'W' or 'w' : Move Up 'S' or 's' : Move Down 'A' or 'a' : Move Left 'D' or 'd' : Move Right [0, 0, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] [0, 0, 2, 0] Press the command : a GAME NOT OVER [0, 0, 0, 2] [0, 0, 0, 0] [0, 0, 0, 0] [2, 0, 0, 0] Press the command : s GAME NOT OVER [0, 0, 0, 0] [0, 0, 0, 0] [0, 0, 2, 0] [2, 0, 0, 2] Press the command : d GAME NOT OVER [0, 0, 0, 0] [0, 0, 0, 0] [2, 0, 0, 2] [0, 0, 0, 4] Press the command : a GAME NOT OVER [0, 2, 0, 0] [0, 0, 0, 0] [4, 0, 0, 0] [4, 0, 0, 0] Press the command : s GAME NOT OVER [0, 0, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] [8, 2, 0, 2] . . . And the series of input output will go on till we lose or win!

Programming Approach :

  1. We will design each logic function such as we are performing a left swipe then we will use it for right swipe by reversing matrix and performing left swipe.
  2. Moving up can be done by taking transpose then moving left.
  3. Moving down can be done by taking transpose the moving right.
  4. All the logic in the program are explained in detail in the comments. Highly recommended to go through all the comments.

We have two python files below, one is 2048.py which contains main driver code and the other is logic.py which contains all functions used. logic.py should be imported in 2048.py to use these functions. just place both the files in the same folder then run 2048.py will work perfectly.

logic.py

Python3

import random

def start_game():

mat = []

for i in range ( 4 ):

mat.append([ 0 ] * 4 )

print ( "Commands are as follows : " )

print ( "'W' or 'w' : Move Up" )

print ( "'S' or 's' : Move Down" )

print ( "'A' or 'a' : Move Left" )

print ( "'D' or 'd' : Move Right" )

add_new_2(mat)

return mat

def add_new_2(mat):

r = random.randint( 0 , 3 )

c = random.randint( 0 , 3 )

while (mat[r] ! = 0 ):

r = random.randint( 0 , 3 )

c = random.randint( 0 , 3 )

mat[r] = 2

def get_current_state(mat):

for i in range ( 4 ):

for j in range ( 4 ):

if (mat[i][j] = = 2048 ):

return 'WON'

for i in range ( 4 ):

for j in range ( 4 ):

if (mat[i][j] = = 0 ):

return 'GAME NOT OVER'

for i in range ( 3 ):

for j in range ( 3 ):

if (mat[i][j] = = mat[i + 1 ][j] or mat[i][j] = = mat[i][j + 1 ]):

return 'GAME NOT OVER'

for j in range ( 3 ):

if (mat[ 3 ][j] = = mat[ 3 ][j + 1 ]):

return 'GAME NOT OVER'

for i in range ( 3 ):

if (mat[i][ 3 ] = = mat[i + 1 ][ 3 ]):

return 'GAME NOT OVER'

return 'LOST'

def compress(mat):

changed = False

new_mat = []

for i in range ( 4 ):

new_mat.append([ 0 ] * 4 )

for i in range ( 4 ):

pos = 0

for j in range ( 4 ):

if (mat[i][j] ! = 0 ):

new_mat[i][pos] = mat[i][j]

if (j ! = pos):

changed = True

pos + = 1

return new_mat, changed

def merge(mat):

changed = False

for i in range ( 4 ):

for j in range ( 3 ):

if (mat[i][j] = = mat[i][j + 1 ] and mat[i][j] ! = 0 ):

mat[i][j] = mat[i][j] * 2

mat[i][j + 1 ] = 0

changed = True

return mat, changed

def reverse(mat):

new_mat = []

for i in range ( 4 ):

new_mat.append([])

for j in range ( 4 ):

new_mat[i].append(mat[i][ 3 - j])

return new_mat

def transpose(mat):

new_mat = []

for i in range ( 4 ):

new_mat.append([])

for j in range ( 4 ):

new_mat[i].append(mat[j][i])

return new_mat

def move_left(grid):

new_grid, changed1 = compress(grid)

new_grid, changed2 = merge(new_grid)

changed = changed1 or changed2

new_grid, temp = compress(new_grid)

return new_grid, changed

def move_right(grid):

new_grid = reverse(grid)

new_grid, changed = move_left(new_grid)

new_grid = reverse(new_grid)

return new_grid, changed

def move_up(grid):

new_grid = transpose(grid)

new_grid, changed = move_left(new_grid)

new_grid = transpose(new_grid)

return new_grid, changed

def move_down(grid):

new_grid = transpose(grid)

new_grid, changed = move_right(new_grid)

new_grid = transpose(new_grid)

return new_grid, changed

Python3

import random

def start_game():

mat = []

for i in range ( 4 ):

mat.append([ 0 ] * 4 )

print ( "Commands are as follows : " )

print ( "'W' or 'w' : Move Up" )

print ( "'S' or 's' : Move Down" )

print ( "'A' or 'a' : Move Left" )

print ( "'D' or 'd' : Move Right" )

add_new_2(mat)

return mat

def add_new_2(mat):

r = random.randint( 0 , 3 )

c = random.randint( 0 , 3 )

while (mat[r] ! = 0 ):

r = random.randint( 0 , 3 )

c = random.randint( 0 , 3 )

mat[r] = 2

def get_current_state(mat):

for i in range ( 4 ):

for j in range ( 4 ):

if (mat[i][j] = = 2048 ):

return 'WON'

for i in range ( 4 ):

for j in range ( 4 ):

if (mat[i][j] = = 0 ):

return 'GAME NOT OVER'

for i in range ( 3 ):

for j in range ( 3 ):

if (mat[i][j] = = mat[i + 1 ][j] or mat[i][j] = = mat[i][j + 1 ]):

return 'GAME NOT OVER'

for j in range ( 3 ):

if (mat[ 3 ][j] = = mat[ 3 ][j + 1 ]):

return 'GAME NOT OVER'

for i in range ( 3 ):

if (mat[i][ 3 ] = = mat[i + 1 ][ 3 ]):

return 'GAME NOT OVER'

return 'LOST'

def compress(mat):

changed = False

new_mat = []

for i in range ( 4 ):

new_mat.append([ 0 ] * 4 )

for i in range ( 4 ):

pos = 0

for j in range ( 4 ):

if (mat[i][j] ! = 0 ):

new_mat[i][pos] = mat[i][j]

if (j ! = pos):

changed = True

pos + = 1

return new_mat, changed

def merge(mat):

changed = False

for i in range ( 4 ):

for j in range ( 3 ):

if (mat[i][j] = = mat[i][j + 1 ] and mat[i][j] ! = 0 ):

mat[i][j] = mat[i][j] * 2

mat[i][j + 1 ] = 0

changed = True

return mat, changed

def reverse(mat):

new_mat = []

for i in range ( 4 ):

new_mat.append([])

for j in range ( 4 ):

new_mat[i].append(mat[i][ 3 - j])

return new_mat

def transpose(mat):

new_mat = []

for i in range ( 4 ):

new_mat.append([])

for j in range ( 4 ):

new_mat[i].append(mat[j][i])

return new_mat

def move_left(grid):

new_grid, changed1 = compress(grid)

new_grid, changed2 = merge(new_grid)

changed = changed1 or changed2

new_grid, temp = compress(new_grid)

return new_grid, changed

def move_right(grid):

new_grid = reverse(grid)

new_grid, changed = move_left(new_grid)

new_grid = reverse(new_grid)

return new_grid, changed

def move_up(grid):

new_grid = transpose(grid)

new_grid, changed = move_left(new_grid)

new_grid = transpose(new_grid)

return new_grid, changed

def move_down(grid):

new_grid = transpose(grid)

new_grid, changed = move_right(new_grid)

new_grid = transpose(new_grid)

return new_grid, changed

2048.py

Python3

import logic

if __name__ = = '__main__' :

mat = logic.start_game()

while ( True ):

x = input ( "Press the command : " )

if (x = = 'W' or x = = 'w' ):

mat, flag = logic.move_up(mat)

status = logic.get_current_state(mat)

print (status)

if (status = = 'GAME NOT OVER' ):

logic.add_new_2(mat)

else :

break

elif (x = = 'S' or x = = 's' ):

mat, flag = logic.move_down(mat)

status = logic.get_current_state(mat)

print (status)

if (status = = 'GAME NOT OVER' ):

logic.add_new_2(mat)

else :

break

elif (x = = 'A' or x = = 'a' ):

mat, flag = logic.move_left(mat)

status = logic.get_current_state(mat)

print (status)

if (status = = 'GAME NOT OVER' ):

logic.add_new_2(mat)

else :

break

elif (x = = 'D' or x = = 'd' ):

mat, flag = logic.move_right(mat)

status = logic.get_current_state(mat)

print (status)

if (status = = 'GAME NOT OVER' ):

logic.add_new_2(mat)

else :

break

else :

print ( "Invalid Key Pressed" )

print (mat)

Output :


2048 Computer Programming

Source: https://www.geeksforgeeks.org/2048-game-in-python/

0 Response to "2048 Computer Programming"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel