python实现五子棋小游戏

时间:2022-10-10 14:44:22

本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下

暑假学了十几天python,然后用pygame模块写了一个五子棋的小游戏,代码跟有缘人分享一下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
import numpy as np
import pygame
import sys
import traceback
import copy
from pygame.locals import *
 
 
pygame.init()
pygame.mixer.init()
 
#颜色
background=(201,202,187)
checkerboard=(80,80,80)
button=(52,53,44)
 
 
 
#音乐
play_chess_sound = pygame.mixer.sound("music/play_chess.wav")
play_chess_sound.set_volume(0.2)
button_sound = pygame.mixer.sound("music/button.wav")
button_sound.set_volume(0.2)
victor_sound = pygame.mixer.sound("music/victory.wav")
victor_sound.set_volume(0.2)
 
#绘制棋盘
def draw_a_chessboard(screen):
 #填充背景色
 screen.fill(background)
 background=pygame.image.load("background.jpg").convert_alpha()
 screen.blit(background,(0,0))
 #画棋盘
 for i in range(21):
  pygame.draw.line(screen, checkerboard, (40*i+3, 3), (40*i+3, 803))
  pygame.draw.line(screen, checkerboard, (3, 40*i+3), (803, 40*i+3))
 #画边线
 pygame.draw.line(screen, checkerboard, (3, 3), (803, 3),5)
 pygame.draw.line(screen, checkerboard, (3, 3), (3, 803),5)
 pygame.draw.line(screen, checkerboard, (803, 3), (803, 803),5)
 pygame.draw.line(screen, checkerboard, (3, 803), (803, 803),5)
 
 #画定位点
 pygame.draw.circle(screen, checkerboard, (163, 163), 6)
 pygame.draw.circle(screen, checkerboard, (163, 643), 6)
 pygame.draw.circle(screen, checkerboard, (643, 163), 6)
 pygame.draw.circle(screen, checkerboard, (643, 643), 6)
 pygame.draw.circle(screen, checkerboard, (403, 403), 6)
 
 #画‘悔棋'‘重新开始'跟‘退出'按钮
 pygame.draw.rect(screen,button,[900,350,120,100],5)
 pygame.draw.rect(screen,button,[900,500,200,100],5)
 pygame.draw.rect(screen,button,[900,650,200,100],5)
 s_font=pygame.font.font('font.ttf',40)
 text1=s_font.render("悔棋",true,button)
 text2=s_font.render("重新开始",true,button)
 text3=s_font.render("退出游戏",true,button)
 screen.blit(text1,(920,370))
 screen.blit(text2,(920,520))
 screen.blit(text3,(920,670))
 
#绘制棋子(横坐标,纵坐标,屏幕,棋子颜色(1代表黑,2代表白))
def draw_a_chessman(x,y,screen,color):
 if color==1
  black_chess=pygame.image.load("black_chess.png").convert_alpha()
  screen.blit(black_chess,(40*x+3-15,40*y+3-15))
 if color==2:
  white_chess=pygame.image.load("white_chess.png").convert_alpha()
  screen.blit(white_chess,(40*x+3-15,40*y+3-15))
 
#绘制带有棋子的棋盘
def draw_a_chessboard_with_chessman(map,screen):
 screen.fill(background)
 draw_a_chessboard(screen)
 for i in range(24):
  for j in range(24):
   draw_a_chessman(i+1,j+1,screen,map[i][j])
 
 
 
#定义存储棋盘的列表,
#列表为24列24行是因为判断是否胜利函数里的索引会超出19
#列表大一点不会对游戏有什么影响
map=[]
for i in range(24):
 map.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
 
#清零map列表
def clear():
 global map
 for i in range(24):
  for j in range(24):
   map[i][j]=0
 
