简介:
围棋,源自中国,是一种两人对弈的策略棋类游戏。它被认为是世界上最复杂的棋类游戏之一,因为它的规则简单,但变化复杂多样。围棋的游戏目标是在棋盘上占领更多的地盘,并用自己的棋子围住对手的棋子,最终以得分确定胜负。
围棋通常在一个19x19的方格棋盘上进行,但也可以在9x9或13x13的较小棋盘上玩。每个玩家控制一种颜色的棋子,通常是黑色和白色。玩家轮流在交叉点上放置自己的棋子,棋子一旦放置,便不可移动。
设计思路:
-
初始化: 在
__init__
方法中初始化应用程序的各种参数和属性,包括棋盘大小、棋子图片、按钮等。这些参数决定了游戏界面的外观和功能。 -
开始游戏:
start
方法负责开始游戏,即点击“开始游戏”按钮后触发。它会初始化游戏状态,包括显示哪一方先行。 -
落子:
getDown
方法处理玩家落子的操作。当玩家点击棋盘时,会根据鼠标位置确定落子位置,并进行相应的判断,包括位置是否为空、是否越界等。如果落子有效,则更新棋盘状态,并检查是否有棋子被吃掉。 -
悔棋:
regret
方法允许玩家悔棋,即撤销上一步操作。点击“悔棋”按钮后触发,会将棋盘状态恢复到上一步的状态。 -
跳过一手:
passme
方法允许玩家跳过一手,即放弃自己的回合。点击“弃一手”按钮后触发,将会切换到对方玩家的回合。 -
判断棋局是否结束:
if_dead
方法用于判断棋局是否结束。它会检查每个棋子周围是否有气,如果某个玩家的所有棋子都没有气,那么对方获胜。 -
重新开始游戏:
reload
方法用于重新开始游戏。点击“重新开始”按钮后触发,会清空棋盘并重新初始化游戏状态。 -
显示鼠标下棋子的阴影:
shadow
方法负责显示鼠标下棋子的阴影,以帮助玩家确定落子位置。 -
其他辅助功能: 包括处理棋子的死亡、玩家切换、警告消息框等功能,这些功能在游戏过程中起到辅助作用。
界面图
9*9路棋
13*13路棋
19*19路棋
部分代码:
# 落子,并驱动玩家的轮流下棋行为def getDown(self,event):if not self.stop:# 先找到最近格点if (20*self.size-self.dd*0.4<event.x<self.dd*0.4+380*self.size) and (20*self.size-self.dd*0.4<event.y<self.dd*0.4+380*self.size):dx=(event.x-20*self.size)%self.dddy=(event.y-20*self.size)%self.ddx=int((event.x-20*self.size-dx)/self.dd+round(dx/self.dd)+1)y=int((event.y-20*self.size-dy)/self.dd+round(dy/self.dd)+1)# 判断位置是否已经被占据if self.positions[y][x]==0:# 未被占据,则尝试占据,获得占据后能杀死的棋子列表self.positions[y][x]=self.present+1self.image_added=self.canvas_bottom.create_image(event.x-dx+round(dx/self.dd)*self.dd+4*self.p, event.y-dy+round(dy/self.dd)*self.dd-5*self.p,image=self.photoWBD_list[self.present])self.canvas_bottom.addtag_withtag('image',self.image_added)# 棋子与位置标签绑定,方便“杀死”self.canvas_bottom.addtag_withtag('position'+str(x)+str(y),self.image_added)deadlist=self.get_deadlist(x,y)self.kill(deadlist)# 判断是否重复棋局if not self.last_2_positions==self.positions:# 判断是否属于有气和杀死对方其中之一if len(deadlist)>0 or self.if_dead([[x,y]],self.present+1,[x,y])==False:# 当不重复棋局,且属于有气和杀死对方其中之一时,落下棋子有效if not self.regretchance==1:self.regretchance+=1else:self.regretButton['state']=NORMALself.last_3_positions=copy.deepcopy(self.last_2_positions)self.last_2_positions=copy.deepcopy(self.last_1_positions)self.last_1_positions=copy.deepcopy(self.positions)# 删除上次的标记,重新创建标记self.canvas_bottom.delete('image_added_sign')self.image_added_sign=self.canvas_bottom.create_oval(event.x-dx+round(dx/self.dd)*self.dd+0.5*self.dd, event.y-dy+round(dy/self.dd)*self.dd+0.5*self.dd,event.x-dx+round(dx/self.dd)*self.dd-0.5*self.dd, event.y-dy+round(dy/self.dd)*self.dd-0.5*self.dd,width=3,outline='#3ae')