最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)掃雷游戲的示例

 更新時間:2020年10月20日 08:36:56   作者:Python技術  
這篇文章主要介紹了python實現(xiàn)掃雷游戲的示例,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

掃雷是一款益智類小游戲,最早于 1992 年由微軟在 Windows 上發(fā)行,游戲適合于全年齡段,規(guī)則簡單,即在最短的時間內(nèi)找出所有非雷格子且在中間過程中不能踩到雷, 踩到雷則失敗,需重新開始。

本文我們使用 Python 來實現(xiàn)掃雷游戲,主要用的 Python 庫是 pygame。

實現(xiàn)

游戲組成比較簡單,主要包括:小方格、計時器、地雷等。

首先,我們初始化一些常量,比如:橫豎方塊數(shù)、地雷數(shù)、鼠標點擊情況等,如下所示:

BLOCK_WIDTH = 30
BLOCK_HEIGHT = 16
# 塊大小
SIZE = 20
# 地雷數(shù)
MINE_COUNT = 66
# 未點擊
normal = 1
# 已點擊
opened = 2
# 地雷
mine = 3
# 標記為地雷
flag = 4
# 標記為問號
ask = 5
# 踩中地雷
bomb = 6
# 被雙擊的周圍
hint = 7
# 正被鼠標左右鍵雙擊
double = 8
readied = 1,
started = 2,
over = 3,
win = 4

接著定義一個地雷類,類中定義一些基本屬性(如:坐標、狀態(tài)等)及 get、set 方法,代碼實現(xiàn)如下:

class Mine:
 def __init__(self, x, y, value=0):
  self._x = x
  self._y = y
  self._value = 0
  self._around_mine_count = -1
  self._status = normal
  self.set_value(value)
 def __repr__(self):
  return str(self._value)
 def get_x(self):
  return self._x
 def set_x(self, x):
  self._x = x
 x = property(fget=get_x, fset=set_x)
 def get_y(self):
  return self._y
 def set_y(self, y):
  self._y = y
 y = property(fget=get_y, fset=set_y)
 def get_value(self):
  return self._value
 def set_value(self, value):
  if value:
   self._value = 1
  else:
   self._value = 0
 value = property(fget=get_value, fset=set_value, doc='0:非地雷 1:雷')
 def get_around_mine_count(self):
  return self._around_mine_count
 def set_around_mine_count(self, around_mine_count):
  self._around_mine_count = around_mine_count
 around_mine_count = property(fget=get_around_mine_count, fset=set_around_mine_count, doc='四周地雷數(shù)量')
 def get_status(self):
  return self._status
 def set_status(self, value):
  self._status = value
 status = property(fget=get_status, fset=set_status, doc='BlockStatus')

再接著定義一個 MineBlock 類,用來處理掃雷的基本邏輯,代碼實現(xiàn)如下:

class MineBlock:
 def __init__(self):
  self._block = [[Mine(i, j) for i in range(BLOCK_WIDTH)] for j in range(BLOCK_HEIGHT)]
  # 埋雷
  for i in random.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT):
   self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1
 def get_block(self):
  return self._block
 block = property(fget=get_block)
 def getmine(self, x, y):
  return self._block[y][x]
 def open_mine(self, x, y):
  # 踩到雷了
  if self._block[y][x].value:
   self._block[y][x].status = bomb
   return False
  # 先把狀態(tài)改為 opened
  self._block[y][x].status = opened
  around = _get_around(x, y)
  _sum = 0
  for i, j in around:
   if self._block[j][i].value:
    _sum += 1
  self._block[y][x].around_mine_count = _sum
  # 如果周圍沒有雷,那么將周圍 8 個未中未點開的遞歸算一遍
  if _sum == 0:
   for i, j in around:
    if self._block[j][i].around_mine_count == -1:
     self.open_mine(i, j)
  return True
 def double_mouse_button_down(self, x, y):
  if self._block[y][x].around_mine_count == 0:
   return True
  self._block[y][x].status = double
  around = _get_around(x, y)
  # 周圍被標記的雷數(shù)量
  sumflag = 0
  for i, j in _get_around(x, y):
   if self._block[j][i].status == flag:
    sumflag += 1
  # 周邊的雷已經(jīng)全部被標記
  result = True
  if sumflag == self._block[y][x].around_mine_count:
   for i, j in around:
    if self._block[j][i].status == normal:
     if not self.open_mine(i, j):
      result = False
  else:
   for i, j in around:
    if self._block[j][i].status == normal:
     self._block[j][i].status = hint
  return result
 def double_mouse_button_up(self, x, y):
  self._block[y][x].status = opened
  for i, j in _get_around(x, y):
   if self._block[j][i].status == hint:
    self._block[j][i].status = normal