#判断是否胜利
def win(i, j):
 k = map[i][j]
 p=[]
 for a in range(20):
  p.append(0)
 for i3 in range(i-4,i+5):
  for j3 in range(j-4,j+5):
   if (map[i3][j3] == k and i3 - i == j3 - j and i3 <= i and j3 <= j):
    p[0]+=1
   if (map[i3][j3] == k and j3 == j and i3 <= i and j3 <= j):
    p[1]+=1
   if (map[i3][j3] == k and i3 == i and i3 <= i and j3 <= j):
    p[2]+=1
   if (map[i3][j3] == k and i3 - i == j3 - j and i3 >= i and j3 >= j):
    p[3]+=1
   if (map[i3][j3] == k and j3 == j and i3 >= i and j3 >= j):
    p[4]+=1
   if (map[i3][j3] == k and i3 == i and i3 >= i and j3 >= j):
    p[5]+=1
   if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i and j3 >= j):
    p[6]+=1
   if (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i and j3 <= j):
    p[7]+=1
   if (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
    p[8]+=1
   if (map[i3][j3] == k and j == j3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
    p[9]+=1
   if (map[i3][j3] == k and i == i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
    p[10]+=1
   if (map[i3][j3] == k and j - j3 == i - i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
    p[11]+=1
   if (map[i3][j3] == k and j == j3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
    p[12]+=1
   if (map[i3][j3] == k and i == i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
    p[13]+=1
   if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 1 and i3 >= i - 3 and j3 >= j - 1 and j3 <= j + 3):
    p[14]+=1
   if (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i - 1 and i3 <= i + 3 and j3 <= j + 1 and j3 >= j - 3):
    p[15]+=1
   if (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
    p[16]+=1
   if (map[i3][j3] == k and j == j3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
    p[17]+=1
   if (map[i3][j3] == k and i == i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
    p[18]+=1
   if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
    p[19]+=1
 for b in range(20):
  if p[b]==5:
   return true
 return false
 
#绘制提示器(类容,屏幕,字大小)
def text(s,screen,x):
 #先把上一次的类容用一个矩形覆盖
 pygame.draw.rect(screen,background,[850,100,1200,100])
 #定义字体跟大小
 s_font=pygame.font.font('font.ttf',x)
 #定义类容,是否抗锯齿,颜色
 s_text=s_font.render(s,true,button)
 #将字放在窗口指定位置
 screen.blit(s_text,(880,100))
 pygame.display.flip()
 
#用于控制顺序
t=true
 
#用于结束游戏后阻止落子
running=true
 
#主函数
def main():
 #将 t,map,running设置为可改的
 global t,map,running,maps,r,h
 #将map置零
 clear()
 #定义储存所有棋盘状态的列表(用于悔棋)
 map2=copy.deepcopy(map)
 maps=[map2]
 
 
 #定义窗口
 screen = pygame.display.set_mode([1200,806])
 
 #定义窗口名字
 pygame.display.set_caption("五子棋")
 
 #在窗口画出棋盘,提示器以及按钮
 draw_a_chessboard(screen)
 pygame.display.flip()
 clock=pygame.time.clock()
 while true:
  #只有running为真才能落子,主要用于游戏结束后防止再次落子
  if running:
   if t:
    color=1
    text('黑棋落子',screen,54)
   else:
    color=2
    text('白棋落子',screen,54)
  
  for event in pygame.event.get():
   #点击x则关闭窗口
   if event.type ==pygame.quit:
    pygame.quit()
    sys.exit()
   
   #点击窗口里面类容则完成相应指令
   elif event.type == mousebuttondown:
    if event.button == 1:
     x,y=event.pos[0],event.pos[1]
     for i in range(19):
      for j in range(19):
       #点击棋盘相应位置
       if i*40+3+20<x<i*40+3+60 and j*40+3+20<y<j*40+3+60 and not map[i][j] and running:
        #在棋盘相应位置落相应颜色棋子
        draw_a_chessman(i+1,j+1,screen,color)
        #播放音效
        play_chess_sound.play(0)
        #在map里面记录落子位置
        map[i][j]=color
 
        #将map存入maps
        map3=copy.deepcopy(map)
        maps.append(map3)
 
        #判断落子后是否有五子一线
        if win(i,j):
         if t:
          text('黑棋胜利,请重新游戏',screen,30)
         else:
          text('白棋胜利,请重新游戏',screen,30)
         #播放音效
         victor_sound.play(0)
         #阻止再往棋盘落子
         running=false
        pygame.display.flip()
        t=not t
     #如果点击‘重新开始'
     if 900<x<1100 and 500<y<600:
      #取消阻止
      running=true
      #播放音效
      button_sound.play(0)
      #重新开始
      main()
     
     #点击‘退出游戏',退出游戏
     elif 900<x<1100 and 650<y<750:
      #播放音效
      button_sound.play(0)
      pygame.quit()
      sys.exit()
 
     #点击‘悔棋'
     elif 900<x<1020 and 350<y<450 and len(maps)!=1:
      #播放音效
      button_sound.play(0)
      #删除maps里最后一个元素
      del maps[len(maps)-1]
      #再将最后一个元素copy给map
      map=copy.deepcopy(maps[len(maps)-1])
      #切换顺序
      t=not t
      #将map显示出来
      draw_a_chessboard_with_chessman(map,screen)
      #悔棋完成,阻止再次悔棋
      x,y=0,0
  clock.tick(60)
if __name__ == "__main__":
 try:
  main()
 except systemexit:
  pass
 except:
  traceback.print_exc()
  pygame.quit()
  input()

实现效果图如下:

python实现五子棋小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_42847252/article/details/81875119