python游戏开发之五子棋游戏制作

五子棋是一种源自中国的传统棋类游戏,起源可以追溯到古代。它是一种两人对弈的游戏,使用棋盘和棋子进行。棋盘通常是一个 15×15 的网格,棋子分为黑白两色,双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子,使自己的五个棋子在横向、纵向或斜向形成连续的线路,从而获胜。

五子棋被认为是一种智力游戏,它要求玩家在竞技中思考对手的走法并制定自己的策略。由于规则简单、易于上手,五子棋在中国以及世界各地都很受欢迎,并且有许多不同的变种和玩法。笔者选择了一个最原始最简易的一个简易五子棋的程序,采用文本界面操作。

源码获取:


主要源代码展示

`

# 检查水平方向
count = 0
for i in range(max(0, col - 4), min(15, col + 5)):
    if board[row][i] == player:
        count += 1
        if count == 5:
            return True
    else:
        count = 0

# 检查垂直方向
count = 0
for i in range(max(0, row - 4), min(15, row + 5)):
    if board[i][col] == player:
        count += 1
        if count == 5:
            return True
    else:
        count = 0

# 检查斜向(\)方向
count = 0
for i in range(-4, 5):
    r = row + i
    c = col + i
    if r < 0 or r >= 15 or c < 0 or c >= 15:
        continue
    if board[r][c] == player:
        count += 1
        if count == 5:
            return True
    else:
        count = 0

# 检查斜向(/)方向
count = 0
for i in range(-4, 5):
    r = row + i
    c = col - i
    if r < 0 or r >= 15 or c < 0 or c >= 15:
        continue
    if board[r][c] == player:
        count += 1
        if count == 5:
            return True
    else:
        count = 0

return False


board = [["." for _ in range(15)] for _ in range(15)]
players = ["X", "O"]
current_player = 0
print_board(board)

while True:
    print(f"Player {players[current_player]}'s turn:")
    try:
        row = int(input("Enter row (0-14): "))
        col = int(input("Enter col (0-14): "))
        if row < 0 or row >= 15 or col < 0 or col >= 15 or board[row][col] != ".":
            raise ValueError
    except ValueError:
        print("Invalid input. Try again.")
        continue

    board[row][col] = players[current_player]
    print_board(board)
    if check_win(board, row, col, players[current_player]):
        print(f"Player {players[current_player]} wins!")
        break

    current_player = (current_player + 1) % 2

通过改进,新增了可使用鼠标交互的效果,相比较于原始的代码,大大提高了游戏体验性,并且使游戏界面更加易于操作,在游戏体验上大大增加也玩性。
原始代码

`import pygame

import sys

游戏设置

CELL_SIZE = 40

BOARD_SIZE = 15

WINDOW_WIDTH = CELL_SIZE * BOARD_SIZE

WINDOW_HEIGHT = CELL_SIZE * BOARD_SIZE

LINE_COLOR = (0, 0, 0)

BG_COLOR = (139, 69, 19) # 棕色背景

初始化游戏

pygame.init()

screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

pygame.display.set_caption("五子棋")

clock = pygame.time.Clock()

board = [[' ' for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]

current_player = 'X'

game_over = False

def draw_board():

screen.fill(BG_COLOR)

for i in range(BOARD_SIZE):

pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE),

(WINDOW_WIDTH - CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE))

pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2 + i * CELL_SIZE, CELL_SIZE // 2),

