五子棋小游戲-簡單開發版

一、需求分析

開發一個基于 Pygame 庫的五子棋小游戲,允許兩名玩家在棋盤上輪流落子,當有一方達成五子連珠時游戲結束,顯示獲勝信息,并提供退出游戲和重新開始游戲的操作選項。

1.棋盤顯示 :

????????顯示一個 15x15 的五子棋棋盤,棋盤背景為木頭淡黃色,網格線為黑色。

2.落子操作 :

????????玩家通過鼠標點擊棋盤上的交叉點來落子,黑子和白子輪流交替落子。

????????只有在空的交叉點上才能落子。

3.勝負判斷 :

????????每次落子后,檢查是否有五子連珠的情況(橫向、縱向、正斜向、反斜向)。

????????如果有一方達成五子連珠,則判定該方獲勝。

4.游戲結束處理 :

????????游戲結束時,在屏幕中央顯示獲勝信息(如“Player 1 Win!” 或 “Player 2 Win!”)。

????????同時顯示操作提示,告知玩家可以按 “Q” 鍵退出游戲,按 “N” 鍵重新開始游戲。

????????顯示一個半透明的黑色提示框,將獲勝信息和操作提示包含在內。

5.重新開始和退出 :

????????游戲結束后,玩家可以按 “Q” 鍵退出游戲,按 “N” 鍵重新開始游戲。

????????重新開始游戲時,清空棋盤,重置當前玩家為黑子先手。

二、關鍵模塊

1. 常量定義

????????定義游戲中使用的各種常量,如棋盤大小、網格大小、窗口尺寸、顏色、字體等。

2. 初始化

????????初始化 Pygame 庫。

????????創建游戲窗口。

????????初始化棋盤狀態。

3. 繪制模塊

????????繪制棋盤:使用木頭淡黃色填充屏幕,并繪制黑色的網格線。

????????繪制棋子:根據棋盤狀態,在相應位置繪制黑子和白子。

4. 勝負判斷

????????檢查當前落子位置是否形成五子連珠,分別從橫向、縱向、正斜向、反斜向四個方向進行檢查。

5. 游戲控制

????????處理鼠標點擊事件,實現落子操作。

????????處理鍵盤事件,實現退出游戲和重新開始游戲的功能。

????????控制游戲的主循環,更新游戲狀態。 6. 提示信息顯示模塊

????????在游戲結束時,顯示獲勝信息和操作提示,并繪制半透明的提示框。

三、完整代碼

