ydwb 发表于 2024-11-3 10:46:56

用pyglet如何写棋类游戏

如何实现点击第一次选棋子,第二次移动到该位置的功能?
import pyglet
from pyglet.window import mouse
from pyglet import shapes
title = "三子棋(卵子棋)"
window = pyglet.window.Window(520, 640,title)
window.set_location(600, 200)
batch1 = pyglet.graphics.Batch()
batch2 = pyglet.graphics.Batch()
background_pattern = pyglet.image.SolidColorImagePattern(color=(63, 154, 225, 255))
background_image = background_pattern.create_image(520, 640)
SIZE=160
reds=[]
blacks=[]
shape_list = []
first=True
turn='红'
last_turn='黑'
redchess=[,,]
blackchess=[,,]
Board=[['红','0','黑'],
       ['红','0','黑'],
       ['红','0','黑']]
x1,y1,x2,y2=0,0,0,0
for i in range(3):
    circle1 = shapes.Circle(100+redchess*SIZE, 170 + redchess* SIZE, 40, color=(255, 80, 0), batch=batch2)
    circle2 = shapes.Circle(100 + blackchess * SIZE, 170 + redchess * SIZE, 40, color=(0, 0, 0),batch=batch2)
    reds.append(circle1)
    blacks.append(circle2)

def drawBoard():
    for i in range(3):
      linex = shapes.Line(i*160+100, 170, i*160+100, 440, width=5, color=(0, 230, 0), batch = batch1 )
      linex.opacity = 250
      circle1 = shapes.Circle(i*160+100, 490, 60, color=(0, 230, 0), batch = batch1)
      circle2 = shapes.Circle(i * 160 + 100, 490, 55,color=(63, 154, 225), batch = batch1)
      shape_list.append(linex)
      shape_list.append(circle1)
      shape_list.append(circle2)
    for i in range(2):
      liney = shapes.Line(100, 170+i*160, 420, 170+i*160, width=5, color=(0, 230, 0), batch = batch1)
      liney.opacity = 250
      shape_list.append(liney)

drawBoard()
def change_side():
    global turn, last_turn
    last_turn=turn
    if turn=='红':
      turn='黑'
    else:
      turn='红'
@window.event
def on_mouse_press(x, y, button, modifiers):
    global first, x1,y1, turn, Board
    if button == mouse.LEFT:
      x = round((x - 100) / SIZE)
      y = round((y - 170) / SIZE)
      if first:
            x1 = x
            y1 = y
            print('x1,y1=',x1,y1)
            if Board != turn:
                return None
            if Board == turn:
                print('第一次单击')
                first = False
      else:
            x2 = x
            y2 = y
            print('x2,y2=',x2,y2)
            print(turn)
            if Board != '0':
                return None
            if turn == '红':
                redchess.remove()
                redchess.append()
                Board = '0'
                Board = turn

            elif turn == '黑':
                blackchess.remove()
                blackchess.append()
                Board = '0'
                Board = turn
            change_side()
            first = True

@window.event()
def on_draw():
    window.clear()
    background_image.blit(0, 0)
    batch1.draw()
    batch2.draw()

pyglet.app.run()

FishC 发表于 2024-11-3 10:55:15

要实现点击棋子并移动到新位置的功能,你需要在代码中进行一些调整。以下是一些关键步骤和代码示例,帮助你实现这个功能:

1. **初始化棋盘和棋子**:确保棋盘和棋子的位置在初始化时正确设置。

2. **处理鼠标点击事件**:在第一次点击时记录选中的棋子位置,第二次点击时移动棋子。

3. **更新棋盘状态**:在棋子移动后更新棋盘的状态。

以下是一个简化的实现示例:

import pyglet
from pyglet.window import mouse
from pyglet import shapes

title = "三子棋(卵子棋)"
window = pyglet.window.Window(520, 640, title)
window.set_location(600, 200)
batch1 = pyglet.graphics.Batch()
batch2 = pyglet.graphics.Batch()
background_pattern = pyglet.image.SolidColorImagePattern(color=(63, 154, 225, 255))
background_image = background_pattern.create_image(520, 640)
SIZE = 160

reds = []
blacks = []
shape_list = []
first = True
turn = '红'
last_turn = '黑'
redchess =
blackchess =
Board = [['红', '0', '黑'],
         ['0', '红', '0'],
         ['黑', '0', '红']]

x1, y1, x2, y2 = 0, 0, 0, 0

for i in range(3):
    circle1 = shapes.Circle(100 + redchess * SIZE, 170 + i * SIZE, 40, color=(255, 80, 0), batch=batch2)
    circle2 = shapes.Circle(100 + blackchess * SIZE, 170 + i * SIZE, 40, color=(0, 0, 0), batch=batch2)
    reds.append(circle1)
    blacks.append(circle2)

def drawBoard():
    for i in range(3):
      linex = shapes.Line(i * 160 + 100, 170, i * 160 + 100, 440, width=5, color=(0, 230, 0), batch=batch1)
      linex.opacity = 250
      circle1 = shapes.Circle(i * 160 + 100, 490, 60, color=(0, 230, 0), batch=batch1)
      circle2 = shapes.Circle(i * 160 + 100, 490, 55, color=(63, 154, 225), batch=batch1)
      shape_list.append(linex)
      shape_list.append(circle1)
      shape_list.append(circle2)
    for i in range(2):
      liney = shapes.Line(100, 170 + i * 160, 420, 170 + i * 160, width=5, color=(0, 230, 0), batch=batch1)
      liney.opacity = 250
      shape_list.append(liney)

drawBoard()

def change_side():
    global turn, last_turn
    last_turn = turn
    if turn == '红':
      turn = '黑'
    else:
      turn = '红'

