Рубрики
Без рубрики

Соедините четыре игры на Python

Прежде чем начать, давайте сначала поймем, что такое игра connect Four на самом деле.

Автор оригинала: Pankaj Kumar.

Прежде чем начать, давайте сначала поймем, что такое игра connect Four на самом деле.

Игра Connect4 также известна как Four Up, Plot Four, Find Four, Captain’s Mistress, Four in a Row, Drop Four и Gravitrips в Советском Союзе.

Это настольная игра для двух игроков, в которой игроки выбирают цвет, а затем по очереди бросают цветные диски в вертикально подвешенную сетку из семи столбцов и шести рядов.

Фигуры падают прямо вниз, занимая наименьшее доступное пространство в колонне.

Цель игры состоит в том, чтобы первым сформировать горизонтальную, вертикальную или диагональную линию из четырех собственных дисков. Соедините четыре – это решенная игра.

Первый игрок всегда может выиграть, сделав правильные ходы. Звучит забавно, правда?

Давайте разберемся, как кодировать эту игру на языке программирования python.

Импортируйте необходимые библиотеки для игры Connect Four

1. Модуль NumPy

Библиотека NumPy : NumPy расшифровывается как Числовой Python. NumPy-это библиотека Python, используемая для работы с массивами. Он также имеет функции для работы в области линейной алгебры, преобразования Фурье и матриц. Это проект с открытым исходным кодом, и вы можете использовать его свободно. NumPy-это библиотека Python, которая предоставляет простую, но мощную структуру данных: n-мерный массив.

Если в вашей системе еще не предустановлен NumPy, введите следующую команду в cmd вашего окна:

C:\Users\Admin> pip install numpy

Когда вы вызываете оператор import numpy как np , вы сокращаете фразу ” numpy ” до ” np “, чтобы облегчить чтение кода. Это также помогает избежать проблем с пространством имен.

import numpy as np

2. Модуль Pygame

Pygame-это бесплатная кроссплатформенная библиотека с открытым исходным кодом для разработки мультимедийных приложений, таких как видеоигры, с использованием Python.

Он использует простую библиотеку слоев DirectMedia и несколько других популярных библиотек для абстрагирования наиболее распространенных функций, что делает написание этих программ более интуитивно понятной задачей.

Если в вашей системе еще не предустановлена Pygame, введите следующую команду в cmd вашего окна:

C:\Users\Admin> pip install numpy

3. Модуль Python sys

Модуль python sys предоставляет функции и переменные, которые используются для управления различными частями среды выполнения Python . Он позволяет нам получить доступ к конкретным параметрам и функциям системы. импорт sys . Во-первых, мы должны импортировать модуль sys в нашу программу, прежде чем запускать какие-либо функции. sys .модули.

4. Математический модуль Python

Некоторые из наиболее популярных математических функций определены в математическом модуле. К ним относятся тригонометрические функции, функции представления, логарифмические функции, функции преобразования угла и т. Д. Кроме того, в этом модуле также определены две математические константы.

Если в вашей системе еще не установлена математика, введите следующую команду в cmd вашего окна:

C:\Users\Admin> pip install maths

Реализация игры Connect Four на Python

Шаг 01

Импортируйте пакет NumPy как np. Затем мы создадим функцию python с именем create_board( ) .

функция np.zeros () используется для создания матрицы, полной нулей. Эта функция в Python может использоваться при инициализации весов во время первой итерации в TensorFlow и других статистических задачах. ((6,7)) – это размеры. 6 строк и 7 столбцов. Тогда мы просто вернем эту доску.

Сейчас мы начнем писать основной игровой цикл. Мы собираемся создать цикл как , а не game_over . Цикл while not повторно выполняет тело цикла до тех пор, пока не будет выполнено условие завершения цикла. Наш цикл будет выполняться до тех пор, пока эта переменная game_over имеет значение false. Мы инициализируем game_over как False. Единственный раз, когда он переключится на true, – это если кто-то получит 4 круга подряд.

Чтобы увеличить ход на 1, мы будем использовать поворот . Чтобы переключиться между игроками 1 и 2 в качестве альтернативы, мы используем turn % 2 .

import numpy as np

def create_board():
    board = np.zeros((6,7))
    return board

#initialize board
board = create_board()
#We will initialize the game_over as False.
game_over = False
turn = 0

while not game_over:
    #Ask for player 1 input
    if turn == 0:
        selection = int(input("Player 1, Make your Selection(0-6):"))

    #Ask for player 2 input
    else:
        selection = int(input("Player 2, Make your Selection(0-6):"))

    turn += 1
    turn = turn % 2

Шаг 02

На шаге 02 мы вносим несколько изменений и обновлений в предыдущий код.

