2022年 11月 9日

python实现简单五子棋

 规则:用鼠标下子,黑子白子交替下子

核心:1、使用turtle库画棋盘

           2、turtle库中的onscreenclick()函数,实现鼠标点击

详细步骤:

1、画棋盘,初始化数组

用turtle()库fd()函数实现画直线,tracer(0)消除动画效果

定义一个二维数组,也就是列表来对应棋盘上的落子情况,没有子为0,黑子为1,白子为-1

  1. # 1、画棋盘,初始化棋盘
  2. from turtle import *
  3. screensize()
  4. tracer(0)
  5. for i in range(15):#画横向
  6. penup()
  7. goto(-280,-280+i*40)
  8. pendown()
  9. fd(560)
  10. left(90)
  11. for i in range(15):#画竖向
  12. penup()
  13. goto(-280+i*40,-280)
  14. pendown()
  15. fd(560)
  16. penup() #画标点
  17. goto(0,0)
  18. dot()
  19. goto(160,160)
  20. dot()
  21. goto(-160,160)
  22. dot()
  23. goto(160,-160)
  24. dot()
  25. goto(-160,-160)
  26. dot()

*** 用一个二维数组来表示棋盘里的子

  1. #如果要使用列表创建一个二维数组,可以使用生成器来辅助实现。
  2. #棋盘上每一个点初始值为0
  3. arr=[[0 for i in range(15)] for j in range(15)]

2、实现落子功能

函数:turtle.onscreenclick(fun, btn=1, add=None)

参数:

fun 一个具有两个参数的函数,即画布上单击点的坐标。

btn mouse-button的编号默认为1(鼠标左键)

add 对或错。如果为True,将添加新的绑定,否则它将替换以前的绑定

funclick(x,y)函数:落子功能实现,通过遍历每个点,判断鼠标点击的位置与遍历的位置的距离,如果距离在范围内,并且该位置上没有子,就实现落子,然后交换落子者

  1. # 2、鼠标事件,点击落子
  2. turn=0 #记录该哪方落子
  3. def funclick(x,y):
  4. global turn
  5. global arr
  6. if turn==0: #黑子先下1
  7. for i in range(15):
  8. Y=280-i*40
  9. for j in range(15):
  10. X=-280+j*40 #棋盘上的整点
  11. if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
  12. arr[i][j]=1
  13. goto(X,Y)
  14. dot(20)
  15. turn=1 #交替下子
  16. black_is_end(i,j)
  17. if turn==1: #白子-1
  18. for i in range(15):
  19. Y=280-i*40
  20. for j in range(15):
  21. X=-280+j*40 #棋盘上的整点
  22. if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
  23. arr[i][j]=-1
  24. goto(X+10,Y)
  25. pendown()
  26. circle(10)
  27. penup()
  28. turn=0 #交替下子
  29. white_is_end(i,j)
  30. onscreenclick(funclick)

3、判断是否五子连线、

black_is_end()函数:

①横向:由落子位置所在行数,从该行第一个位置开始判断往右5个是否都为刚才所落颜色的子,不是的话继续从第二个位置开始,往右5个判断,直到判断到最后一个子。

②竖向:由落子位置所在列数,从该列第一个位置开始判断往下5个是否都为刚才所落颜色的子,不是的话继续从第二个位置开始,往下5个判断,直到判断到最后一个子。

③\ 向:由落子位置向左斜上方找到第一个子然后遍历

④/ 向:由落子位置向右斜上方找到第一个子然后遍历

