Stage1st

 找回密码
 立即注册
搜索
查看: 1795|回复: 8

[软件] Python:(伪)大数据,机器学习,人工智能AI井字棋

[复制链接]
     
发表于 2021-1-14 01:36 | 显示全部楼层 |阅读模式
本帖最后由 Python3 于 2021-1-15 21:54 编辑

瞎猫算法什么的太难听了,大数据,机器学习,人工智能AI(伪)


Python瞎猫算法:电脑跟电脑下井字棋,记下胜局棋谱后和人类下

改进了一下,让电脑对战1万次增加到4个1万次,让电脑先动,棋力提升明显。
02.png
  1. import os
  2. import random
  3. import time
  4. from multiprocessing import Pool
  5. class ttt:
  6.     def __init__(self):
  7.         self.X_win = []
  8.         self.O_win = []

  9.     def fps(self, raw):
  10.         os.system('cls')
  11.         for i in range(3):
  12.             print(raw[str(i*3+1)]+'│'+raw[str(i*3+2)]+'│'+raw[str(i*3+3)])
  13.             if i < 2:
  14.                 print('─┼─┼─')

  15.     def win(self, xxxooo):
  16.         if (1 in xxxooo) and (2 in xxxooo) and (3 in xxxooo):
  17.             return True
  18.         elif (4 in xxxooo) and (5 in xxxooo) and (6 in xxxooo):
  19.             return True
  20.         elif (7 in xxxooo) and (8 in xxxooo) and (9 in xxxooo):
  21.             return True
  22.         elif (1 in xxxooo) and (4 in xxxooo) and (7 in xxxooo):
  23.             return True
  24.         elif (2 in xxxooo) and (5 in xxxooo) and (8 in xxxooo):
  25.             return True
  26.         elif (3 in xxxooo) and (6 in xxxooo) and (9 in xxxooo):
  27.             return True
  28.         elif (1 in xxxooo) and (5 in xxxooo) and (9 in xxxooo):
  29.             return True
  30.         elif (3 in xxxooo) and (5 in xxxooo) and (7 in xxxooo):
  31.             return True
  32.         else:
  33.             return False

  34.     def play(self, null):
  35.         number = 0
  36.         while number < 10000:
  37.             XO = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  38.             X = []
  39.             O = []
  40.             X_win = []
  41.             O_win = []

  42.             for index in range(5):
  43.                 X1 = random.choice(XO)
  44.                 X.append(X1)
  45.                 XO.remove(X1)
  46.                 X_win.append([X1])
  47.                 if index > 1:
  48.                     if self.win(X):
  49.                         if X_win not in self.X_win:
  50.                             self.X_win.append(X_win)
  51.                         break
  52.                 if XO:
  53.                     O1 = random.choice(XO)
  54.                     O.append(O1)
  55.                     XO.remove(O1)
  56.                     X_win[index].append(O1)
  57.                     #O_win.append([X1, O1])
  58.                     if index > 1:
  59.                         if self.win(O):
  60.                             #if O_win not in self.O_win:
  61.                                 #self.O_win.append(O_win)
  62.                             break
  63.             number = number+1
  64.         return self.X_win, #self.O_win

  65.     def play2(self, XXX):
  66.         while True:
  67.             raw = {
  68.                 '1': '1',
  69.                 '2': '2',
  70.                 '3': '3',
  71.                 '4': '4',
  72.                 '5': '5',
  73.                 '6': '6',
  74.                 '7': '7',
  75.                 '8': '8',
  76.                 '9': '9',
  77.             }
  78.             XO = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  79.             X = []
  80.             O = []
  81.             X_winO = XXX
  82.             self.fps(raw)
  83.             for index in range(5):
  84.                 # X1 = int(input('请输入位置数字(按Q退出):'))
  85.                 if index == 0:
  86.                     X1 = random.choice(XO)
  87.                     X_winOO = []
  88.                     for X_winO1 in X_winO:
  89.                         if X1 == X_winO1[index][0]:
  90.                             X_winOO.append([len(X_winO1), X_winO1])
  91.                     X_winOO = sorted(X_winOO)
  92.                     X_winOOO = []
  93.                     for X_winOO1 in X_winOO:
  94.                         X_winOOO.append(X_winOO1[1])
  95.                     X_winO = X_winOOO
  96.                     if X_winO:
  97.                         pass
  98.                     else:
  99.                         input('没有棋谱,按Enter重玩。')
  100.                         break
  101.                 else:
  102.                     if X_winO:
  103.                         if len(X_winO[0]) <= index:
  104.                             for X_winO_null in X_winO.copy():
  105.                                 if len(X_winO_null) <= index:
  106.                                     X_winO.remove(X_winO_null)
  107.                         X_winOO = []
  108.                         if X_winO:
  109.                             for X_winO1 in X_winO:
  110.                                 if (O1 == X_winO1[index-1][1]) and (X1 == X_winO1[index-1][0]):
  111.                                     X_winOO.append([len(X_winO1), X_winO1])
  112.                             X_winOO = sorted(X_winOO)
  113.                             X_winOOO = []
  114.                             for X_winOO1 in X_winOO:
  115.                                 X_winOOO.append(X_winOO1[1])
  116.                             X_winO = X_winOOO
  117.                         else:
  118.                             input('没有棋谱,按Enter重玩。')
  119.                             break

  120.                         if X_winO:
  121.                             if len(X_winO[0]) > index:
  122.                                 if O1 == X_winO[0][index-1][1]:
  123.                                     X1 = X_winO[0][index][0]
  124.                             else:
  125.                                 input('没有棋谱,按Enter重玩。')
  126.                                 break
  127.                         else:
  128.                             input('没有棋谱,按Enter重玩。')
  129.                             break
  130.                 X.append(X1)
  131.                 try:
  132.                     XO.remove(X1)
  133.                 except:
  134.                     print(X1)
  135.                     print(X_winO[0])
  136.                     input('出错')
  137.                 raw[str(X1)] = '×'
  138.                 self.fps(raw)
  139.                 if index > 1:
  140.                     if self.win(X):
  141.                         message = input('加把劲,伙计!按Enter重玩。按Q退出。')
  142.                         if message == 'Q' or message == 'q':
  143.                             exit()
  144.                         break
  145.                 #time.sleep(1)
  146.                 if XO:
  147.                     while True:
  148.                         O1 = input('请输入位置数字(按Q退出):')
  149.                         if O1 == 'Q' or O1 == 'q':
  150.                             exit()
  151.                         O1 = int(O1)
  152.                         if O1 in XO:
  153.                             break
  154.                         else:
  155.                             input('输入位置已存在,或者超出范围。按Enter继续……')
  156.                     O.append(O1)
  157.                     XO.remove(O1)
  158.                     raw[str(O1)] = '○'
  159.                     self.fps(raw)
  160.                     if index > 1:
  161.                         if self.win(O):
  162.                             message = input('你赢了!按Enter重玩。按Q退出。')
  163.                             if message == 'Q' or message == 'q':
  164.                                 exit()
  165.                             break
  166.                     time.sleep(1)
  167. if __name__ == "__main__":
  168.     with Pool(4) as p:
  169.         xxx = p.map(ttt().play, [1, 2, 3, 4])
  170.     XXX = []
  171.     for xx in xxx:
  172.         for x in xx:
  173.             for x1 in x:
  174.                 if x1 not in XXX:
  175.                     XXX.append(x1)
  176.     ttt().play2(XXX)