@window.event
def on_mouse_press(x, y, button, modifiers):
    global first, x1, y1, turn, Board
    if button == mouse.LEFT:
      x = round((x - 100) / SIZE)
      y = round((y - 170) / SIZE)
      if first:
            x1 = x
            y1 = y
            print('x1,y1=', x1, y1)
            if Board != turn:
                return None
            if Board == turn:
                print('第一次单击')
                first = False
      else:
            x2 = x
            y2 = y
            print('x2,y2=', x2, y2)
            print(turn)
            if Board != '0':
                return None
            if turn == '红':
                reds.x = 100 + x2 * SIZE
                reds.y = 170 + y2 * SIZE
                redchess = x2
                Board = '0'
                Board = turn
            elif turn == '黑':
                blacks.x = 100 + x2 * SIZE
                blacks.y = 170 + y2 * SIZE
                blackchess = x2
                Board = '0'
                Board = turn
            change_side()
            first = True

@window.event
def on_draw():
    window.clear()
    background_image.blit(0, 0)
    batch1.draw()
    batch2.draw()

pyglet.app.run()

在这个示例中,`on_mouse_press` 函数处理鼠标点击事件,第一次点击记录棋子的位置,第二次点击则移动棋子并更新棋盘状态。确保在每次移动后调用 `change_side()` 函数来切换玩家。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ydwb 发表于 2024-11-3 22:28:24

修改的代码实现了棋子移动的功能,但将棋子布局打乱了。
原来的代码中redchess=[,,]
blackchess=[,,] 代表红黑子在棋盘中的位置。
即开始游戏时,红三子在左,黑三子在右。

FishC 发表于 2024-11-3 22:45:41

ydwb 发表于 2024-11-03 22:28
修改的代码实现了棋子移动的功能,但将棋子布局打乱了 ...

要解决棋子布局被打乱的问题,我们需要确保在初始化时正确设置棋子的位置,并在移动棋子时正确更新它们的位置。以下是一些调整建议:

1. **初始化棋子位置**:确保 `redchess` 和 `blackchess` 在初始化时正确设置。

2. **更新棋子位置**:在移动棋子时,确保更新 `redchess` 和 `blackchess` 的位置。

以下是修改后的代码示例:

import pyglet
from pyglet.window import mouse
from pyglet import shapes

title = "三子棋(卵子棋)"
window = pyglet.window.Window(520, 640, title)
window.set_location(600, 200)
batch1 = pyglet.graphics.Batch()
batch2 = pyglet.graphics.Batch()
background_pattern = pyglet.image.SolidColorImagePattern(color=(63, 154, 225, 255))
background_image = background_pattern.create_image(520, 640)
SIZE = 160

reds = []
blacks = []
shape_list = []
first = True
turn = '红'
last_turn = '黑'
redchess = # 红棋子初始位置
blackchess = # 黑棋子初始位置
Board = [
    ['红', '0', '黑'],
    ['红', '0', '黑'],
    ['红', '0', '黑']
]

x1, y1, x2, y2 = 0, 0, 0, 0

for i in range(3):
    circle1 = shapes.Circle(100 + redchess * SIZE, 170 + i * SIZE, 40, color=(255, 80, 0), batch=batch2)
    circle2 = shapes.Circle(100 + blackchess * SIZE, 170 + i * SIZE, 40, color=(0, 0, 0), batch=batch2)
    reds.append(circle1)
    blacks.append(circle2)

def drawBoard():
    for i in range(3):
      linex = shapes.Line(i * 160 + 100, 170, i * 160 + 100, 440, width=5, color=(0, 230, 0), batch=batch1)
      linex.opacity = 250
      circle1 = shapes.Circle(i * 160 + 100, 490, 60, color=(0, 230, 0), batch=batch1)
      circle2 = shapes.Circle(i * 160 + 100, 490, 55, color=(63, 154, 225), batch=batch1)
      shape_list.append(linex)
      shape_list.append(circle1)
      shape_list.append(circle2)
    for i in range(2):
      liney = shapes.Line(100, 170 + i * 160, 420, 170 + i * 160, width=5, color=(0, 230, 0), batch=batch1)
      liney.opacity = 250
      shape_list.append(liney)

drawBoard()

def change_side():
    global turn, last_turn
    last_turn = turn
    if turn == '红':
      turn = '黑'
    else:
      turn = '红'

@window.event
def on_mouse_press(x, y, button, modifiers):
    global first, x1, y1, turn, Board
    if button == mouse.LEFT:
      x = round((x - 100) / SIZE)
      y = round((y - 170) / SIZE)
      if first:
            x1 = x
            y1 = y
            print('x1,y1=', x1, y1)
            if Board != turn:
                return None
            if Board == turn:
                print('第一次单击')
                first = False
      else:
            x2 = x
            y2 = y
            print('x2,y2=', x2, y2)
            print(turn)
            if Board != '0':
                return None
            if turn == '红':
                reds.x = 100 + x2 * SIZE
                reds.y = 170 + y2 * SIZE
                redchess = x2
                Board = '0'
                Board = turn
            elif turn == '黑':
                blacks.x = 100 + x2 * SIZE
                blacks.y = 170 + y2 * SIZE
                blackchess = x2
                Board = '0'
                Board = turn
            change_side()
            first = True

@window.event
def on_draw():
    window.clear()
    background_image.blit(0, 0)
    batch1.draw()
    batch2.draw()

pyglet.app.run()

在这个代码中,`redchess` 和 `blackchess` 用于跟踪红黑棋子的位置。`on_mouse_press` 函数在移动棋子时更新这些位置,并更新 `Board` 的状态。这样可以确保棋子在移动后不会打乱布局。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 用pyglet如何写棋类游戏