Что делать, если хочешь делать игры, но не знаешь библиотеки? Что? Выучить библиотеки? Неееет, если не знаешь библиотеки, нужно писать игры в консоли!
Сегодня мы напишем простенькую игру 2048 на python, которая будет работать в консоли
(Полный код программы в самом низу)
Первым делом импортируем библиотеки:
Далее зададим несколько переменных:
- start_deck - Макет нашей доски
- deck - Сама доска, со всеми числами
- nums - Числа в клетках доски
Напишем вспомогательную функцию для поворота матрицы на 90 градусов, здесь аргумент times означает то, сколько раз мы повернём доску:
Функцию для записи чисел из nums в deck:
Функцию для добавления на доску рандомного числа (2 или 4) в рандомное место (да, это не самое оптимизированное решение, но у нас всего 16 чисел, так что особых затрат здесь не будет). Также в этой функции добавим обработку проигрыша:
Функция для сдвига чисел в одной строке влево, вправо, вверх, или вниз:
Функция для сдвига всех чисел:
4 функции для обработки сдвига чисел соответственно вверх, влево, вниз и вправо, а также функция update() для добавления рандомного числа в таблицу, обновления значения deck и вывода таблицы в консоль:
И наконец, привязка клавиш к этим функциям:
В конце я написал update(), чтобы в наш deck сразу добавилось число и он вывелся на экран. while True: input() нужен для того, чтобы выполнение программы не закончилось.
(Если вы знаете более простой и удобный способ реализации последней части программы, с этими четырьмя функциями, то прошу написать в комментариях своё решение, или отправить ссылку на гитхаб)
Теперь запустим программу из консоли, написав команду "python {название программы}", например "python 2048_console.py" (консоль должна быть открыта в директории программы). Работает!
А вот весь код программы:
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()
Если статья вам понравилась, прошу, поставьте лайк, это поможет продвижению и мне будет приятно) До встречи в новых статьях.
Пока!