复制代码





电脑的棋力好像很差,而且有时会不知道哪里引起出错,我不行了
01.png

  1. import os
  2. import random
  3. import time
  4. class ttt:
  5.     def __init__(self):
  6.         self.O_win = []

  7.     def fps(self, raw):
  8.         os.system('cls')
  9.         for i in range(3):
  10.             print(raw[str(i*3+1)]+'│'+raw[str(i*3+2)]+'│'+raw[str(i*3+3)])
  11.             if i < 2:
  12.                 print('─┼─┼─')

  13.     def win(self, xxxooo):
  14.         if (1 in xxxooo) and (2 in xxxooo) and (3 in xxxooo):
  15.             return True
  16.         elif (4 in xxxooo) and (5 in xxxooo) and (6 in xxxooo):
  17.             return True
  18.         elif (7 in xxxooo) and (8 in xxxooo) and (9 in xxxooo):
  19.             return True
  20.         elif (1 in xxxooo) and (4 in xxxooo) and (7 in xxxooo):
  21.             return True
  22.         elif (2 in xxxooo) and (5 in xxxooo) and (8 in xxxooo):
  23.             return True
  24.         elif (3 in xxxooo) and (6 in xxxooo) and (9 in xxxooo):
  25.             return True
  26.         elif (1 in xxxooo) and (5 in xxxooo) and (9 in xxxooo):
  27.             return True
  28.         elif (3 in xxxooo) and (5 in xxxooo) and (7 in xxxooo):
  29.             return True
  30.         else:
  31.             return False

  32.     def play(self):
  33.         number = 0
  34.         while number < 10000:
  35.             raw = {
  36.                 '1': '1',
  37.                 '2': '2',
  38.                 '3': '3',
  39.                 '4': '4',
  40.                 '5': '5',
  41.                 '6': '6',
  42.                 '7': '7',
  43.                 '8': '8',
  44.                 '9': '9',
  45.             }
  46.             XO = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  47.             X = []
  48.             O = []
  49.             O_win = []

  50.             for index in range(5):
  51.                 X1 = random.choice(XO)
  52.                 X.append(X1)
  53.                 XO.remove(X1)
  54.                 raw[str(X1)] = '×'

  55.                 if index > 1:
  56.                     if self.win(X):
  57.                         break

  58.                 if XO:
  59.                     O1 = random.choice(XO)
  60.                     O.append(O1)
  61.                     XO.remove(O1)
  62.                     raw[str(O1)] = '○'
  63.                     O_win.append([X1, O1])
  64.                     if index > 1:
  65.                         if self.win(O):

  66.                             if O_win not in self.O_win:
  67.                                 self.O_win.append(O_win)
  68.                             break
  69.             number = number+1
  70.         return self.O_win

  71.     def play2(self, OOO):
  72.         while True:
  73.             raw = {
  74.                 '1': '1',
  75.                 '2': '2',
  76.                 '3': '3',
  77.                 '4': '4',
  78.                 '5': '5',
  79.                 '6': '6',
  80.                 '7': '7',
  81.                 '8': '8',
  82.                 '9': '9',
  83.             }
  84.             XO = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  85.             X = []
  86.             O = []
  87.             O_winX = OOO
  88.             self.fps(raw)
  89.             for index in range(5):
  90.                 X1 = int(input('请输入位置数字(按Q退出):'))
  91.                 X.append(X1)
  92.                 XO.remove(X1)
  93.                 raw[str(X1)] = '×'
  94.                 self.fps(raw)
  95.                 if index > 1:
  96.                     if self.win(X):
  97.                         message = input('你赢了!按Enter重玩。按Q退出。')
  98.                         if message == 'Q' or message == 'q':
  99.                             exit()
  100.                         break
  101.                 time.sleep(1)
  102.                 if XO:
  103.                     O_winXX = []
  104.                     for O_winX1 in O_winX:
  105.                         if X1 == O_winX1[index][0]:
  106.                             O_winXX.append([len(O_winX1), O_winX1])
  107.                     O_winXX = sorted(O_winXX)
  108.                     O_winXXX = []
  109.                     for O_winXX1 in O_winXX:
  110.                         O_winXXX.append(O_winXX1[1])
  111.                     O_winX = O_winXXX
  112.                     if O_winX:
  113.                         if len(O_winX[0]) >= index:
  114.                             if X1 == O_winX[0][index][0]:
  115.                                 O1 = O_winX[0][index][1]
  116.                             else:
  117.                                 O1 = random.choice(XO)
  118.                                 input('没有棋谱!此步随机,按Enter继续……')
  119.                     else:
  120.                         O1 = random.choice(XO)
  121.                         input('没有棋谱!此步随机,按Enter继续……')
  122.                     O.append(O1)
  123.                     XO.remove(O1)
  124.                     raw[str(O1)] = '○'
  125.                     self.fps(raw)
  126.                     if index > 1:
  127.                         if self.win(O):
  128.                             message = input('你输了!按Enter重玩。按Q退出。')
  129.                             if message == 'Q' or message == 'q':
  130.                                 exit()
  131.                             break
  132.                     #time.sleep(1)
  133. OOO = ttt().play()
  134. ttt().play2(OOO)