(CELL_SIZE // 2 + i * CELL_SIZE, WINDOW_HEIGHT - CELL_SIZE // 2))

def draw_piece(row, col, player):

x = col * CELL_SIZE + CELL_SIZE // 2

y = row * CELL_SIZE + CELL_SIZE // 2

if player == 'X':

pygame.draw.circle(screen, (0, 0, 0), (x, y), CELL_SIZE // 3)

else:

pygame.draw.circle(screen, (255, 255, 255), (x, y), CELL_SIZE // 3)

def check_win(row, col):

directions = [(1, 0), (0, 1), (1, 1), (1, -1)]

for d in directions:

count = 1

for i in range(1, 5):

if 0 <= row + i * d[0] < BOARD_SIZE and 0 <= col + i * d[1] < BOARD_SIZE and

board[row + i * d[0]][col + i * d[1]] == current_player:

count += 1

else:

break

for i in range(1, 5):

if 0 <= row - i * d[0] < BOARD_SIZE and 0 <= col - i * d[1] < BOARD_SIZE and

board[row - i * d[0]][col - i * d[1]] == current_player:

count += 1

else:

break

if count >= 5:

return True

return False

def display_winner(player):

font = pygame.font.Font(None, 36)

if player == 'X':

text = font.render("Black wins!", True, (255, 0, 0))

else:

text = font.render("White wins!", True, (255, 0, 0))

text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))

screen.blit(text, text_rect)

游戏循环

while True:

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

sys.exit()

elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:

x, y = event.pos

col = x // CELL_SIZE

row = y // CELL_SIZE

if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == ' ':

board[row][col] = current_player

draw_piece(row, col, current_player)

if check_win(row, col):

         print(f"Player {current_player} wins!")
                game_over = True
            current_player = 'O' if current_player == 'X' else 'X'

draw_board()
for row in range(BOARD_SIZE):
    for col in range(BOARD_SIZE):
        if board[row][col] != ' ':
            draw_piece(row, col, board[row][col])

if game_over:
    display_winner(current_player)

pygame.display.flip()
clock.tick(30)

`import pygame

import sys

游戏设置

CELL_SIZE = 40

BOARD_SIZE = 15

WINDOW_WIDTH = CELL_SIZE * BOARD_SIZE

WINDOW_HEIGHT = CELL_SIZE * BOARD_SIZE

LINE_COLOR = (0, 0, 0)

BG_COLOR = (139, 69, 19) # 棕色背景

初始化游戏

pygame.init()

screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

pygame.display.set_caption("五子棋")

clock = pygame.time.Clock()

board = [[' ' for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]

current_player = 'X'

game_over = False

def draw_board():

screen.fill(BG_COLOR)

for i in range(BOARD_SIZE):

pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE),

(WINDOW_WIDTH - CELL_SIZE // 2, CELL_SIZE // 2 + i * CELL_SIZE))

pygame.draw.line(screen, LINE_COLOR, (CELL_SIZE // 2 + i * CELL_SIZE, CELL_SIZE // 2),

(CELL_SIZE // 2 + i * CELL_SIZE, WINDOW_HEIGHT - CELL_SIZE // 2))

def draw_piece(row, col, player):

x = col * CELL_SIZE + CELL_SIZE // 2

y = row * CELL_SIZE + CELL_SIZE // 2

if player == 'X':

pygame.draw.circle(screen, (0, 0, 0), (x, y), CELL_SIZE // 3)

else:

pygame.draw.circle(screen, (255, 255, 255), (x, y), CELL_SIZE // 3)

def check_win(row, col):

directions = [(1, 0), (0, 1), (1, 1), (1, -1)]

for d in directions:

count = 1

for i in range(1, 5):

if 0 <= row + i * d[0] < BOARD_SIZE and 0 <= col + i * d[1] < BOARD_SIZE and

board[row + i * d[0]][col + i * d[1]] == current_player:

count += 1

else:

break

for i in range(1, 5):

if 0 <= row - i * d[0] < BOARD_SIZE and 0 <= col - i * d[1] < BOARD_SIZE and

board[row - i * d[0]][col - i * d[1]] == current_player:

count += 1

else:

break

if count >= 5:

return True

return False

def display_winner(player):

font = pygame.font.Font(None, 36)

if player == 'X':

text = font.render("Black wins!", True, (255, 0, 0))

else:

text = font.render("White wins!", True, (255, 0, 0))

text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))

screen.blit(text, text_rect)

游戏循环

while True:

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

sys.exit()

elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:

x, y = event.pos

col = x // CELL_SIZE

row = y // CELL_SIZE

if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == ' ':

board[row][col] = current_player

draw_piece(row, col, current_player)

if check_win(row, col):

print(f"Player {current_player} wins!")

game_over = True

current_player = 'O' if current_player == 'X' else 'X'

draw_board()
for row in range(BOARD_SIZE):
    for col in range(BOARD_SIZE):
        if board[row][col] != ' ':
            draw_piece(row, col, board[row][col])

if game_over:
    display_winner(current_player)

pygame.display.flip()
clock.tick(30)



结语:

它通过简洁明了的语法和逻辑结构,提高了代码的可读性和可维护性。通过引入交互性更强的用户输入方式,使得玩家可以更直观地参与游戏,增强了游戏的可玩性和用户体验。总的来说,这段 Python 在保持游戏逻辑不变的情况下,提升了代码的质量和可玩性,为开发者和玩家带来了更好的体验。

如有侵权,请联系删除。

相关推荐
Buleall4 分钟前
期末考学C
java·开发语言
重生之绝世牛码6 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行12 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157622 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭22 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明31 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
游客52036 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
Monly2137 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu38 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202139 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频