Найти в Дзене
Интернет сегодня

Python: Игра 2048 в консоле

Что делать, если хочешь делать игры, но не знаешь библиотеки? Что? Выучить библиотеки? Неееет, если не знаешь библиотеки, нужно писать игры в консоли!

Сегодня мы напишем простенькую игру 2048 на python, которая будет работать в консоли

(Полный код программы в самом низу)

Первым делом импортируем библиотеки:

-2

Далее зададим несколько переменных:

-3
  • start_deck - Макет нашей доски
  • deck - Сама доска, со всеми числами
  • nums - Числа в клетках доски

Напишем вспомогательную функцию для поворота матрицы на 90 градусов, здесь аргумент times означает то, сколько раз мы повернём доску:

-4

Функцию для записи чисел из nums в deck:

-5

Функцию для добавления на доску рандомного числа (2 или 4) в рандомное место (да, это не самое оптимизированное решение, но у нас всего 16 чисел, так что особых затрат здесь не будет). Также в этой функции добавим обработку проигрыша:

-6

Функция для сдвига чисел в одной строке влево, вправо, вверх, или вниз:

-7

Функция для сдвига всех чисел:

-8

4 функции для обработки сдвига чисел соответственно вверх, влево, вниз и вправо, а также функция update() для добавления рандомного числа в таблицу, обновления значения deck и вывода таблицы в консоль:

-9

И наконец, привязка клавиш к этим функциям:

-10

В конце я написал update(), чтобы в наш deck сразу добавилось число и он вывелся на экран. while True: input() нужен для того, чтобы выполнение программы не закончилось.

(Если вы знаете более простой и удобный способ реализации последней части программы, с этими четырьмя функциями, то прошу написать в комментариях своё решение, или отправить ссылку на гитхаб)

Теперь запустим программу из консоли, написав команду "python {название программы}", например "python 2048_console.py" (консоль должна быть открыта в директории программы). Работает!

-11

А вот весь код программы:

import random
import keyboard
import os


start_deck = list("""---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------""")

deck = start_deck
nums = [[0 for _ in range(4)] for _ in range(4)]


def list_rot90(data, times=1):
if times == 0:
return data
rot_data = []
for t in range(times):
m = len(data)
n = len(data[0])
rev_data = data[:: -1]
rot_data = [[rev_data[j][i] for j in range(m)]
for i in range(n)]
data = rot_data
return rot_data


def write_nums():
global deck
deck = start_deck[:]
for row in range(4):
for col in range(4):
if nums[row][col]:
for i in range(len(str(nums[row][col]))):
deck[22 + (row * (22 * 2)) + 1 + col * 5 + i] = str(nums[row][col])[i]


def add_num():
global nums, deck
if all([0 not in i for i in nums]):
print("Вы проиграли")
print(f"Ваш счёт: {max(max(i) for i in nums)}")
nums = [[0 for _ in range(4)] for _ in range(4)]
else:
while True:
row = random.choice(range(4))
col = random.choice(range(4))
if nums[row][col] == 0:
nums[row][col] = random.choice([2, 4])
break


def move_row(row):
new_row = []
for i in row:
if i != 0:
new_row.append(i)
row = new_row[:]
last_num = -1
for i in range(len(row)):
if row[i] == last_num:
row[i - 1] = row[i] * 2
row[i] = 0
last_num = row[i]
new_row = []
for i in row:
if i != 0:
new_row.append(i)
return new_row


def move(side):
global nums
rot = {'w': [3, 1], 'd': [2, 2], 's': [1, 3], 'a': [0, 0]}
nums = list_rot90(nums, rot[side][0])
for col in range(len(nums)):
c = move_row(nums[col])
c = c + [0 for _ in range(4 - len(c))]
nums[col] = c
nums = list_rot90(nums, rot[side][1])


def w():
move("w")
update()


def a():
move("a")
update()


def s():
move("s")
update()


def d():
move("d")
update()


def update():
os.system("cls")
add_num()
write_nums()
print()
print("".join(deck))


keyboard.add_hotkey("w", w)
keyboard.add_hotkey("d", d)
keyboard.add_hotkey("s", s)
keyboard.add_hotkey("a", a)

update()
while True:
input()

Если статья вам понравилась, прошу, поставьте лайк, это поможет продвижению и мне будет приятно) До встречи в новых статьях.

Пока!

Наука
7 млн интересуются