游戏大致介绍:两个玩家通过依次操作鼠标进行落子,其中谁先达成五子连线谁就获得最终胜利
import pygame,sys
老规矩先导入要用到的两个包,没有下载和导入pygame的包请参考链接:
安装Pygame包
first_colour=(0,0,0)#黑色
second_colour=(0,0,255)#蓝色
定义两种颜色,分别代表两位玩家
chessboard=[[0for i in range(16)]for i in range(16)]
创建chessboard[16][16]数组,保存每个棋子的坐标,方便判断输赢
is_win(x,y,logo)的作用是根据当前落子的坐标(x,y)和落子的玩家(logo1代表第一位玩家,logo2代表第二位玩家)来判断当前落子的玩家是否获得胜利
def is_win(x,y,logo):
left=right=1 #用于计数当前落子位置的左(left),右(right)两边的本方棋子个数
left_right=1#用于计数当前落子位置横向本方棋子数量
up=down=1#用于计数当前落子位置的上(up),下(down)两边的本方棋子个数
up_down=1#用于计数当前落子位置纵向本方棋子数量
####同理:
##下面是对于两个斜向的棋子数量的统计计数的定义
left_up=right_down=1
left_down=right_up=1
left_down_right_up=1
left_up_right_down=1
while y-left>=0:
if chessboard[x][y-left]==logo:
left_right+=1
left+=1
else:
break
while right+y
分别以当前位置坐标搜索左右两个方向的本方棋子数
while x-up>=0:
if chessboard[x-up][y]==logo:
up_down+=1
up+=1
else:
break
while down+x
分别以当前位置坐标搜索上下两个方向的本方棋子数
while x-left_up>=0 and y-left_up>=0:
if chessboard[x-left_up][y-left_up]==logo:
left_up_right_down+=1
left_up+=1
else:
break
while right_down+x
while x+left_down=0:
if chessboard[x+left_down][y-left_down]==logo:
left_down_right_up+=1
left_down+=1
else:
break
while x-right_up>=0 and y+right_up
分别以当前位置坐标搜索左个左下和方右上两个方向的本方棋子数
if left_right>=5 or up_down>=5 or left_down_right_up>=5 or left_up_right_down>=5:
return 1
else:
return 0
判断,如果有某一条直线上的棋子数量大于等于5,就返回1(胜利),反之,返回0(失败)
def main():
now_colour=first_colour#记录当前落子的棋子颜色
pygame.init();
screen=pygame.display.set_mode((450,450))#设置游戏窗口大小为400*400
screen.fill((255,255,255))#设置棋盘背景为白色
while True:
for i in range(0,450,30):
pygame.draw.line(screen, pygame.Color(255, 0, 0), (0,i),(450,i),1)
pygame.draw.line(screen, pygame.Color(255, 0, 0), (i,0),(i,450),1)
#画棋盘,16*16,(255,0,0)红色的线
for event in pygame.event.get():
if event.type==pygame.MOUSEBUTTONDOWN:
##当获取到鼠标点击事件后,pos记录点击的坐标
pos=[event.pos[0],event.pos[1]]
##将pos的坐标标准化为chessboard数组的坐标(除以30)
pos[0]=int(pos[0]/15)
if pos[0]%2!=0:
pos[0]=(pos[0]+1)*15
else:
pos[0]=pos[0]*15
pos[1]=int(pos[1]/15)
if pos[1]%2!=0:
pos[1]=int(pos[1]+1)*15
else:
pos[1]=int(pos[1]*15)
`
注意这里的:
pos[0]=int(pos[0]/15)
if pos[0]%2!=0:
pos[0]=(pos[0]+1)15
else:
pos[0]=pos[0]15
实际上是对于鼠标点击区域的一个最接近判断,将鼠标坐标定位到最接近的棋盘坐标(因为棋盘坐标只有30的倍数)
pygame.draw.circle(screen,now_colour , (pos[0],pos[1]), 10,10)##画出当前棋子
if now_colour==first_colour:
chessboard[int(pos[1]/30)][int(pos[0]/30)]=1
if is_win(int(pos[1]/30),int(pos[0]/30),1)==1:
print("The First Scored!")
break;
now_colour=second_colour##转换棋子颜色(轮到另一个玩家落子)
elif now_colour==second_colour:
chessboard[int(pos[1]/30)][int(pos[0]/30)]=2
if is_win(int(pos[1]/30),int(pos[0]/30),2)==1:
print("The Second Scored!")
break;
now_colour=first_colour##转换棋子颜色(轮到另一个玩家落子)
elif event.type==pygame.QUIT:
sys.exit()
pygame.display.update()
main()
小游戏还有需要完善的地方,比如:做一个计分面板,每次五子相连记分;添加落子音效,游戏背景音乐什么的
总之游戏大致框架就是这样
Original: https://blog.csdn.net/m0_56060629/article/details/115841730
Author: searching learner
Title: 用Python做五子棋小游戏,Pygame库
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/782347/
转载文章受原作者版权保护。转载请注明原作者出处!