找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1526|回复: 0
收起左侧

求给Python五子棋程序添加注释

[复制链接]
ID:342623 发表于 2018-11-22 08:49 | 显示全部楼层 |阅读模式
1黑币
  1. import pygame, random, math, tkinter
  2. import numpy as np
  3. X1=40;   X2=600
  4. Y1=100;  Y2=660
  5. LEN=40;  gobang_r=20; gobangboard=[]
  6. def DrawGobangBoard(screen):
  7.     color = [0,0,0];
  8.     for i in range(15):
  9.         pygame.draw.line(screen, color, (X1,Y1+LEN*i), (X2,Y1+LEN*i), 1)
  10.         pygame.draw.line(screen, color, (X1+LEN*i,Y1), (X1+LEN*i,Y2), 1)
  11.    
  12.     pygame.draw.line(screen, color, (X1-4,Y1-4), (X2+4,Y1-4), 5)
  13.     pygame.draw.line(screen, color, (X1-4,Y2+4), (X2+4,Y2+4), 5)
  14.     pygame.draw.line(screen, color, (X1-4,Y1-4), (X1-4,Y2+4), 5)
  15.     pygame.draw.line(screen, color, (X2+4,Y1-4), (X2+4,Y2+4), 5)
  16.    
  17.     pygame.draw.circle(screen, color, [X1+3*LEN,  Y1+3*LEN],  3, 0)
  18.     pygame.draw.circle(screen, color, [X1+11*LEN, Y1+3*LEN],  3, 0)
  19.     pygame.draw.circle(screen, color, [X1+3*LEN,  Y1+11*LEN], 3, 0)
  20.     pygame.draw.circle(screen, color, [X1+11*LEN, Y1+11*LEN], 3, 0)
  21.     pygame.draw.circle(screen, color, [X1+7*LEN,  Y1+7*LEN],  3, 0)
  22. def Init(screen):
  23.     screen.fill((227, 207, 87))
  24.     DrawGobangBoard(screen)
  25.     gobangboard.clear()
  26.     for i in range(15):
  27.         t = []
  28.         for j in range(15):
  29.             t.append(0)
  30.         gobangboard.append(t)
  31.     font = pygame.font.SysFont('simhei', 56)
  32.     text = font.render("智能五子棋", True, [0,0,0])
  33.     screen.blit(text, [180,15])
  34.    
  35. def Distance(x1, y1, x2, y2):
  36.     return int(math.sqrt(math.pow(x1-x2,2) + math.pow(y1-y2,2)))
  37.    
  38. def Drop(p):
  39.     x = p[0]; y = p[1]
  40.     if x < X1-gobang_r or x > X2+gobang_r or y < Y1-gobang_r or y > Y2+gobang_r:
  41.         return [x,y],False
  42.     a = int((x-X1)/LEN)*LEN + X1
  43.     b = int((y-Y1)/LEN)*LEN + Y1
  44.    
  45.     d1 = Distance(x, y, a, b)
  46.     if d1<gobang_r:
  47.         if gobangboard[int((a-X1)/LEN)][int((b-Y1)/LEN)] == 0:
  48.             return [a,b],True
  49.         else: return [a,b],False
  50.    
  51.     d2 = Distance(x, y, a, b+LEN)
  52.     if d2<gobang_r:
  53.         if gobangboard[int((a-X1)/LEN)][int((b+LEN-Y1)/LEN)] == 0:
  54.             return [a,b+LEN],True
  55.         else: return [a,b+LEN],False
  56.    
  57.     d3 = Distance(x, y, a+LEN, b)
  58.     if d3<gobang_r:
  59.         if gobangboard[int((a+LEN-X1)/LEN)][int((b-Y1)/LEN)] == 0:
  60.             return [a+LEN,b],True
  61.         else: return [a+LEN,b],False
  62.    
  63.     d4 = Distance(x, y, a+LEN, b+LEN)
  64.     if d4<gobang_r:
  65.         if gobangboard[int((a+LEN-X1)/LEN)][int((b+LEN-Y1)/LEN)] == 0:
  66.             return [a+LEN,b+LEN],True
  67.         else: return [a+LEN,b+LEN],False
  68.     return [a,b],False
  69. def getGobang(x, y, dire, dis):
  70.     if dire == 1:
  71.         x += dis
  72.     elif dire == 2:
  73.         x += dis
  74.         y += dis
  75.     elif dire == 3:
  76.         y += dis
  77.     elif dire == 4:
  78.         x -= dis
  79.         y += dis
  80.     elif dire == 5:
  81.         x -= dis
  82.     elif dire == 6:
  83.         x -= dis
  84.         y -= dis
  85.     elif dire == 7:
  86.         y -= dis
  87.     elif dire == 8:
  88.         x += dis
  89.         y -= dis
  90.     if x<0 or y<0 or x>14 or y>14:
  91.         return -2
  92.     return gobangboard[x][y]
  93. def Evaluate(x, y, player):
  94.     value = 0
  95.     for i in np.arange(1,9):
  96.         if getGobang(x,y,i,1) == player and getGobang(x,y,i,2) == player         and getGobang(x,y,i,3) == player and getGobang(x,y,i,4) == player:
  97.             value += 2000
  98.             continue
  99.         if getGobang(x,y,i,-1) == player and getGobang(x,y,i,1) == player         and getGobang(x,y,i,2) == player and getGobang(x,y,i,3) == player:
  100.             value += 2000
  101.             continue
  102.         if getGobang(x,y,i,-2) == player and getGobang(x,y,i,-1) == player         and getGobang(x,y,i,1) == player and getGobang(x,y,i,2) == player:
  103.             value += 2000
  104.             continue
  105.         
  106.         if getGobang(x,y,i,1) == player and getGobang(x,y,i,2) == player and getGobang(x,y,i,3) == player:
  107.             if getGobang(x,y,i,-1) == 0:
  108.                 if getGobang(x,y,i,4) == 0:
  109.                     value += 400
  110.                     continue
  111.                 elif getGobang(x,y,i,4) == -player or getGobang(x,y,i,4) == -2:
  112.                     value += 210
  113.                     continue
  114.             elif (getGobang(x,y,i,-1) == -player or getGobang(x,y,i,-1) == -2) and getGobang(x,y,i,4) == 0:
  115.                 value += 210
  116.                 continue
  117.         
  118.         if getGobang(x,y,i,-1) == player and getGobang(x,y,i,1) == player and getGobang(x,y,i,2) == player:
  119.             if getGobang(x,y,i,-2) == 0:
  120.                 if getGobang(x,y,i,3) == 0:
  121.                     value += 400
  122.                     continue
  123.                 elif getGobang(x,y,i,3) == -player or getGobang(x,y,i,3) == -2:
  124.                     value += 210
  125.                     continue
  126.             elif (getGobang(x,y,i,-2) == -player or getGobang(x,y,i,-2) == -2) and getGobang(x,y,i,3) == 0:
  127.                 value += 210
  128.                 continue
  129.         
  130.         if getGobang(x,y,i,1) == player and getGobang(x,y,i,2) == player:
  131.             if getGobang(x,y,i,-1) == 0:
  132.                 if getGobang(x,y,i,3) == 0:
  133.                     value += 110
  134.                     continue
  135.                 elif (getGobang(x,y,i,3) == -player or getGobang(x,y,i,3) == -2)                 and (getGobang(x,y,i,-2) == 0 or getGobang(x,y,i,-2) == player):
  136.                     value += 25
  137.                     continue
  138.             elif (getGobang(x,y,i,-1) == -player or getGobang(x,y,i,-1) == -2) and getGobang(x,y,i,3) == 0             and (getGobang(x,y,i,4) == 0 or getGobang(x,y,i,4) == player):
  139.                 value += 25
  140.                 continue
  141.         
  142.         if getGobang(x,y,i,-1) == player and getGobang(x,y,i,1) == player:
  143.             if getGobang(x,y,i,-2) == 0:
  144.                 if getGobang(x,y,i,2) == 0:
  145.                     value += 110
  146.                     continue
  147.                 elif (getGobang(x,y,i,2) == -player or getGobang(x,y,i,2) == -2)                 and (getGobang(x,y,i,-3) == 0 or getGobang(x,y,i,-3) == player):
  148.                     value += 25
  149.                     continue
  150.             elif (getGobang(x,y,i,-2) == -player or getGobang(x,y,i,-2) == -2) and getGobang(x,y,i,2) == 0             and (getGobang(x,y,i,3) == 0 or getGobang(x,y,i,3) == player):
  151.                 value += 25
  152.                 continue
  153.                
  154.         if getGobang(x,y,i,-1) == player:
  155.             if getGobang(x,y,i,1) == 0 and (getGobang(x,y,i,-2) == 0             or getGobang(x,y,i,-2) == -player or getGobang(x,y,i,-2) == -2):
  156.                 value += 5
  157.                 continue
  158.             elif getGobang(x,y,i,1) == -player or getGobang(x,y,i,1) == -2:
  159.                 value += 1
  160.                 continue
  161.     return value
  162.    
  163. def getMaxValue(player):
  164.     maxvalue=0;
  165.     x = []; y = []
  166.     for i in range(15):
  167.         for j in range(15):
  168.             if gobangboard[i][j] == 0:
  169.                 weight = Evaluate(i,j,player)
  170.                 if maxvalue < weight:
  171.                     maxvalue = weight
  172.                     x.clear(); y.clear()
  173.                     x.append(i)
  174.                     y.append(j)
  175.                 elif maxvalue == weight:
  176.                     x.append(i)
  177.                     y.append(j)
  178.     t = random.randint(0,len(x)-1)
  179.     xx = X1+x[t]*LEN
  180.     yy = Y1+y[t]*LEN
  181.     return maxvalue,[xx,yy]
  182. def Win(turn):
  183.     player = 1 if turn else -1
  184.     for i in range(15):
  185.         for j in range(11):
  186.             if gobangboard[i][j] == player and gobangboard[i][j+1] == player and gobangboard[i][j+2] == player             and gobangboard[i][j+3] == player and gobangboard[i][j+4] == player:
  187.                 return True
  188.     for i in range(15):
  189.         for j in range(11):
  190.             if gobangboard[j][i] == player and gobangboard[j+1][i] == player and gobangboard[j+2][i] == player             and gobangboard[j+3][i] == player and gobangboard[j+4][i] == player:
  191.                 return True
  192.     for i in range(11):
  193.         for j in range(11):
  194.             if gobangboard[i][j] == player and gobangboard[i+1][j+1] == player and gobangboard[i+2][j+2] == player             and gobangboard[i+3][j+3] == player and gobangboard[i+4][j+4] == player:
  195.                 return True
  196.     for i in range(11):
  197.         for j in np.arange(4,15):
  198.             if gobangboard[i][j] == player and gobangboard[i+1][j-1] == player and gobangboard[i+2][j-2] == player             and gobangboard[i+3][j-3] == player and gobangboard[i+4][j-4] == player:
  199.                 return True
  200.     return False
  201. def Tie():
  202.     for i in range(15):
  203.         for j in range(15):
  204.             if gobangboard[i][j] == 0:
  205.                 return False
  206.     return True
  207. def showMessage(info, color):
  208.     win = tkinter.Tk()
  209.     win.wm_attributes('-topmost', 1)
  210.     win.geometry("150x150")
  211.     win.resizable(0,0)
  212.     win.title("游戏结束")
  213.     frame = tkinter.Frame(win, width='150', height='150', bg='#E3CE57')
  214.     label = tkinter.Label(frame, text=info, bitmap= 'warning', compound='left', font='12',bg='#E3CE57', fg=color).pack(padx='20', pady='20')
  215.     btn = tkinter.Button(frame, text="再玩一局!", command=win.destroy, bg='#E3CE57', fg=color).pack(padx='40', pady='20')
  216.     frame.pack()
  217.     win.mainloop()
  218. def main():
  219.     pygame.init()
  220.     screen = pygame.display.set_mode((640,700), 0, 32)
  221.     pygame.display.set_caption("Gobang")
  222.     while True:
  223.         pygame.display.init()
  224.         Init(screen)
  225.         turn = True; flag = False
  226.         while True:
  227.             if turn == True:
  228.                 for event in pygame.event.get():
  229.                     if event.type == pygame.QUIT:
  230.                         pygame.quit()
  231.                         exit()
  232.                     if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
  233.                         p = pygame.mouse.get_pos()
  234.                         p,judge = Drop(p)
  235.                         if judge == False:
  236.                             flag = True
  237.                             break
  238.                         pygame.draw.circle(screen, [0,0,0], p, gobang_r, 0)
  239.                         gobangboard[int((p[0]-X1)/LEN)][int((p[1]-Y1)/LEN)] = 1
  240.                         turn = False
  241.             else:
  242.                 max1,p1 = getMaxValue(-1)
  243.                 max2,p2 = getMaxValue(1)
  244.                 if max1>=max2 or max1>=10 and max2<220:
  245.                     p = p1
  246.                 else:
  247.                     p = p2
  248.                 pygame.draw.circle(screen, [255,255,255], p,  gobang_r, 0)
  249.                 gobangboard[int((p[0]-X1)/LEN)][int((p[1]-Y1)/LEN)] = -1
  250.                 turn = True
  251.             pygame.display.update()
  252.             if flag == True:
  253.                 flag = False
  254.                 continue
  255.             if Win(not turn) == True:
  256.                 if turn == False:
  257.                     showMessage('你赢了!', 'green')
  258.                 else:
  259.                     showMessage('你输了!', 'red')
  260.                 break
  261.             if Tie() == True:
  262.                 showMessage('双方平局!', 'yellow')
  263.                 break
  264.             
  265. if __name__ == "__main__":
  266.     main()
复制代码

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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