复制代码






回复

使用道具 举报

     
发表于 2021-1-14 03:19 来自手机 | 显示全部楼层
这不应该是很经典的BFS/DFS么?我记得我之前闲着没事写过一个来着
回复

使用道具 举报

     
 楼主| 发表于 2021-1-14 21:49 | 显示全部楼层
改进了一下,让电脑对战1万次增加到4个1万次,让电脑先动,棋力提升明显。
回复

使用道具 举报

发表于 2021-1-15 09:35 | 显示全部楼层
好嘛,本来是个DFS问题。楼主这是要记录所有的subgraph,完了搜索subgraph....
回复

使用道具 举报

     
发表于 2021-1-15 09:39 | 显示全部楼层
好活
回复

使用道具 举报

     
发表于 2021-1-15 09:43 来自手机 | 显示全部楼层
楼主这算是逆练算法与数据结构?
回复

使用道具 举报

     
发表于 2021-1-15 18:57 | 显示全部楼层
https://www.luogu.com.cn/problem/U46090
有兴趣可以做一下
事实上因为棋盘比较小 假设一个格子有3种状态 黑 白 空
总计状态数也只有3^9
直接做一个博弈DP即可
回复

使用道具 举报

     
发表于 2021-1-15 19:05 来自手机 | 显示全部楼层
p3 侠突然高技术力了。。。

—— 来自 Xiaomi M2007J3SC, Android 10上的 S1Next-鹅版 v2.4.4
回复

使用道具 举报

     
发表于 2021-1-15 20:17 | 显示全部楼层
总共也就不到20000种状态,做成棋谱也不过一页纸

楼主看似小题大做,实际上是对大数据,人工智能领域灌水的无情嘲讽
这波楼主在第五层
回复

使用道具 举报

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

本版积分规则

小黑屋|Archiver|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|stage1st ( 沪ICP备130202305 沪公网安备 31010702004909号 )

GMT+8, 2021-1-17 05:54 , Processed in 0.034781 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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