我們接下來初始化界面,首先生成由小方格組成的面板,主要代碼實現(xiàn)如下

for row in block.block:
	for mine in row:
		pos = (mine.x * SIZE, (mine.y + 2) * SIZE)
		if mine.status == opened:
			screen.blit(img_dict[mine.around_mine_count], pos)
			opened_count += 1
		elif mine.status == double:
			screen.blit(img_dict[mine.around_mine_count], pos)
		elif mine.status == bomb:
			screen.blit(img_blood, pos)
		elif mine.status == flag:
			screen.blit(img_flag, pos)
			flag_count += 1
		elif mine.status == ask:
			screen.blit(img_ask, pos)
		elif mine.status == hint:
			screen.blit(img0, pos)
		elif game_status == over and mine.value:
			screen.blit(img_mine, pos)
		elif mine.value == 0 and mine.status == flag:
			screen.blit(img_error, pos)
		elif mine.status == normal:
			screen.blit(img_blank, pos)

看一下效果:

再接著添加面板的 head 部分,包括:顯示雷數(shù)、重新開始按鈕(笑臉)、顯示耗時,主要代碼實現(xiàn)如下:

print_text(screen, font1, 30, (SIZE * 2 - fheight) // 2 - 2, '%02d' % (MINE_COUNT - flag_count), red)
if game_status == started:
	elapsed_time = int(time.time() - start_time)
print_text(screen, font1, SCREEN_WIDTH - fwidth - 30, (SIZE * 2 - fheight) // 2 - 2, '%03d' % elapsed_time, red)
if flag_count + opened_count == BLOCK_WIDTH * BLOCK_HEIGHT:
	game_status = win
if game_status == over:
	screen.blit(img_face_fail, (face_pos_x, face_pos_y))
elif game_status == win:
	screen.blit(img_face_success, (face_pos_x, face_pos_y))
else:
	screen.blit(img_face_normal, (face_pos_x, face_pos_y))

看一下效果:

再接著添加各種點擊事件,代碼實現(xiàn)如下:

for event in pygame.event.get():
	if event.type == QUIT:
		sys.exit()
	elif event.type == MOUSEBUTTONDOWN:
		mouse_x, mouse_y = event.pos
		x = mouse_x // SIZE
		y = mouse_y // SIZE - 2
		b1, b2, b3 = pygame.mouse.get_pressed()
		if game_status == started:
			# 鼠標左右鍵同時按下,如果已經(jīng)標記了所有雷,則打開周圍一圈;如果還未標記完所有雷,則有一個周圍一圈被同時按下的效果
			if b1 and b3:
				mine = block.getmine(x, y)
				if mine.status == opened:
					if not block.double_mouse_button_down(x, y):
						game_status = over
	elif event.type == MOUSEBUTTONUP:
		if y < 0:
			if face_pos_x <= mouse_x <= face_pos_x + face_size \
					and face_pos_y <= mouse_y <= face_pos_y + face_size:
				game_status = readied
				block = MineBlock()
				start_time = time.time()
				elapsed_time = 0
				continue
		if game_status == readied:
			game_status = started
			start_time = time.time()
			elapsed_time = 0
		if game_status == started:
			mine = block.getmine(x, y)
			# 按鼠標左鍵
			if b1 and not b3:
				if mine.status == normal:
					if not block.open_mine(x, y):
						game_status = over
			# 按鼠標右鍵
			elif not b1 and b3:
				if mine.status == normal:
					mine.status = flag
				elif mine.status == flag:
					mine.status = ask
				elif mine.status == ask:
					mine.status = normal
			elif b1 and b3:
				if mine.status == double:
					block.double_mouse_button_up(x, y)

我們來看一下最終實現(xiàn)效果:

總結(jié)

本文我們通過 Python 簡單的實現(xiàn)了掃雷游戲,大家有興趣的話,可以實際操作一下,看看自己能否排除全部的雷。

完整代碼

項目地址

以上就是python實現(xiàn)掃雷游戲的示例的詳細內(nèi)容,更多關于python 掃雷的資料請關注腳本之家其它相關文章!

相關文章

  • python中的裝飾器該如何使用

    python中的裝飾器該如何使用

    裝飾器經(jīng)常被用于有切面需求的場景,較為經(jīng)典的有插入日志、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數(shù)中與函數(shù)功能本身無關的雷同代碼并繼續(xù)重用。裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。
    2021-06-06
  • python操作MySQL數(shù)據(jù)庫的方法分享

    python操作MySQL數(shù)據(jù)庫的方法分享

    堅持每天學一點,每天積累一點點,作為自己每天的業(yè)余收獲,這個文章是我在吃飯的期間寫的,利用自己零散的時間學了一下python操作MYSQL,所以整理一下
    2012-05-05
  • Web自動化之Selenium常用操作方法大全

    Web自動化之Selenium常用操作方法大全

    Selenium是一種自動化測試工具,可以用于測試Web應用程序,它提供了一組用于自動化Web瀏覽器進行測試的API,下面這篇文章主要給大家介紹了關于Web自動化之Selenium常用操作方法的相關資料,需要的朋友可以參考下
    2023-06-06
  • Python中異常處理及最佳實踐舉例詳解

    Python中異常處理及最佳實踐舉例詳解

    異常處理在任何一門編程語言里都是值得關注的一個話題,良好的異常處理可以讓你的程序更加健壯,下面這篇文章主要給大家介紹了關于Python中異常處理及最佳實踐的相關資料,需要的朋友可以參考下
    2024-03-03
  • Python正則表達式經(jīng)典入門教程

    Python正則表達式經(jīng)典入門教程

    這篇文章主要介紹了Python正則表達式,結(jié)合具體實例形式歸納總結(jié)了Python正則表達式中常用的各種函數(shù)與相關使用技巧,需要的朋友可以參考下
    2017-05-05
  • 在Keras中實現(xiàn)保存和加載權重及模型結(jié)構

    在Keras中實現(xiàn)保存和加載權重及模型結(jié)構

    這篇文章主要介紹了在Keras中實現(xiàn)保存和加載權重及模型結(jié)構,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python使用time、datetime返回工作日列表實例代碼

    python使用time、datetime返回工作日列表實例代碼

    這篇文章主要介紹了python使用time、datetime返回工作日列表,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • python 比較字典value的最大值的幾種方法

    python 比較字典value的最大值的幾種方法

    這篇文章主要介紹了python 比較字典value的最大值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python文件讀寫open函數(shù)詳解

    Python文件讀寫open函數(shù)詳解

    這篇文章主要介紹了Python文件讀寫open函數(shù)詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • python3實現(xiàn)抓取網(wǎng)頁資源的 N 種方法

    python3實現(xiàn)抓取網(wǎng)頁資源的 N 種方法

    這兩天學習了python3實現(xiàn)抓取網(wǎng)頁資源的方法,發(fā)現(xiàn)了很多種方法,所以,今天添加一點小筆記。
    2017-05-05

最新評論

万盛区| 桦甸市| 侯马市| 中宁县| 浪卡子县| 平原县| 湘西| 孟州市| 仲巴县| 乾安县| 无棣县| 华阴市| 宁蒗| 尼木县| 镶黄旗| 通州市| 宜昌市| 潜江市| 新津县| 玉树县| 维西| 丹棱县| 沈阳市| 瑞安市| 德惠市| 石阡县| 兴业县| 桐柏县| 郸城县| 福鼎市| 阿拉善右旗| 桃园县| 绥阳县| 祁阳县| 司法| 嘉义市| 青阳县| 斗六市| 泉州市| 台北市| 开平市|