import pygame
import sys# 初始化 Pygame
pygame.init()# 定義常量
BOARD_SIZE = 15
GRID_SIZE = 40
WINDOW_WIDTH = GRID_SIZE * (BOARD_SIZE + 1)
WINDOW_HEIGHT = GRID_SIZE * (BOARD_SIZE + 1)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# 定義木頭淡黃色
WOOD_COLOR = (205, 133, 63) 
BLUE = (0, 0, 255)
FONT = pygame.font.Font(None, 36)  # 創建游戲窗口
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("五子棋小游戲")# 初始化棋盤
board = [[0] * BOARD_SIZE for _ in range(BOARD_SIZE)]# 繪制棋盤
def draw_board():# 使用木頭淡黃色填充屏幕screen.fill(WOOD_COLOR)  for i in range(BOARD_SIZE):pygame.draw.line(screen, BLACK, (GRID_SIZE, GRID_SIZE * (i + 1)), (GRID_SIZE * BOARD_SIZE, GRID_SIZE * (i + 1)), 2)pygame.draw.line(screen, BLACK, (GRID_SIZE * (i + 1), GRID_SIZE), (GRID_SIZE * (i + 1), GRID_SIZE * BOARD_SIZE), 2)# 繪制棋子
def draw_pieces():for i in range(BOARD_SIZE):for j in range(BOARD_SIZE):if board[i][j] == 1:pygame.draw.circle(screen, BLACK, (GRID_SIZE * (j + 1), GRID_SIZE * (i + 1)), 18)elif board[i][j] == 2:pygame.draw.circle(screen, WHITE, (GRID_SIZE * (j + 1), GRID_SIZE * (i + 1)), 18)# 檢查是否有五子連珠
def check_win(x, y, player):directions = [(1, 0), (0, 1), (1, 1), (1, -1)]for dx, dy in directions:count = 1# 正向檢查for i in range(1, 5):new_x = x + i * dxnew_y = y + i * dyif 0 <= new_x < BOARD_SIZE and 0 <= new_y < BOARD_SIZE and board[new_x][new_y] == player:count += 1else:break# 反向檢查for i in range(1, 5):new_x = x - i * dxnew_y = y - i * dyif 0 <= new_x < BOARD_SIZE and 0 <= new_y < BOARD_SIZE and board[new_x][new_y] == player:count += 1else:breakif count >= 5:return Truereturn False# 重置游戲狀態
def reset_game():global board, current_player, game_overboard = [[0] * BOARD_SIZE for _ in range(BOARD_SIZE)]current_player = 1game_over = False# 顯示獲勝信息和操作提示
def show_winner_info(player):winner_text = FONT.render(f"Player {player} Win!", True, WHITE)prompt_text = FONT.render("Press Q to Quit, Press N to Restart", True, WHITE)# 創建半透明的矩形框winner_rect = winner_text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 - 30))prompt_rect = prompt_text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2 + 30))# 調整內邊距以確保提示框足夠大padding = 30combined_width = max(winner_rect.width, prompt_rect.width) + 2 * paddingcombined_height = winner_rect.height + prompt_rect.height + 3 * paddingrect = pygame.Rect(winner_rect.x - padding, winner_rect.y - padding, combined_width, combined_height)rect.center = (WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)# 創建一個帶有透明度的表面surface = pygame.Surface((rect.width, rect.height), pygame.SRCALPHA)surface.fill((0, 0, 0, 128))  # 半透明黑色screen.blit(surface, (rect.x, rect.y))screen.blit(winner_text, (rect.centerx - winner_rect.width // 2, rect.centery - winner_rect.height - padding // 2))screen.blit(prompt_text, (rect.centerx - prompt_rect.width // 2, rect.centery + padding // 2))pygame.display.flip()# 主游戲循環
current_player = 1
game_over = False
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.poscol = (x - GRID_SIZE // 2) // GRID_SIZErow = (y - GRID_SIZE // 2) // GRID_SIZEif 0 <= col < BOARD_SIZE and 0 <= row < BOARD_SIZE and board[row][col] == 0:board[row][col] = current_playerif check_win(row, col, current_player):print(f"Player {current_player} Win!")# 先顯示最后一個子draw_board()draw_pieces()pygame.display.flip()# 顯示獲勝信息和操作提示show_winner_info(current_player)game_over = True# 進入等待狀態,直到用戶按下 Q 或者 N 鍵while game_over:for inner_event in pygame.event.get():if inner_event.type == pygame.QUIT:pygame.quit()sys.exit()elif inner_event.type == pygame.KEYDOWN:if inner_event.key == pygame.K_q:pygame.quit()sys.exit()elif inner_event.key == pygame.K_n:reset_game()game_over = Falsecurrent_player = 3 - current_player  # 切換玩家elif event.type == pygame.KEYDOWN:if event.key == pygame.K_q:pygame.quit()sys.exit()elif event.key == pygame.K_n:reset_game()if not game_over:draw_board()draw_pieces()pygame.display.flip()

四、代碼運行方式

1.代碼運行環境

????????Python 3.x

????????Pygame 庫

pip install pygame

2.運行代碼

????????將上述代碼保存為 gobang_game.py 文件,然后在終端中運行以下命令:

python gobang_game.py

3.游戲操作說明

????????游戲開始后,黑子先手,玩家通過鼠標點擊棋盤上的交叉點落子。
????????當有一方達成五子連珠時,游戲結束,屏幕中央會顯示獲勝信息和操作提示。
????????按 “Q” 鍵退出游戲,按 “N” 鍵重新開始游戲。

4.游戲畫面

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898085.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898085.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898085.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于C#的以太網通訊實現:TcpClient異步通訊詳解

基于C#的以太網通訊實現&#xff1a;TcpClient異步通訊詳解 在現代工業控制和物聯網應用中&#xff0c;以太網通訊是一種常見的數據傳輸方式。本文將介紹如何使用C#實現基于TCP協議的以太網通訊&#xff0c;并通過異步編程提高通訊效率。我們將使用TcpClient類來實現客戶端與服…

小秋的矩陣

0小秋的矩陣 - 藍橋云課 問題描述 給你一個 n 行 m 列只包含 0 和 1 的矩陣&#xff0c;求它的所有子矩陣中&#xff0c;是方陣而且恰好包含 k 個 0 的數量。 方陣是行數和列數相等的矩陣。 子矩陣是從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣&#xff08;保…

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包 線刷方法&#xff1a;&#xff08;新手參考借鑒一下&#xff09; 1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b; 2、電腦上安裝好刷機工具Amlogic USB Bu…

麒麟服務器操作系統Redis部署手冊

軟件簡介 Redis****介紹 REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統,是跨平臺的非關系型數據庫。 Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基于內存、分布式、可選持久性的鍵值對(Key-Value)存…

(分塊)洛谷 P2801 教主的魔法 題解

之前學過 莫隊 算法&#xff0c;其運用了分塊思想&#xff1b;但是我居然是第一次寫純種的分塊題目。 題意 給你一個長度為 n n n 的序列 a a a&#xff08;一開始 ? a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ?ai?∈[1,1000]&#xff09;。要求執行 q q q 次操作&…

谷歌Chrome或微軟Edge瀏覽器修改網頁任意內容

在谷歌或微軟瀏覽器按F12&#xff0c;打開開發者工具&#xff0c;切換到console選項卡&#xff1a; 在下面的輸入行輸入下面的命令回車&#xff1a; document.body.contentEditable"true"效果如下&#xff1a;

【生日蛋糕——DFS剪枝優化】

題目 分析 代碼 #include <bits/stdc.h> using namespace std;const int N 24; const int inf 0x3f3f3f3f;int mins[N], minv[N]; int R[N], H[N]; int n, m, ans inf;void dfs(int u, int v, int s) {if(v minv[u] > n) return;if(s mins[u] > ans) return;…

【C++基礎十】泛型編程(模板初階)

【C基礎十】泛型編程—模板 1.什么是模板2.函數模板的實例化&#xff1a;2.1隱式實例化2.2顯示實例化 3.函數模板參數的匹配規則4.什么是類模板5.類模板的實例化6.聲明和定義分離 1.什么是模板 void swap(int& a, int& b) {int tmp 0;tmp a;a b;b tmp; }void swap…

如何修復 Tauri 發布后程序運行時顯示 `asset not found: index.html` 的問題

如何修復 Tauri 發布后程序運行時顯示 asset not found: index.html 的問題 在使用 Tauri 發布應用程序時&#xff0c;如果運行時出現 asset not found: index.html 的錯誤&#xff0c;通常是因為 Tauri 無法找到或正確加載前端資源文件&#xff08;如 index.html&#xff09;…

短視頻下載去水印,用什么工具好?

去除視頻和圖片水印是許多用戶的需求&#xff0c;尤其是在分享或保存內容時。以下是6款超好用的工具&#xff0c;幫助你輕松去除水印&#xff0c;享受純凈的視覺體驗&#xff1a; 1. 易下載去水印小程序 特點&#xff1a; 操作簡單&#xff0c;支持抖音、快手、小紅書、嗶哩嗶哩…

【華為OD-E卷 -121 消消樂游戲 100分(python、java、c++、js、c)】

【華為OD-E卷 - 消消樂游戲 100分(python、java、c++、js、c)】 題目 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度 輸入描…

設計模式(行為型)-備忘錄模式

目錄 定義 類圖 角色 角色詳解 &#xff08;一&#xff09;發起人角色&#xff08;Originator&#xff09;? &#xff08;二&#xff09;備忘錄角色&#xff08;Memento&#xff09;? &#xff08;三&#xff09;備忘錄管理員角色&#xff08;Caretaker&#xff09;?…

YOLO簡史:從YOLOv1到YOLOv12的技術革新與演進

YOLO&#xff08;You Only Look Once&#xff09;系列算法自2015年誕生以來&#xff0c;憑借其“單次推理”的高效特性&#xff0c;徹底改變了目標檢測領域。從初代YOLO到最新的YOLOv12&#xff0c;每一次迭代都凝聚了研究者的智慧與工業界的實踐需求。本文梳理各版本的特性、技…

【技術報告】谷歌開源多模態大模型 Gemma-3

【技術報告】谷歌開源多模態大模型 Gemma-3 1. Gemma-3 簡介1.1 Gemma-3 的新功能1.2 與現有工作流的集成1.3 開始使用 Gemma-3 Gemma-3 技術報告&#xff1a;摘要Gemma-3 技術報告&#xff1a;1. 引言Gemma-3 技術報告&#xff1a;2. 模型架構2.1 視覺模態2.2 預訓練2.3 量化感…

[ISP] 人眼中的顏色

相機是如何記錄顏色的&#xff0c;又是如何被顯示器還原的&#xff1f; 相機通過記錄RGB數值然后顯示器顯示RGB數值來實現顏色的記錄和呈現。道理是這么個道理&#xff0c;但實際上各廠家生產的相機對光的響應各不相同&#xff0c;并且不同廠家顯示器對三原色的顯示也天差地別&…

InfiniBand可靠連接(RC)模式:設計原理、核心機制與應用實踐

引言 InfiniBand作為一種高性能網絡互連技術&#xff0c;廣泛應用于超算集群、分布式存儲和金融交易系統等領域。其可靠連接&#xff08;Reliable Connection, RC&#xff09;模式以硬件級的有序性、可靠性和低延遲特性成為關鍵場景的首選。本文結合技術原理、機制對比和實際應…

【網絡】Caddy 服務器如何提供 TLS(Transport Layer Security)(傳輸層安全協議)

這張圖片介紹了 Caddy 服務器如何提供 TLS&#xff08;傳輸層安全協議&#xff09; 支持&#xff0c;確保通信的安全性。以下是對圖片內容的詳細分析 1. Caddy 是什么&#xff1f; Caddy 是一個現代化的 Web 服務器&#xff0c;以其簡單易用和自動化的 HTTPS 支持而聞名。它內…

GHCTF web方向題解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

《Python實戰進階》No21:數據存儲:Redis 與 MongoDB 的使用場景

第21集&#xff1a;數據存儲&#xff1a;Redis 與 MongoDB 的使用場景 摘要 在現代應用開發中&#xff0c;數據存儲的選擇直接影響系統的性能、擴展性和成本。Redis 和 MongoDB 是兩種極具代表性的數據庫技術&#xff0c;它們分別擅長解決不同場景下的問題。本文將深入探討 Re…

【Agent】OpenManus-Prompt組件詳細分析

1. 提示詞架構概述 OpenManus 的提示詞組件采用了模塊化設計&#xff0c;為不同類型的智能體提供專門的提示詞模板。每個提示詞模塊通常包含兩種核心提示詞&#xff1a;系統提示詞&#xff08;System Prompt&#xff09;和下一步提示詞&#xff08;Next Step Prompt&#xff0…