Stubborn 发表于 2024-8-8 17:04:23

求一份五子棋源码,有AI对战的那种

求一份五子棋源码,有AI对战的那种

sfqxx 发表于 2024-8-8 17:06:33

你可以在论坛搜一搜,不知道有没有你想要的。

好比 支持联机对战的五子棋小游戏
https://fishc.com.cn/thread-156157-1-1.html
(出处: 鱼C论坛)

某一个“天” 发表于 2024-8-8 17:09:14

你先看看这个大神的?
https://github.com/sgsx11/Gobang

三体人的智子 发表于 2024-8-8 17:10:35

咱鱼C多着呢

https://fishc.com.cn/forum.php?mod=viewthread&tid=82059&highlight=%CE%E5%D7%D3%C6%E5 (AI对战)
https://fishc.com.cn/forum.php?mod=viewthread&tid=173639&highlight=%CE%E5%D7%D3%C6%E5(VS编译)
(出自鱼C)

Stubborn 发表于 2024-8-8 17:16:17

某一个“天” 发表于 2024-8-8 17:09
你先看看这个大神的?
https://github.com/sgsx11/Gobang

阔以的

FishC 发表于 2024-8-8 17:19:53

好的,既然你想要一份可以和AI对战的五子棋源码,我就来给你一个简单的实现思路和代码示例。

先说一下,五子棋其实就是在一个棋盘上,两个玩家轮流下棋。谁先在横、竖或斜方向上连成五个棋子,谁就赢了!我们可以使用简单的算法让计算机“思考”,比如最基本的Minimax算法。

下面是一个用Python写的简单五子棋AI对战的示例:

import numpy as np

# 棋盘大小
BOARD_SIZE = 15

class Gobang:
    def __init__(self):
      self.board = np.zeros((BOARD_SIZE, BOARD_SIZE), dtype=int)# 0: 空,1: 黑子,2: 白子
      self.current_player = 1# 1: 黑子先行

    def print_board(self):
      for row in self.board:
            print(' '.join(['X' if x == 1 else 'O' if x == 2 else '.' for x in row]))
      print()

    def is_winner(self, player):
      # 检查横向、纵向和两个斜向
      for x in range(BOARD_SIZE):
            for y in range(BOARD_SIZE):
                if self.board == player:
                  if self.check_line(x, y, player, 1, 0) or \
                     self.check_line(x, y, player, 0, 1) or \
                     self.check_line(x, y, player, 1, 1) or \
                     self.check_line(x, y, player, 1, -1):
                        return True
      return False

    def check_line(self, x, y, player, dx, dy):
      count = 0
      for _ in range(5):
            if 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE and self.board == player:
                count += 1
            else:
                break
            x += dx
            y += dy
      return count >= 5

    def place_piece(self, x, y):
      if self.board == 0:
            self.board = self.current_player
            if self.is_winner(self.current_player):
                print(f'玩家 {self.current_player} 赢了!')
            self.current_player = 2 if self.current_player == 1 else 1# 切换玩家

    def ai_move(self):
      # 简单的AI,只在第一个空位落子
      for x in range(BOARD_SIZE):
            for y in range(BOARD_SIZE):
                if self.board == 0:
                  self.place_piece(x, y)
                  return

def main():
    game = Gobang()
    while True:
      game.print_board()
      if game.current_player == 1:
            x, y = map(int, input("请输入你的坐标 (x y): ").split())
            game.place_piece(x, y)
      else:
            print("AI 在下棋...")
            game.ai_move()

if __name__ == "__main__":
    main()

### 简单解释:
- 这个代码定义了一个`Gobang`类来管理棋盘和游戏逻辑。
- `print_board`方法用于打印当前的棋盘状态。
- `is_winner`方法检查是否有玩家胜利。
- `place_piece`方法用于放置棋子并切换玩家。
- AI策略非常简单,它只是找第一个空的位置下棋。

你可以运行这个脚本,在命令行输入棋子的坐标(例如 "7 7",代表在第7行第7列),然后AI会在空位置落子。虽然这个AI不太聪明,但至少可以帮你打发时间!

希望这个代码对你有帮助,让你在五子棋的世界中驰骋!如果需要更复杂的AI逻辑,可以尝试minimax算法结合剪枝技术,但这已经是另一个故事啦!

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

sfqxx 发表于 2024-8-8 17:27:17

楼主不回人是什么鬼

Stubborn 发表于 2024-8-8 17:30:18

sfqxx 发表于 2024-8-8 17:27
楼主不回人是什么鬼

那个有看过了,谢谢{:5_109:}

sfqxx 发表于 2024-8-8 17:33:03

Stubborn 发表于 2024-8-8 17:30
那个有看过了,谢谢

O

某一个“天” 发表于 2024-8-8 19:08:32

Stubborn 发表于 2024-8-8 17:16
阔以的

我这几天有事,过一周左右再给你源码,你先参考一下我发那个{:10_256:}
页: [1]
查看完整版本: 求一份五子棋源码,有AI对战的那种