如果连成5子,输出那一方胜利,把onscreenclick()函数置空,使点击鼠标不能再下子。

  1. # 3、判断4个方向是否连成五个子
  2. def fun_null(x,y):
  3. return ;
  4. def black_is_end(i,j):
  5. global arr
  6. for m in range(11): #竖向
  7. if arr[m][j]==1 and arr[m+1][j]==1 and arr[m+2][j]==1 and \
  8. arr[m+3][j]==1 and arr[m+4][j]==1:
  9. print("游戏结束,黑子胜利!")
  10. onscreenclick(fun_null)
  11. for m in range(11): #横向
  12. if arr[i][m]==1 and arr[i][m+1]==1 and arr[i][m+2]==1 and \
  13. arr[i][m+3]==1 and arr[i][m+4]==1:
  14. print("游戏结束,黑子胜利!")
  15. onscreenclick(fun_null)
  16. if i<=j: #\向
  17. m=j-i
  18. for k in range(m,11):
  19. if arr[k-m][k]==1 and arr[k-m+1][k+1]==1 and arr[k-m+2][k+2]==1 and \
  20. arr[k-m+3][k+3]==1 and arr[k-m+4][k+4]==1:
  21. print("游戏结束,黑子胜利!")
  22. onscreenclick(fun_null)
  23. if i>j: #\向
  24. m=i-j
  25. for k in range(m,11):
  26. if arr[k][k-m]==1 and arr[k+1][k-m+1]==1 and arr[k+2][k-m+2]==1 and \
  27. arr[k+3][k-m+3]==1 and arr[k+4][k-m+4]==1:
  28. print("游戏结束,黑子胜利!")
  29. onscreenclick(fun_null)
  30. n=i+j #/向
  31. if n<=14:
  32. for k in range(0,n-4):
  33. if arr[k][n-k]==1 and arr[k+1][n-k-1]==1 and arr[k+2][n-k-2]==1 and \
  34. arr[k+3][n-k-3]==1 and arr[k+4][n-k-4]==1:
  35. print("游戏结束,黑子胜利!")
  36. onscreenclick(fun_null)
  37. if n>14:
  38. for v in range(n-14,11):
  39. if arr[v][n-v]==1 and arr[v+1][n-v-1]==1 and arr[v+2][n-v-2]==1 and \
  40. arr[v+3][n-v-3]==1 and arr[v+4][n-v-4]==1:
  41. print("游戏结束,黑子胜利!")
  42. onscreenclick(fun_null)

