五子棋python OpenGL完整代码实例GLFW
时间: 2025-05-24 09:27:53 浏览: 19
### Python 使用 OpenGL 和 GLFW 实现五子棋的完整代码示例
以下是基于 Python、OpenGL 和 GLFW 的五子棋游戏的一个简化版本。此代码实现了基本的游戏逻辑和图形渲染功能。
#### 依赖安装
为了运行该程序,需先安装 PyOpenGL 和 GLFW 库[^2]。可以通过以下命令完成安装:
```bash
pip install PyOpenGL PyOpenGL_accelerate glfw
```
如果遇到兼容性问题,可以尝试指定本地路径下的 `.whl` 文件进行安装。
---
#### 完整代码实现
```python
import sys
import glfw
from OpenGL.GL import *
from OpenGL.GLU import *
# 游戏状态变量
BOARD_SIZE = 15 # 棋盘大小
board = [[0 for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
current_player = 1 # 当前玩家,默认为黑方
def init_window():
""" 初始化窗口 """
if not glfw.init(): # 初始化GLFW库
return None
window = glfw.create_window(800, 800, "Gomoku with OpenGL", None, None)
if not window:
glfw.terminate()
return None
glfw.make_context_current(window) # 设置当前上下文[^3]
glViewport(0, 0, 800, 800)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(-1, BOARD_SIZE + 1, -1, BOARD_SIZE + 1)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
return window
def draw_board():
""" 绘制棋盘 """
glColor3f(0.7, 0.5, 0.3) # 棕色背景
glBegin(GL_QUADS)
glVertex2f(0, 0)
glVertex2f(BOARD_SIZE, 0)
glVertex2f(BOARD_SIZE, BOARD_SIZE)
glVertex2f(0, BOARD_SIZE)
glEnd()
glColor3f(0, 0, 0) # 黑线颜色
for i in range(BOARD_SIZE + 1):
glBegin(GL_LINES)
glVertex2f(i, 0)
glVertex2f(i, BOARD_SIZE)
glVertex2f(0, i)
glVertex2f(BOARD_SIZE, i)
glEnd()
def draw_pieces():
""" 绘制棋子 """
for row in range(BOARD_SIZE):
for col in range(BOARD_SIZE):
if board[row][col] == 1: # 黑子
glColor3f(0, 0, 0)
glPushMatrix()
glTranslatef(col + 0.5, row + 0.5, 0)
glutSolidSphere(0.4, 16, 16)
glPopMatrix()
elif board[row][col] == 2: # 白子
glColor3f(1, 1, 1)
glPushMatrix()
glTranslatef(col + 0.5, row + 0.5, 0)
glutSolidSphere(0.4, 16, 16)
glPopMatrix()
def check_winner(x, y):
""" 检查是否有赢家 """
directions = [(1, 0), (0, 1), (1, 1), (-1, 1)]
player = board[x][y]
for dx, dy in directions:
count = 1
nx, ny = x + dx, y + dy
while 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == player:
count += 1
nx += dx
ny += dy
nx, ny = x - dx, y - dy
while 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == player:
count += 1
nx -= dx
ny -= dy
if count >= 5:
return True
return False
def mouse_callback(window, button, action, mods):
global current_player
if button == glfw.MOUSE_BUTTON_LEFT and action == glfw.PRESS:
xpos, ypos = glfw.get_cursor_pos(window)
col = int(xpos / 50) # 转换鼠标位置到棋盘坐标
row = int(ypos / 50)
if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE and board[row][col] == 0:
board[row][col] = current_player
if check_winner(row, col): # 判断胜负
print(f"Player {current_player} wins!")
sys.exit() # 结束程序
current_player = 3 - current_player # 切换玩家
def main():
window = init_window()
if not window:
print("Failed to create GLFW window.")
return
glfw.set_mouse_button_callback(window, mouse_callback)
while not glfw.window_should_close(window): # 主循环[^3]
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
draw_board()
draw_pieces()
glfw.swap_buffers(window)
glfw.poll_events()
glfw.terminate()
if __name__ == "__main__":
main()
```
---
### 关键点说明
1. **棋盘绘制**
`draw_board()` 函数通过 `glBegin(GL_LINES)` 来绘制网格线条,并设置棕色作为棋盘底色[^1]。
2. **棋子绘制**
使用球体 (`glutSolidSphere`) 表示黑白两色棋子,分别对应玩家 1 和玩家 2。
3. **事件处理**
鼠标点击触发回调函数 `mouse_callback`,用于更新棋盘并切换玩家回合[^2]。
4. **胜利检测**
在每次下棋后调用 `check_winner` 方法,沿四个方向检查是否存在连续五个相同棋子的情况[^3]。
---
###
阅读全文
相关推荐

