Мы хотим, чтобы переменная selection действительно бросила фигуру на доску. Для этого первое, что мы сделаем, это создадим еще три функции с именами def drop_piece (), def is_valid_location( ), def get_next_open_row( ).

Как эти функции будут работать вместе, заключается в следующем: игрок сделает выбор. (0-6) в коде представляет столбец, в который они хотят бросить свою часть. Поэтому мы обновляем имя переменной выбора до переменной столбца |/(col) .

Теперь мы возьмем этот холодный в текущей плате, которая у нас есть, и передадим его в качестве параметров во всех трех функциях с board .

Мы инициализируем глобальные переменные с именами ROW_COUNT и COLUMN_COUNT . В Python переменная , объявленная вне функции или в глобальной области видимости, известна как глобальная переменная . Это означает, что глобальная переменная может быть доступна внутри или снаружи функции.

Функция np.flip( ) изменяет порядок элементов массива вдоль указанной оси, сохраняя форму массива.

Syntax: np.flip(array, axis)
import numpy as np

ROW_COUNT = 6
COLUMN_COUNT = 7

def create_board():
    board = np.zeros((6,7))
    return board

def drop_piece(board,row,col,piece):
    board[row][col]= piece

def is_valid_location(board,col):
    #if this condition is true we will let the use drop piece here.
    #if not true that means the col is not vacant
    return board[5][col]==0

def get_next_open_row(board,col):
    for r in range(ROW_COUNT):
        if board[r][col]==0:
            return r
    
def print_board(board):
    print(np.flip(board,0))
    
board = create_board()
print_board(board)
game_over = False
turn = 0

while not game_over:
    #Ask for player 1 input
    if turn == 0:
        col = int(input("Player 1, Make your Selection(0-6):"))
        #Player 1 will drop a piece on the board
        if is_valid_location(board,col):
            row = get_next_open_row(board,col)
            drop_piece(board,row,col,1)
        
    #Ask for player 2 input
    else:
        col = int(input("Player 2, Make your Selection(0-6):"))
        #Player 2 will drop a piece on the board
        if is_valid_location(board,col):
            row = get_next_open_row(board,col)
            drop_piece(board,row,col,2)

    print_board(board)
            
    turn += 1
    turn = turn % 2 

Шаг 03: Полное Пошаговое руководство По Коду

На шаге 03 мы создадим игру с графическим интерфейсом, а не только с матрицами. Приведенный выше код вместе с новыми модификациями, которые мы сделаем, сделает игру похожей на настоящую настольную игру.

Сначала мы импортируем все необходимые библиотеки.

Далее мы определим цвета синий, черный, красный и желтый как глобальные статические переменные. Эти значения будут значениями rgb.

Мы инициализируем глобальные переменные с именами ROW_COUNT и COLUMN_COUNT . Количество строк-6, а количество столбцов-7.

Затем мы создаем 5 функций с именами create_board( ) , drop_piece( ) , is_valid_location( ) , get_next_open_row( ) и print_board( ) .

Затем мы создаем функцию с именем winning_move() и проверяем горизонтальные местоположения для победы, вертикальные местоположения для победы, положительные и отрицательные диагонали для победы.

В горизонтальном и вертикальном расположениях мы создаем вложенный цикл for для строк и столбцов и проверяем оператор условия if, чтобы увидеть, была ли фигура отброшена в это место на доске. Если условие if выполнено, оно вернет TRUE . Мы повторим ту же процедуру для вертикальных положений, а также для диагоналей с положительным и отрицательным наклоном.

В функции def draw_board( ) , pygame.draw есть модуль для рисования фигур.

pygame.draw.rect используется для рисования прямоугольника. Теперь мы определим треугольник. Определите высоту, ширину и положение.

Таким образом, положение будет c*КВАДРАТНЫЙ РАЗМЕР , а положение оси y будет r*КВАДРАТНЫЙ РАЗМЕР+КВАДРАТНЫЙ РАЗМЕР .

Высота и ширина будут двумя другими параметрами, и это будет просто КВАДРАТНЫЙ размер , КВАДРАТНЫЙ размер . Повторите ту же процедуру и для кругов.

import numpy as np
import pygame
import sys
import math

BLUE = (0,0,255)
BLACK = (0,0,0)
RED = (255,0,0)
YELLOW = (255,255,0)

ROW_COUNT = 6
COLUMN_COUNT = 7

def create_board():
	board = np.zeros((ROW_COUNT,COLUMN_COUNT))
	return board

def drop_piece(board, row, col, piece):
	board[row][col] = piece

def is_valid_location(board, col):
	return board[ROW_COUNT-1][col] == 0

def get_next_open_row(board, col):
	for r in range(ROW_COUNT):
		if board[r][col] == 0:
			return r

def print_board(board):
	print(np.flip(board, 0))

