鱼C论坛

 找回密码
 立即注册
查看: 1336|回复: 13

[作品展示] 无聊用集合形式随便写个井字棋小游戏玩玩

[复制链接]
发表于 2024-8-12 16:27:25 | 显示全部楼层
本帖最后由 Stubborn 于 2024-8-12 16:31 编辑

只要你不作弊,肯定赢不了的井字棋,你咸鱼好久了,开始冒泡啦?

  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/python3
  3. """
  4. @ Version : ??
  5. @ Author : Alex
  6. @ Software : Pycharm
  7. @ Time : 2020/3/21 下午8:30
  8. """


  9. MARKERS = ['_', 'O', 'X']
  10. PRINTING_TRIADS = ((0, 1, 2), (3, 4, 5), (6, 7, 8))


  11. def view_bar():

  12.     import time, sys
  13.     for i in range(21):
  14.         sys.stdout.write('\r%s > %d%%' % ("#" * i, int((i / 20) * 100)))
  15.         sys.stdout.flush()
  16.         time.sleep(0.05)


  17. def vacancy(board):
  18.     """棋盘是还有空位"""
  19.     return 0 in board


  20. def winner(board):
  21.     """是否有获胜者
  22.         1,-1 有胜负
  23.         0 表示没有胜负,没有结束,或者平局
  24.     """
  25.     lines = [board[0:3], board[3:6], board[6:9], board[0::3], board[1::3], board[2::3], board[0::4], board[2:7:2]]
  26.     return 1 if [1] * 3 in lines else -1 if [-1] * 3 in lines else 0


  27. def score(board, player=-1, next_player=1, alpha=-2, beta=2):
  28.     win = winner(board)
  29.     if win != 0:
  30.         return win
  31.     if not vacancy(board):
  32.         return 0
  33.     for move in range(9):
  34.         if board[move] == 0:
  35.             board[move] = player
  36.             val = score(board, next_player, player)
  37.             board[move] = 0
  38.             if player == 1:
  39.                 alpha = max(val, alpha)
  40.             beta = min(val, beta)
  41.     return alpha if player == 1 else beta


  42. def moves(board):
  43.     scores = 0
  44.     mo = 0
  45.     for move in range(9):
  46.         '''找出空位,计算当前棋局得分'''
  47.         if board[move] == 0:
  48.             board[move] = 1
  49.             val = score(board)
  50.             board[move] = 0
  51.             '''记录最高分,和位置'''
  52.             mo = move if val >= scores else mo

  53.     return mo


  54. def board_print(board):
  55.     """打印当前棋盘"""
  56.     for row in PRINTING_TRIADS:
  57.         r = ' '
  58.         for hole in row:
  59.             r += MARKERS[board[hole]] + ' '
  60.         print(r)


  61. def main():
  62.     """
  63.     程序主入口
  64.     """
  65.     # 决定先手
  66.     next_move = "PLAYER"
  67.     opt = input("输入'C'电脑先手,否则默认玩家先手,友情提示(如果下不赢,可以输入下面作弊代码!\nCopy代码:I love Fishc\n请输入:")
  68.     if opt in ['C', 'c']:
  69.         next_move = "COMPUTER"

  70.     # 初始化棋盘
  71.     board = [0 for _ in range(9)]

  72.     # Go 开始游戏,
  73.     while vacancy(board) and winner(board) == 0:
  74.         board_print(board)

  75.         if next_move == "PLAYER" and vacancy(board):
  76.             """处理落子无效位置,超出范围,以及有子"""
  77.             try:
  78.                 location = int(input("请输入你要落子的位置(1-9):")) - 1
  79.                 assert board[location] == 0
  80.                 assert -1 < location < 9
  81.                 board[location] = -1
  82.                 next_move = "COMPUTER"
  83.             except (ValueError, AssertionError, IndexError):
  84.                 print("输入有误,重新落子")
  85.         if opt == 'I love Fishc':
  86.             print('鱼友最可爱了')
  87.             location = board.index(0)
  88.             print("\nComputer最终决定下在", location + 1)
  89.             board[location] = 1
  90.             next_move = "PLAYER"

  91.         elif next_move == "COMPUTER" and vacancy(board):
  92.             print('COMPUTER正在开启暴力搜索\t')
  93.             view_bar()
  94.             location = moves(board)
  95.             print("\nComputer最终决定下在", location + 1)
  96.             board[location] = 1

  97.             next_move = "PLAYER"

  98.     # 输出结果
  99.     board_print(board)
  100.     print('这次游戏是', ["平局", "Computer赢了", "你赢了"][winner(board)])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-19 03:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表