بمببازی (Minesweeper)
بازی Minesweeper از یک جدول m × n ساخته شده است که در آن بعضی از خانهها حاوی بمب هستند. سایر خانهها تعداد بمبهایی که در ۸ خانهی مجاور آنها قرار دارد را نشان میدهند.
در این تمرین، خانههای حاوی بمب به شما داده میشود. برنامهای بنویسید که جدول را به شکل کامل چاپ کند.
💡 راهنمایی ۱: ساخت صفحهی بازی
یک لیست به نام board تعریف کنید که n عضو دارد. هرکدام از اعضای board، یک لیست mعضوی است که در ابتدا همگی آنها مقدار صفر دارند.
board = []
for x in range(n):
board.append([])
for y in range(m):
board[x].append(0)
از روش زیر برای ساخت لیست استفاده نکنید:
این روش باعث میشود همهی سطرها به یک لیست اشاره کنند و تغییر یک خانه، همهی خانههای مشابه را تغییر دهد.
board = [[0] * m] * n
💡 راهنمایی ۲: ماندن در محدودهی مجاز
هنگام بررسی خانههای اطراف، دقت کنید که از محدودهی جدول خارج نشوید.
برای بررسی ۸ خانهی مجاور، باید شرطهای مرزی را بررسی کنید:
xباید بین0وn-1باشدyباید بین0وm-1باشد
📥 ورودی
- خط اول: دو عدد
nوm(تعداد سطر و ستون) - خط دوم: عدد
k(تعداد بمبها) kخط بعدی: مکان هر بمب (سطر و ستون)
1 ≤ m, n ≤ 100
📤 خروجی
جدول n × m را چاپ کنید:
- بمبها:
* - سایر خانهها: تعداد بمبهای اطراف
- بین هر دو عنصر در یک سطر، یک فاصله قرار دهید.
🎯 نمونه
ورودی نمونه
4 3
5
1 1
1 3
3 2
4 2
4 3
خروجی نمونه
* 2 *
2 3 2
2 * 3
2 * *
مراحل تغییر board
* 1 0
1 1 0
0 0 0
0 0 0
* 2 *
1 2 1
0 0 0
0 0 0
* 2 *
2 3 2
1 * 1
1 1 1
* 2 *
2 3 2
2 * 2
2 * 2
* 2 *
2 3 2
2 * 3
2 * *
💡 راهنمایی ۳: شبهکد راهحل
تابع زیر برای بررسی تعداد بمبهای اطراف هر خانه استفاده میشود:
# check_pos(x, y): بررسی خانههای اطراف
pos = [-1, 0, 1]
if board[x][y] != "*": # اگر بمب نباشد
for i in pos:
for j in pos:
if i != 0 or j != 0: # خود خانه نباشد
if board[x+i][y+j] == "*":
board[x][y] += 1
💡 راهنمایی نهایی
n, m = map(int, input().split())
k = int(input())
# ایجاد board با ابعاد n × m
board = []
for i in range(n):
row = [0] * m
board.append(row)
# قرار دادن بمبها
for i in range(k):
x, y = map(int, input().split())
board[x-1][y-1] = '*'
# بروزرسانی خانههای اطراف هر بمب
directions = [(-1, -1), (-1, 0), (-1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (1, 1)]
for x in range(n):
for y in range(m):
if board[x][y] == '*':
continue
count = 0
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m:
if board[nx][ny] == '*':
count += 1
board[x][y] = count
# چاپ board
for row in board:
print(' '.join(map(str, row)))
- اندیسها در پایتون از ۰ شروع میشوند، پس ورودیها را
-1کنید.- برای بررسی ۸ جهت، از لیست
directionsاستفاده کنید.- همیشه شرط مرزی را بررسی کنید تا از محدوده خارج نشوید.
- برای چاپ، از
' '.join(map(str, row))استفاده کنید.
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید و با ورودیهای مختلف تست کنید.
نمونهها
4 3 5 1 1 1 3 3 2 4 2 4 3
* 2 * 2 3 2 2 * 3 2 * *
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود