راه
۷ کیو· سادهمبتدیPYTHON۴ ثانیه · ۲۵۶ مگابایت

بمب‌بازی (Minesweeper)

بازی Minesweeper از یک جدول m × n ساخته شده است که در آن بعضی از خانه‌ها حاوی بمب هستند. سایر خانه‌ها تعداد بمب‌هایی که در ۸ خانه‌ی مجاور آن‌ها قرار دارد را نشان می‌دهند.

در این تمرین، خانه‌های حاوی بمب به شما داده می‌شود. برنامه‌ای بنویسید که جدول را به شکل کامل چاپ کند.


💡 راهنمایی ۱: ساخت صفحه‌ی بازی

یک لیست به نام board تعریف کنید که n عضو دارد. هرکدام از اعضای board، یک لیست mعضوی است که در ابتدا همگی آن‌ها مقدار صفر دارند.

python
board = []
for x in range(n):
    board.append([])
    for y in range(m):
        board[x].append(0)

از روش زیر برای ساخت لیست استفاده نکنید:

این روش باعث می‌شود همه‌ی سطرها به یک لیست اشاره کنند و تغییر یک خانه، همه‌ی خانه‌های مشابه را تغییر دهد.

python
board = [[0] * m] * n

💡 راهنمایی ۲: ماندن در محدوده‌ی مجاز

هنگام بررسی خانه‌های اطراف، دقت کنید که از محدوده‌ی جدول خارج نشوید.

برای بررسی ۸ خانه‌ی مجاور، باید شرط‌های مرزی را بررسی کنید:

  • x باید بین 0 و n-1 باشد
  • y باید بین 0 و m-1 باشد

📥 ورودی

  • خط اول: دو عدد n و m (تعداد سطر و ستون)
  • خط دوم: عدد k (تعداد بمب‌ها)
  • k خط بعدی: مکان هر بمب (سطر و ستون)

1 ≤ m, n ≤ 100

📤 خروجی

جدول n × m را چاپ کنید:

  • بمب‌ها: *
  • سایر خانه‌ها: تعداد بمب‌های اطراف
  • بین هر دو عنصر در یک سطر، یک فاصله قرار دهید.

🎯 نمونه

ورودی نمونه

text
4 3
5
1 1
1 3
3 2
4 2
4 3

خروجی نمونه

text
* 2 *
2 3 2
2 * 3
2 * *

مراحل تغییر board

text
* 1 0
1 1 0
0 0 0
0 0 0
text
* 2 *
1 2 1
0 0 0
0 0 0
text
* 2 *
2 3 2
1 * 1
1 1 1
text
* 2 *
2 3 2
2 * 2
2 * 2
text
* 2 *
2 3 2
2 * 3
2 * *

💡 راهنمایی ۳: شبه‌کد راه‌حل

تابع زیر برای بررسی تعداد بمب‌های اطراف هر خانه استفاده می‌شود:

python
# 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

💡 راهنمایی نهایی

python
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 * *

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود