游戏扫雷编程之细节

    最近学了一点gtk,在学校学了一些C语言,想用所学的东西写一点东西,网上搜了好些,就先从扫雷入手。

    参考了很多资料:最后决定参考http://www.gymsaga.com/project/761.html这个仁兄的程序。

    本人新手,再编程中会有很多问题,但是编程的乐趣就在于发现问题,解决问题。所以一步一步的向前走吧。

    在编程过程中遇到很多细节的问题,现在想写下来:

1:双击已经点开的格子时,如果此格子周围的8个格子里 有一个或者多个格子是空的,那么需要自动的将空格子周围的8个格子继续显示,如果仍然后空格子,那么如此递归下去,注意如果标记了旗子那么不需要显示。(我在编程的时候只是单纯的双击后将8个格子显示出来,没有考虑到空格子的情况)

2:按钮点击后 只有在释放的时候才会处理,按下不做处理,如果是在第一个按钮按下,在第二个按钮释放,那么最后是相当于点击了第二个按钮。

3:左键点击小红旗不处理。

4:判断是否成功的条件:不是雷的所有格子都被点开了,与标记雷的个数无关,同时要注意不管是单击击还是双击操作格子都要在最后加上判断是否成功的函数来进行判断。

5:最大的数字只可能是8。

关于扫雷还有一个问题:

1:第一次一定会点到雷么?

答:网上搜了一下 有人回答说:微软的扫雷肯定是不行的. 如果你第一次点击在雷上, 这个雷会被移到左上角. 如果左上角已经有雷, 程序会从左到右从上到下找下一个空出来的位置。这个可以在自己的游戏里后期扩展一下。现在鼠标点击后才生成雷的分布.做到了鼠标点击的格及其周围的8个格不可能是雷.也就是现在的一来就能开一片。

2:有没有可能第一步就赢了?

答:有可能的。

3:有没有可能是剩下最后两个只能靠运气。

答:有可能的。

关于程序上的一些问题:

1:gtk+如何相应单双机以及右击。答:可以使用gtkEventButton。

2:gtk+如何实现鼠标在按钮上按下,鼠标移到其它位置上松开,不作任何处理。答:我想到是利用按钮的leave和enter信号设一个flag,在enter处理函数中flag置为true,leave里置为false,然后利用flag来进行是否处理其他事情。不知道这个方法对不对。目前是可以用的,以后慢慢在改善。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的使用面向对象思想实现的扫雷游戏的代码示例: ```python import random class Square: def __init__(self, x, y): self.x = x self.y = y self.is_clicked = False self.has_mine = False self.adj_mine_count = 0 def set_mine(self): self.has_mine = True def set_adj_mine_count(self, count): self.adj_mine_count = count def click(self): self.is_clicked = True def __str__(self): if self.is_clicked: if self.has_mine: return '*' else: return str(self.adj_mine_count) else: return '.' class Board: def __init__(self, width, height, num_mines): self.width = width self.height = height self.num_mines = num_mines self.grid = [[Square(x, y) for y in range(height)] for x in range(width)] self.generate_mines() def generate_mines(self): for i in range(self.num_mines): x = random.randint(0, self.width - 1) y = random.randint(0, self.height - 1) square = self.grid[x][y] while square.has_mine: x = random.randint(0, self.width - 1) y = random.randint(0, self.height - 1) square = self.grid[x][y] square.set_mine() for adj_square in self.get_adj_squares(square): adj_square.set_adj_mine_count(adj_square.adj_mine_count + 1) def get_adj_squares(self, square): adj_squares = [] for x in range(square.x - 1, square.x + 2): for y in range(square.y - 1, square.y + 2): if x >= 0 and x < self.width and y >= 0 and y < self.height and not (x == square.x and y == square.y): adj_squares.append(self.grid[x][y]) return adj_squares def click_square(self, x, y): square = self.grid[x][y] square.click() if square.has_mine: return False if square.adj_mine_count == 0: for adj_square in self.get_adj_squares(square): if not adj_square.is_clicked: self.click_square(adj_square.x, adj_square.y) return True def is_game_over(self): for x in range(self.width): for y in range(self.height): square = self.grid[x][y] if not square.is_clicked and not square.has_mine: return False return True def __str__(self): return '\n'.join([''.join([str(self.grid[x][y]) for y in range(self.height)]) for x in range(self.width)]) class Game: def __init__(self, width, height, num_mines): self.board = Board(width, height, num_mines) self.game_over = False self.num_mines = num_mines def play(self): while not self.game_over: print(self.board) x = int(input("Enter x coordinate: ")) y = int(input("Enter y coordinate: ")) if not self.board.click_square(x, y): self.game_over = True print("Game over! You clicked on a mine.") elif self.board.is_game_over(): self.game_over = True print("Congratulations! You have cleared all the squares without clicking on a mine.") else: print("Remaining mines: ", self.num_mines - self.count_mines_clicked()) def count_mines_clicked(self): count = 0 for x in range(self.board.width): for y in range(self.board.height): square = self.board.grid[x][y] if square.has_mine and square.is_clicked: count += 1 return count if __name__ == '__main__': game = Game(8, 8, 10) game.play() ``` 这个代码实现了一个简单的扫雷游戏,使用了面向对象的思想,将方块和游戏板都抽象成了对象,方便维护和拓展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值