源代码 :

  1. # 1、画棋盘,初始化棋盘
  2. from turtle import *
  3. screensize()
  4. tracer(0)
  5. for i in range(15):#画横向
  6. penup()
  7. goto(-280,-280+i*40)
  8. pendown()
  9. fd(560)
  10. left(90)
  11. for i in range(15):#画竖向
  12. penup()
  13. goto(-280+i*40,-280)
  14. pendown()
  15. fd(560)
  16. penup() #画标点
  17. goto(0,0)
  18. dot()
  19. goto(160,160)
  20. dot()
  21. goto(-160,160)
  22. dot()
  23. goto(160,-160)
  24. dot()
  25. goto(-160,-160)
  26. dot()
  27. #如果要使用列表创建一个二维数组,可以使用生成器来辅助实现。
  28. #棋盘上每一个点初始值为0
  29. arr=[[0 for i in range(15)] for j in range(15)]
  30. # 3、判断4个方向是否连成五个子
  31. def fun_null(x,y):
  32. return ;
  33. def black_is_end(i,j):
  34. global arr
  35. for m in range(11): #竖向
  36. if arr[m][j]==1 and arr[m+1][j]==1 and arr[m+2][j]==1 and \
  37. arr[m+3][j]==1 and arr[m+4][j]==1:
  38. print("游戏结束,黑子胜利!")
  39. onscreenclick(fun_null)
  40. for m in range(11): #横向
  41. if arr[i][m]==1 and arr[i][m+1]==1 and arr[i][m+2]==1 and \
  42. arr[i][m+3]==1 and arr[i][m+4]==1:
  43. print("游戏结束,黑子胜利!")
  44. onscreenclick(fun_null)
  45. if i<=j: #\向
  46. m=j-i
  47. for k in range(m,11):
  48. if arr[k-m][k]==1 and arr[k-m+1][k+1]==1 and arr[k-m+2][k+2]==1 and \
  49. arr[k-m+3][k+3]==1 and arr[k-m+4][k+4]==1:
  50. print("游戏结束,黑子胜利!")
  51. onscreenclick(fun_null)
  52. if i>j: #\向
  53. m=i-j
  54. for k in range(m,11):
  55. if arr[k][k-m]==1 and arr[k+1][k-m+1]==1 and arr[k+2][k-m+2]==1 and \
  56. arr[k+3][k-m+3]==1 and arr[k+4][k-m+4]==1:
  57. print("游戏结束,黑子胜利!")
  58. onscreenclick(fun_null)
  59. n=i+j #/向
  60. if n<=14:
  61. for k in range(0,n-4):
  62. if arr[k][n-k]==1 and arr[k+1][n-k-1]==1 and arr[k+2][n-k-2]==1 and \
  63. arr[k+3][n-k-3]==1 and arr[k+4][n-k-4]==1:
  64. print("游戏结束,黑子胜利!")
  65. onscreenclick(fun_null)
  66. if n>14:
  67. for v in range(n-14,11):
  68. if arr[v][n-v]==1 and arr[v+1][n-v-1]==1 and arr[v+2][n-v-2]==1 and \
  69. arr[v+3][n-v-3]==1 and arr[v+4][n-v-4]==1:
  70. print("游戏结束,黑子胜利!")
  71. onscreenclick(fun_null)
  72. def white_is_end(i,j):
  73. global arr
  74. for m in range(11): #竖向
  75. if arr[m][j]==-1 and arr[m+1][j]==-1 and arr[m+2][j]==-1 and \
  76. arr[m+3][j]==-1 and arr[m+4][j]==-1:
  77. print("游戏结束,白子胜利!")
  78. onscreenclick(fun_null)
  79. for m in range(11): #横向
  80. if arr[i][m]==-1 and arr[i][m+1]==-1 and arr[i][m+2]==-1 and \
  81. arr[i][m+3]==-1 and arr[i][m+4]==-1:
  82. print("游戏结束,白子胜利!")
  83. onscreenclick(fun_null)
  84. if i<=j: #\向
  85. m=j-i
  86. for k in range(m,11):
  87. if arr[k-m][k]==-1 and arr[k-m+1][k+1]==-1 and arr[k-m+2][k+2]==-1 and \
  88. arr[k-m+3][k+3]==-1 and arr[k-m+4][k+4]==-1:
  89. print("游戏结束,白子胜利!")
  90. onscreenclick(fun_null)
  91. if i>j: #\向
  92. m=i-j
  93. for k in range(m,11):
  94. if arr[k][k-m]==-1 and arr[k+1][k-m+1]==-1 and arr[k+2][k-m+2]==-1 and \
  95. arr[k+3][k-m+3]==-1 and arr[k+4][k-m+4]==-1:
  96. print("游戏结束,白子胜利!")
  97. onscreenclick(fun_null)
  98. n=i+j #/向
  99. if n<=14:
  100. for k in range(0,n-4):
  101. if arr[k][n-k]==-1 and arr[k+1][n-k-1]==-1 and arr[k+2][n-k-2]==-1 and \
  102. arr[k+3][n-k-3]==-1 and arr[k+4][n-k-4]==-1:
  103. print("游戏结束,白子胜利!")
  104. onscreenclick(fun_null)
  105. if n>14:
  106. for v in range(n-14,11):
  107. if arr[v][n-v]==-1 and arr[v+1][n-v-1]==-1 and arr[v+2][n-v-2]==-1 and \
  108. arr[v+3][n-v-3]==-1 and arr[v+4][n-v-4]==-1:
  109. print("游戏结束,白子胜利!")
  110. onscreenclick(fun_null)
  111. # 2、鼠标事件,点击落子
  112. turn=0 #记录该哪方落子
  113. def funclick(x,y):
  114. global turn
  115. global arr
  116. if turn==0: #黑子先下1
  117. for i in range(15):
  118. Y=280-i*40
  119. for j in range(15):
  120. X=-280+j*40 #棋盘上的整点
  121. if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
  122. arr[i][j]=1
  123. goto(X,Y)
  124. dot(20)
  125. turn=1 #交替下子
  126. black_is_end(i,j)
  127. if turn==1: #白子-1
  128. for i in range(15):
  129. Y=280-i*40
  130. for j in range(15):
  131. X=-280+j*40 #棋盘上的整点
  132. if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
  133. arr[i][j]=-1
  134. goto(X+10,Y)
  135. pendown()
  136. circle(10)
  137. penup()
  138. turn=0 #交替下子
  139. white_is_end(i,j)
  140. onscreenclick(funclick)