今天突然心血来潮,想全程自己写一个小游戏(毕竟对于一个才接触python不到一个月的小白来说,还是比较为难,虽然不算是完全成功,因为棋盘大小和布局还是借鉴了其它博主的,但这都是小问题,重要是其它的都是自己写的嘛!!!(咦,这小编真能扯,还不上代码)) 。相信各位既然来到了这里,那一定对这规则了如指掌了的。那我就不多赘述了。
先上图(有图有真相)
下面就由我来盖释盖释(解释解释)这破代码
这个参数是为了记录当前的轮次(该谁来)
class Stats:
def __init__(self):
"""管理游戏过程中的可变参数"""
self.turn = 2 #当前轮次,1表示白棋,2表示黑棋
游戏中的固定参数
class Setting:
def __init__(self):
self.screen_size = (670, 670)
self.screen_color = (238, 154, 73)
self.line_color = (0, 0, 0)
self.chess = [(), (255, 255, 255), (0, 0, 0)] #1表示白色,2表示黑色
使用sys中的exit()来结束游戏
使用pygame中的画图工具来绘制
1.pygame.draw.line(surface对象,颜色,起点坐标,终点坐标,线条大小) #坐标采用[x,y]表示。
2.pygame.draw.cirle(surface对象,颜色,圆点坐标,半径大小,外边框大小=0) #外边框大小缺省默认为0,表示绘制实心圆;大于0表示绘制空心圆,数值大小表示边框线条粗细;小于0则什么都不会绘制。文章来源:https://www.toymoban.com/news/detail-519318.html
import sys
import pygame
from game_over import isover
from game_stats import Stats
from setting import Setting
class my_chess:
"""管理五子棋的类"""
def __init__(self):
pygame.init() # 获取对显示系统的访问
# 记录棋子位置的数组,用于判断当前文字是否可下和判断五子连心
self.chess_color = []
self.chess = []
self.chess_position = [[0 for _ in range(15)] for _ in range(15)]
self.setting = Setting() # 游戏参数设置
self.stats = Stats()
self.screen = pygame.display.set_mode(self.setting.screen_size)
pygame.display.set_caption("我的五子棋")
def run_game(self):
while True:
self.update_screen()
# 将之前的棋子绘制出来
for i in range(len(self.chess_color)):
pygame.draw.circle(self.screen, self.chess_color[i], self.chess[i], 22)
self.event_check()
# pygame.display.flip() # 让最近绘制的屏幕可见
pygame.display.update()
def update_screen(self):
"""刷新屏幕显示"""
self.screen.fill(self.setting.screen_color) # 先填充背景色
"""绘制棋盘"""
for i in range(27, 670, 44):
if i == 27 or i == 670 - 27:
# 边界线条画大一点
# 横线
pygame.draw.line(self.screen, self.setting.line_color, [i, 27], [i, 670 - 27], 4)
# 竖线
pygame.draw.line(self.screen, self.setting.line_color, [27, i], [670 - 27, i], 4)
else:
pygame.draw.line(self.screen, self.setting.line_color, [i, 27], [i, 670 - 27], 2)
pygame.draw.line(self.screen, self.setting.line_color, [27, i], [670 - 27, i], 2)
# 中心小黑点绘制
pygame.draw.circle(self.screen, self.setting.line_color, [27 + 44 * 7, 27 + 44 * 7], 7)
def event_check(self):
"""对游戏发生的事件进行处理"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
a, b = pygame.mouse.get_pos()
x, y = self.get_mouse(a, b)
if x == 0 or not self.isOk([x, y]):
pass
else:
self.chess_color.append(self.setting.chess[self.stats.turn])
self.chess.append([x, y])
if isover(self.chess_position, [x // 44, y // 44]):
print('结束')
sys.exit()
self.chess_position[x // 44][y // 44] = self.stats.turn
if self.stats.turn == 1:
self.stats.turn += 1
else:
self.stats.turn -= 1
def isOk(self, nums):
"""检测当前位置是否可以下棋子"""
if nums in self.chess:
return False
return True
def get_mouse(self, a, b):
for i in range(27, 670, 44):
for j in range(27, 670, 44):
left = i - 11
right = i + 11
up = j - 11
down = j + 11
if a >= left and a <= right and b >= up and b <= down:
return i, j
return 0, 0
if __name__ == '__main__':
game = my_chess()
game.run_game()
判断这步棋子下了之后是否出现了五子相连的情况,这破代码太长了,当然也可以使用一个列表存储偏移量一个,再使用for循环内嵌一个while循环来减少代码量(我就不再淦它了)文章来源地址https://www.toymoban.com/news/detail-519318.html
from game_stats import Stats
stats = Stats()
def isover(chess_position, nums):
cur = stats.turn
left, right = 0, 0
x = nums[0]
y = nums[1]
# 检测行
for i in range(x - 1, -1, -1):
if chess_position[i][y] == cur:
left += 1
else:
break
for i in range(x + 1, 15, 1):
if chess_position[i][y] == cur:
right += 1
else:
break
if left + right >= 4:
return True
# 检测列
left, right = 0, 0
for i in range(y - 1, -1, -1):
if chess_position[x][i] == cur:
left += 1
else:
break
for i in range(y + 1, 15, 1):
if chess_position[x][i] == cur:
right += 1
else:
break
if left + right >= 4:
return True
# 检测左对角线
left, right = 0, 0
i, j = x - 1, y - 1
while i >= 0 and j >= 0:
if chess_position[i][j] == cur:
left += 1
i -= 1
j -= 1
else:
break
i, j = x + 1, y + 1
while i < 15 and j < 15:
if chess_position[i][j] == cur:
right += 1
i += 1
j += 1
else:
break
if left + right >= 4:
return True
# 检测右对角线
left, right = 0, 0
i, j = x - 1, y + 1
while i >= 0 and j < 15:
if chess_position[i][j] == cur:
left += 1
i -= 1
j += 1
else:
break
i, j = x + 1, y - 1
while i < 15 and j >= 0:
if chess_position[i][j] == cur:
right += 1
i += 1
j -= 1
else:
break
if left + right >= 4:
return True
return False
到了这里,关于python实现《五子棋》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!