row=round((y-self.__margin)/self.__cell_width) col=round((x-self.__margin)/self.__cell_width)
时间: 2024-04-10 13:29:29 浏览: 56
这段代码看起来是用于计算给定坐标点(x, y)所在的行和列。根据代码中的计算方式,行数(row)是通过将y值减去边距(self.__margin),然后除以单元格宽度(self.__cell_width)得到的结果取整。列数(col)的计算方式类似,将x值减去边距(self.__margin),然后除以单元格宽度(self.__cell_width)得到的结果取整。这样就可以得到给定坐标点所在的行和列数。
相关问题
def __next_step(self, x, y): if not self.judge_colory: self.__history += 0 else: self.__history += 1 self.color = 1 if self.__history % 2 == 0 else 2 if self.start_ai_game: if self.ai_color == self.color: row,col = self.ai_stage(self.ai_game()[0],self.ai_game()[1]) else: col = round((x-self.__margin*2)/self.__cell_width) row = round((y-self.__margin*2)/self.__cell_width) stage_row = (y-self.__margin)-(self.__cell_width*row+self.__margin) stage_col = (x-self.__margin)-(self.__cell_width*col+self.__margin) if stage_col < stage_row: self.direct= 1 else: self.direct= 0 else: col = round((x - self.__margin * 2) / self.__cell_width) row = round((y - self.__margin * 2) / self.__cell_width) stage_row = (y - self.__margin) - (self.__cell_width * row + self.__margin) stage_col = (x - self.__margin) - (self.__cell_width * col + self.__margin) if stage_col < stage_row: self.direct = 1 else: self.direct= 0 if self.valide(row, col, self.direct): if self.__history % 4 == 0 or (self.__history + 2) % 4 == 0: self.__game_board.drew_turn(2) else: self.__game_board.drew_turn(1) self.add_logic(row, col, self.color) self.__game_board.draw_chess(row, col, self.color, self.direct) if self.judge_owner(row, col, self.color, self.direct): self.__game_board.drew_turn(self.judge_next(self.color)) for i in self.judge_owner(row, col, self.color, self.direct): x,y=self.draw_owner(i) self.__game_board.drew_owner(self.color, y, x) else: self.__game_board.drew_turn(self.color) self.judge_color(row, col, self.color, self.direct) print(self.logic_board_state) if 0 not in self.logic_board_owner: self.__game_board.pop_win(self.judge_winner())
这段代码是一个名为 `__next_step` 的方法。它接收两个参数 `x` 和 `y`,代表鼠标点击的坐标位置。
首先,根据 `self.judge_colory` 的值来判断是否需要更新 `self.__history`。如果 `self.judge_colory` 为假,则 `self.__history` 不变,否则将 `self.__history` 加 1。
接下来,根据 `self.__history` 的奇偶性来确定当前的颜色。如果 `self.__history` 是偶数,则 `self.color` 设置为 1,否则设置为 2。
如果 `self.start_ai_game` 为真,则进入 AI 对战模式。根据当前的颜色和 AI 的颜色判断是否轮到 AI 下棋。如果是,则调用 `self.ai_stage` 方法,传入当前棋盘状态和当前颜色,获取 AI 下棋的结果,并将结果赋值给 `row` 和 `col`。
如果不是 AI 下棋,即玩家下棋,则将鼠标点击位置转换为行和列的索引,并计算出相对于棋盘格子的位置。根据相对位置的大小,确定下棋方向,并将结果赋值给 `self.direct`。
接下来,通过调用 `self.valide` 方法判断当前位置是否可下棋。如果可下棋,则根据当前回合数判断应该绘制哪种颜色的标记,并调用相应的方法在游戏界面上绘制标记和棋子。
然后,通过调用 `self.judge_owner` 方法判断是否有棋子归属变更,并返回变更的位置。如果有变更,根据变更的位置绘制相应颜色的棋子。
接下来,通过调用 `self.judge_color` 方法更新逻辑棋盘的状态。
然后,打印出当前逻辑棋盘的状态。
最后,判断逻辑棋盘是否已满。如果已满,则调用 `self.judge_winner` 方法判断胜利方,并在游戏界面上弹出胜利提示。
def __choose_button(self,x,y): ''' 根据用户控制执行游戏逻辑,重新开始游戏、退出游戏,或者在棋盘内落子 :param x:横坐标 :param y:纵坐标 :return: ''' left = self.__cell_width *self.__n+40 right = left+150 if left<x<right: if 420 < y < 470: # print('choose button\n') self.start() elif 500 < y < 550: pygame.quit() sys.exit() elif 0<x<self.__cell_width * (self.__n-1)+self.__margin*2: self.__next_step(x,y) pass def __next_step(self,x,y): ''' :param x:横坐标 :param y:纵坐标 :return: ''' color=0 if len(self.__history) % 4==0 or (len(self.__history)+1)%4==0 else 1 row=round((y-self.__margin)/self.__cell_width) col=round((x-self.__margin)/self.__cell_width) # print(f'row col:{row},{col}') if self.__pos_valid(row,col): self.__history.append((row, col)) self.__logic_board[row][col] = color + 1 self.__game_board.draw_chess(row, col,self.__logic_board[row][col]) result=self.__judge(row,col) if result in (1,2,-1): self.__game_board.pop_winner(result) self.__save(result) # self.__game_state=SixInRowGame.Stop pass def __pos_valid(self,row,col): return 0<=row<self.__n and 0<=col<self.__n and not self.__logic_board[row][col]
这段代码是一个私有方法`__choose_button(self, x, y)`,用于根据用户的操作执行游戏的逻辑。根据方法的注释,该方法可能会重新开始游戏、退出游戏,或者在棋盘内落子。
首先,方法中定义了两个变量`left`和`right`,用于确定重新开始游戏和退出游戏按钮的点击范围。
接下来,通过对给定的x和y坐标进行判断,确定用户是点击了哪个按钮或者在棋盘内进行了落子操作。
- 如果x在`left`和`right`之间,并且y在420到470之间,表示用户点击了重新开始游戏按钮,此时调用`self.start()`方法重新开始游戏。
- 如果x在`left`和`right`之间,并且y在500到550之间,表示用户点击了退出游戏按钮,此时调用`pygame.quit()`和`sys.exit()`方法退出游戏。
- 如果x在棋盘范围内,即0到(self.__cell_width * (self.__n-1) + self.__margin * 2)之间,调用`self.__next_step(x, y)`方法进行落子操作。
在`__next_step(self, x, y)`方法中,根据当前落子的顺序确定玩家的颜色。然后根据给定的x和y坐标计算出所在的行和列。如果位置合法(即在棋盘范围内且未被占据),则将该位置添加到历史记录中,并在逻辑棋盘和游戏界面上绘制相应的棋子。最后,调用`self.__judge(row, col)`方法判断游戏结果,并根据结果进行相应的操作。
`__pos_valid(self, row, col)`方法是一个辅助方法,用于判断给定的行和列是否合法,即在棋盘范围内且未被占据。如果合法,则返回True,否则返回False。
这段代码实现了用户操作的响应逻辑,根据用户的点击位置进行相应的处理,包括重新开始游戏、退出游戏和落子操作。
阅读全文