def winning_move(board, piece):
	# Check horizontal locations for win
	for c in range(COLUMN_COUNT-3):
		for r in range(ROW_COUNT):
			if board[r][c] == piece and board[r][c+1] == piece and board[r][c+2] == piece and board[r][c+3] == piece:
				return True

	# Check vertical locations for win
	for c in range(COLUMN_COUNT):
		for r in range(ROW_COUNT-3):
			if board[r][c] == piece and board[r+1][c] == piece and board[r+2][c] == piece and board[r+3][c] == piece:
				return True

	# Check positively sloped diaganols
	for c in range(COLUMN_COUNT-3):
		for r in range(ROW_COUNT-3):
			if board[r][c] == piece and board[r+1][c+1] == piece and board[r+2][c+2] == piece and board[r+3][c+3] == piece:
				return True

	# Check negatively sloped diaganols
	for c in range(COLUMN_COUNT-3):
		for r in range(3, ROW_COUNT):
			if board[r][c] == piece and board[r-1][c+1] == piece and board[r-2][c+2] == piece and board[r-3][c+3] == piece:
				return True

def draw_board(board):
	for c in range(COLUMN_COUNT):
		for r in range(ROW_COUNT):
			pygame.draw.rect(screen, BLUE, (c*SQUARESIZE, r*SQUARESIZE+SQUARESIZE, SQUARESIZE, SQUARESIZE))
			pygame.draw.circle(screen, BLACK, (int(c*SQUARESIZE+SQUARESIZE/2), int(r*SQUARESIZE+SQUARESIZE+SQUARESIZE/2)), RADIUS)
	
	for c in range(COLUMN_COUNT):
		for r in range(ROW_COUNT):		
			if board[r][c] == 1:
				pygame.draw.circle(screen, RED, (int(c*SQUARESIZE+SQUARESIZE/2), height-int(r*SQUARESIZE+SQUARESIZE/2)), RADIUS)
			elif board[r][c] == 2: 
				pygame.draw.circle(screen, YELLOW, (int(c*SQUARESIZE+SQUARESIZE/2), height-int(r*SQUARESIZE+SQUARESIZE/2)), RADIUS)
	pygame.display.update()


board = create_board()
print_board(board)
game_over = False
turn = 0

#initalize pygame
pygame.init()

#define our screen size
SQUARESIZE = 100

#define width and height of board
width = COLUMN_COUNT * SQUARESIZE
height = (ROW_COUNT+1) * SQUARESIZE

size = (width, height)

RADIUS = int(SQUARESIZE/2 - 5)

screen = pygame.display.set_mode(size)
#Calling function draw_board again
draw_board(board)
pygame.display.update()

myfont = pygame.font.SysFont("monospace", 75)

while not game_over:

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()

		if event.type == pygame.MOUSEMOTION:
			pygame.draw.rect(screen, BLACK, (0,0, width, SQUARESIZE))
			posx = event.pos[0]
			if turn == 0:
				pygame.draw.circle(screen, RED, (posx, int(SQUARESIZE/2)), RADIUS)
			else: 
				pygame.draw.circle(screen, YELLOW, (posx, int(SQUARESIZE/2)), RADIUS)
		pygame.display.update()

		if event.type == pygame.MOUSEBUTTONDOWN:
			pygame.draw.rect(screen, BLACK, (0,0, width, SQUARESIZE))
			#print(event.pos)
			# Ask for Player 1 Input
			if turn == 0:
				posx = event.pos[0]
				col = int(math.floor(posx/SQUARESIZE))

				if is_valid_location(board, col):
					row = get_next_open_row(board, col)
					drop_piece(board, row, col, 1)

					if winning_move(board, 1):
						label = myfont.render("Player 1 wins!!", 1, RED)
						screen.blit(label, (40,10))
						game_over = True


			# # Ask for Player 2 Input
			else:				
				posx = event.pos[0]
				col = int(math.floor(posx/SQUARESIZE))

				if is_valid_location(board, col):
					row = get_next_open_row(board, col)
					drop_piece(board, row, col, 2)

					if winning_move(board, 2):
						label = myfont.render("Player 2 wins!!", 1, YELLOW)
						screen.blit(label, (40,10))
						game_over = True

			print_board(board)
			draw_board(board)

			turn += 1
			turn = turn % 2

			if game_over:
				pygame.time.wait(3000)

Наш завершенный графический интерфейс соединяет четыре игры на Python

подключите четыре игры подключите 4 игры подключите 4 игры на PYthon

Примечания к окончанию…

Это было полное объяснение того, как закодировать знаменитую игру connect four на Python. Pygame позволяет пользователям легко изучать и кодировать множество игр. Я надеюсь, что вы обязательно попробуете кодировать это и получите удовольствие от игры, которую вы создали сами.

Счастливого Обучения!