آموزش آرایه دو بعدی در پایتون


🧩 آرایه دو بعدی

📦 آرایه دو بعدی چیست؟

آرایه دو بعدی مثل یک جدول یا صفحه شطرنج می‌مونه! فرض کن یه دفتر شطرنجی داری که خونه‌ها رو با شماره سطر و شماره ستون پیدا می‌کنی. مثلاً خانه‌ی سطر ۲ و ستون ۳. در پایتون آرایه دو بعدی یعنی یه لیست که توش چند تا لیست دیگه هست.
مثال : مدرسه = [["کلاس اول", "کلاس دوم"], ["راهرو", "دفتر مدیر"]]
🎮 کاربردها در پروژه‌های بازی: ساخت بازی دوز (۳×۳)، بازی مار و پله، نقشه‌ی مرحله‌ها، مین‌یاب، صفحه‌ی شطرنج، پازل‌های جدولی و خیلی بازی‌های دیگر.
💡 چرا از آرایه دو بعدی استفاده کنیم؟ چون اکثر بازی‌های جذاب دارای صفحه و مختصات هستند (مثل ایکس، وای). با آرایه دو بعدی می‌توانیم هر خانه را با board[سطر][ستون] عوض کنیم، برنده را بررسی کنیم، مهره را حرکت دهیم. خیلی ساده و قدرتمند است!

🎮 ۱۰ پروژه بازی

🎲 ۱. بازی دوز (تیک تاک تو)
📌 سوال پروژه: یه صفحه ۳×۳ با آرایه دو بعدی بساز. دو بازیکن به نوبت علامت بگذارند (X و O) و هر بار برنده رو چک کن.
📺 خروجی نمونه:
X | O | X
—+—+—
O | X |
—+—+—
O | |
🏆 بازیکن X برنده شد!
board = [[” ” for _ in range(3)] for _ in range(3)]

def show_board():
for row in board:
print(“|”.join(row))
print(“—“)

def check_win(symbol):
for i in range(3):
if all(board[i][j] == symbol for j in range(3)):
return True
if all(board[j][i] == symbol for j in range(3)):
return True
if board[0][0] == board[1][1] == board[2][2] == symbol:
return True
if board[0][2] == board[1][1] == board[2][0] == symbol:
return True
return False

player = “X”
for turn in range(9):
show_board()
row = int(input(f”بازیکن {player} – سطر (۰,۱,۲): “))
col = int(input(“ستون (۰,۱,۲): “))
if board[row][col] == ” “:
board[row][col] = player
if check_win(player):
show_board()
print(f”🎉 برنده شد: {player}”)
break
player = “O” if player == “X” else “X”
else:
print(“این خانه پر شده!”)
else:
print(“مساوی!”)

📝 توضیح خط به خط (بعد از کدها):
board = [[" " for _ in range(3)] for _ in range(3)] → این خط یک آرایه دو بعدی ۳×۳ درست می‌کند. هر خونه یک فضای خالی است.
def show_board(): → تابعی برای نمایش صفحه. با یک حلقه روی سطرها، هر سطر را با “|” چاپ می‌کند.
def check_win(symbol): → برنده را چک می‌کند. با استفاده از حلقه، سه سطر و سه ستون و دو قطر را بررسی می‌کند.
if all(board[i][j] == symbol for j in range(3)) → چک می‌کند که آیا همه خانه‌های سطر i برابر علامت بازیکن هستند؟
player = "X" → بازیکن اول X است. سپس در حلقه، خانه را بروز می‌کند و بعد از هر حرکت، برنده را چک می‌کند.

🐍 ۲. مار و پله (نقشه ۲ بعدی)
📌 سوال: یه صفحه ۵×۵ به عنوان نقشه بساز، با آرایه دو بعدی محل پله و مار را مشخص کن و تاس بینداز.
🎲 تاس: ۳ → مهره به (۱,۲) رفت
🎁 پله! میری به (۳,۴)
🏆 به خط پایان رسیدی
import random

size = 5
board = [[0 for _ in range(size)] for _ in range(size)]
board[1][2] = 12 # پله از خانه (۱,۲) به جلو
board[3][4] = -8 # مار از (۳,۴) به عقب

pos_row, pos_col = 0, 0

while (pos_row, pos_col) != (size-1, size-1):
input(“Enter بزن تا تاس بیندازی…”)
dice = random.randint(1, 6)
print(f”تاس: {dice}”)
for _ in range(dice):
if pos_col < size-1: pos_col += 1 elif pos_row < size-1: pos_row += 1 pos_col = 0 else: break print(f"مهره در سطر {pos_row} , ستون {pos_col}") effect = board[pos_row][pos_col] if effect > 0:
print(“پله! جلو میری”)
for _ in range(effect):
if pos_col < size-1: pos_col += 1 elif pos_row < size-1: pos_row += 1 pos_col = 0 elif effect < 0: print("مار! عقب میری") for _ in range(-effect): if pos_col > 0:
pos_col -= 1
elif pos_row > 0:
pos_row -= 1
pos_col = size-1
print(f”موقعیت جدید: ({pos_row},{pos_col})”)
print(“🎉 برنده شدی!”)

🔍 توضیح: آرایه دو بعدی board به عنوان نقشه. مقدار مثبت یعنی پله، منفی یعنی مار. موقعیت مهره با (pos_row, pos_col) ذخیره می‌شود. بعد از تاس انداختن، مهره حرکت می‌کند و سپس اثر خانه را از آرایه دو بعدی می‌خوانیم.

💣 ۳. مین‌یاب کوچک
📌 سوال: یه صفحه ۴×۴ درست کن، چندتا مین مخفی بذار و کاربر مختصات حدس بزنه.
📺 خروجی نمونه:
خوش آمدی! مختصات سطر و ستون بگو…
سطر ۲، ستون ۳ → 💥 مین! بازی تمام شد
import random

size = 4
board = [[“□” for _ in range(size)] for _ in range(size)]
mines = [[False for _ in range(size)] for _ in range(size)]

num_mines = 3
placed = 0
while placed < num_mines: r = random.randint(0, size-1) c = random.randint(0, size-1) if not mines[r][c]: mines[r][c] = True placed += 1 def show(): for row in board: print(" ".join(row)) show() lives = 2 while lives > 0:
row = int(input(“سطر (۰-۳): “))
col = int(input(“ستون (۰-۳): “))
if mines[row][col]:
print(“💥 مین! جان داری از دست میدی”)
lives -= 1
board[row][col] = “💣”
show()
if lives == 0:
print(“باختی!”)
break
else:
print(“✅ سالم!”)
board[row][col] = “✓”
show()
win = True
for i in range(size):
for j in range(size):
if not mines[i][j] and board[i][j] == “□”:
win = False
if win:
print(“🎉 تو برنده شدی ، همه مین‌ها رو شناسایی کردی!”)
break

🧨 توضیح: دو تا آرایه دو بعدی داریم: board برای نمایش به کاربر و mines برای ذخیره جای مین‌ها. کاربر مختصات می‌دهد، اگر mines[row][col] True بود، برخورد با مین. بعد از هر حرکت صفحه بروز می‌شود.

🧩 ۴. پازل اسلاید (۱۵ تایی ساده)
📌 سوال: اعداد ۱ تا ۸ و یک خانه خالی در آرایه ۳×۳، کاربر خانه خالی را با همسایه جابجا کند.
[۱,۲,۳]
[۴,۵,۶]
[۷,۸, ] → با حرکت دادن، پازل رو حل کن
puzzle = [[1,2,3],[4,5,6],[7,8,” “]]
empty_r, empty_c = 2,2

def show_puzzle():
for row in puzzle:
print(row)

show_puzzle()

while puzzle != [[1,2,3],[4,5,6],[7,8,” “]]:
move = input(“حرکت w(بالا) s(پایین) a(چپ) d(راست): “)
nr, nc = empty_r, empty_c
if move == “w”:
nr = empty_r – 1
elif move == “s”:
nr = empty_r + 1
elif move == “a”:
nc = empty_c – 1
elif move == “d”:
nc = empty_c + 1
if 0 <= nr < 3 and 0 <= nc < 3: puzzle[empty_r][empty_c], puzzle[nr][nc] = puzzle[nr][nc], puzzle[empty_r][empty_c] empty_r, empty_c = nr, nc show_puzzle() else: print("حرکت غیرمجاز") print("🎉 پازل حل شد!")

🔁 توضیح: آرایه دو بعدی puzzle شامل اعداد و یک خانه خالی. با دریافت ورودی w,s,a,d مختصات خالی تغییر می‌کند و با خانه مقصد جابجا می‌شود. حلقه تا رسیدن به حالت مرتب ادامه دارد.

🏃 ۵. جمع‌آوری ستاره در صفحه
📌 سوال: صفحه ۶×۶ با چند ستاره، کاربر مختصات بزند و امتیاز بگیرد.
⭐️ صفحه ستاره‌ها، با وارد کردن سطر و ستون ستاره جمع کن!
import random
size = 6
grid = [[“⬜” for _ in range(size)] for _ in range(size)]
stars = 5
for _ in range(stars):
r = random.randint(0,size-1)
c = random.randint(0,size-1)
grid[r][c] = “⭐”

score = 0
def show():
for row in grid:
print(” “.join(row))

while score < stars: show() row = int(input("سطر: ")) col = int(input("ستون: ")) if grid[row][col] == "⭐": print("🌟 یک ستاره گرفتی!") score += 1 grid[row][col] = "✅" else: print("❌ اینجا ستاره نیست") print(f"🎉 بردی! امتیاز نهایی: {score}")

⭐️ توضیح: آرایه دو بعدی grid شامل جای ستاره‌هاست. کاربر سطر و ستون را می‌گوید، اگر همان خانه ستاره داشت، امتیاز می‌گیرد و آن خانه را به علامت تبدیل می‌کند.

♟️ ۶. حرکت ساده پیاده روی شطرنج
📌 سوال: صفحه ۸×۸ با مهره پیاده، حرکت به جلو را بررسی کن.
مهره در (۱,۲) → حرکت به (۲,۲) مجاز است
chess = [[“.” for _ in range(8)] for _ in range(8)]
pawn_r, pawn_c = 1, 2
chess[pawn_r][pawn_c] = “♙”

def show_chess():
for row in chess:
print(” “.join(row))

show_chess()
new_r = int(input(“سطر مقصد (۰-۷): “))
new_c = int(input(“ستون مقصد: “))
if new_c == pawn_c and new_r == pawn_r + 1:
chess[pawn_r][pawn_c] = “.”
chess[new_r][new_c] = “♙”
print(“حرکت قانونی ✅”)
else:
print(“حرکت غیرمجاز ❌”)
show_chess()

♟️ توضیح: پیاده فقط می‌تواند یک خانه به جلو در همان ستون حرکت کند. شرط new_c == pawn_c and new_r == pawn_r+1 بررسی می‌کند. پس از حرکت، آرایه دو بعدی بروزرسانی می‌شود.

👾 ۷. شکار دشمنان در صفحه
📌 سوال: صفحه ۵×۵ شامل دشمنان (E) و کاربر با شلیک مختصات آن‌ها را نابود کند.
باقی‌مانده دشمنان: ۳ → شلیک به (۲,۲) → هدف نابود شد!
import random
size = 5
enemies = [[“_” for _ in range(size)] for _ in range(size)]
num_enemies = 4
for _ in range(num_enemies):
r = random.randint(0,size-1)
c = random.randint(0,size-1)
enemies[r][c] = “E”

killed = 0
while killed < num_enemies: for row in enemies: print(" ".join(row)) row = int(input("سطر هدف: ")) col = int(input("ستون هدف: ")) if enemies[row][col] == "E": print("💥 دشمن نابود شد!") enemies[row][col] = "✓" killed += 1 else: print("آب خورد! دشمنی نیست") print(f"🏆 همه دشمنان نابود شدند. کشته‌ها: {killed}")

🎯 توضیح: آرایه دو بعدی enemies مکان دشمنان را نگه می‌دارد. کاربر با وارد کردن مختصات، اگر خانه دشمن داشت، آن را نابود می‌کند و killed افزایش می‌یابد.

💡 ۸. چراغ‌های خاموش/روشن
📌 سوال: صفحه ۴×۴ چراغ (خاموش/روشن) کاربر مختصات بزند و همسایه‌ها تغییر وضعیت بدهند.
وارد سطر و ستون شوید → چراغ‌ها عوض می‌شوند
lights = [[“🔴” for _ in range(4)] for _ in range(4)]

def show_lights():
for row in lights:
print(” “.join(row))

show_lights()
while True:
r = int(input(“سطر (۰-۳): “))
c = int(input(“ستون (۰-۳): “))
if lights[r][c] == “🔴”:
lights[r][c] = “🟢”
else:
lights[r][c] = “🔴”
for dr, dc in [(1,0),(-1,0),(0,1),(0,-1)]:
nr, nc = r+dr, c+dc
if 0 <= nr < 4 and 0 <= nc < 4: if lights[nr][nc] == "🔴": lights[nr][nc] = "🟢" else: lights[nr][nc] = "🔴" show_lights() again = input("ادامه؟ (y/n): ") if again == "n": break

🔆 توضیح: با زدن هر خانه، خودش و چهار همسایه شمال، جنوب، شرق، غرب تغییر وضعیت می‌دهند (قرمز به سبز و برعکس). از آرایه دو بعدی برای نگهداری وضعیت استفاده شده.

🧠 ۹. بازی حافظه (جفت کارت‌ها)
📌 سوال: صفحه ۳×۴ شامل ۶ جفت کارت، کاربر دو خانه را باز کند و جفت را پیدا کند.
کارت‌ها مخفی است … باز کردن کارت‌ها
import random
values = [“🐱”,”🐶”,”🐭”,”🐹”,”🐰”,”🦊”]*۲
random.shuffle(values)
board = [[“❓” for _ in range(4)] for _ in range(3)]
real_board = [values[i*4:(i+1)*4] for i in range(3)]

pairs = 0
while pairs < 6: for row in board: print(" ".join(row)) r1 = int(input("اولین کارت - سطر: ")) c1 = int(input("ستون: ")) board[r1][c1] = real_board[r1][c1] for row in board: print(" ".join(row)) r2 = int(input("دومین کارت - سطر: ")) c2 = int(input("ستون: ")) board[r2][c2] = real_board[r2][c2] for row in board: print(" ".join(row)) if real_board[r1][c1] == real_board[r2][c2] and (r1,c1) != (r2,c2): print("🎉 جفت یافتی!") pairs += 1 else: print("❌ جفت نبود.") board[r1][c1] = "❓" board[r2][c2] = "❓" print("🏆 برنده شدی ، همه جفت‌ها پیدا شد!")

🃏 توضیح: two 2D arrays: real_board شامل نمادهای واقعی، board شامل کارت‌های پنهان. با انتخاب دو خانه، اگر مقدارشان برابر باشد جفت باقی می‌ماند، در غیر این صورت دوباره مخفی می‌شوند.

🚢 ۱۰. نبرد دریایی (تخریب کشتی)
📌 سوال: صفحه ۵×۵ ، یک کشتی ۲ خانه‌ای مخفی، کاربر با حدس زدن آن را پیدا کند.
شلیک به (۲،۳) → اصابت! کشتی غرق شد.
import random
sea = [[“🌊” for _ in range(5)] for _ in range(5)]
ship_row = random.randint(0,4)
ship_col = random.randint(0,3)
sea[ship_row][ship_col] = “🚢”
sea[ship_row][ship_col+1] = “🚢”

hits = 0
while hits < 2: for row in sea: print(" ".join(row)) r = int(input("سطر هدف: ")) c = int(input("ستون هدف: ")) if sea[r][c] == "🚢": print("💥 اصابت! به کشتی زدی") sea[r][c] = "💥" hits += 1 else: print("❌ آب خورد!") print("🎉 ناوگان دشمن نابود شد!")

⚓️ توضیح: آرایه دو بعدی sea محل کشتی را نشان می‌دهد. کشتی دو خانه پشت سر هم قرار دارد. کاربر مختصات می‌دهد، اگر به خانه حاوی 🚢 برخورد کند، نابود می‌شود. پس از ۲ ضربه پیروزی.

⚠️ خطاهای رایج در کدنویسی (مخصوص نوجوانان)

❌ ۱٫ خطای تو رفتگی (IndentationError): بعد از if, for, while حتماً باید فاصله (چهار space) بزنی. همه خطوط داخلش باید یکسان شروع بشن.

❌ ۲٫ پرانتز یا براکت بسته نشده: مثل print("سلام یا my_list = [1,2,3 → حتماً پرانتز و براکت رو جفت کن.

❌ ۳٫ کاما فراموش شده بین اعضای آرایه: numbers = [10 20 30] درستش [۱۰,۲۰,۳۰]

❌ ۴٫ IndexError (اندیس خارج از محدوده): وقتی آرایه ۵ عضوی داری و اندیس ۵ رو صدا میزنی. همیشه چک کن len(آرایه) چند است.

✅ راه حل: کدها را آرام بنویس، از محیط ادیتور استفاده کن و پیام خطا را با دقت بخوان. خطاها دوست تو هستند!

🧡 ۱۰ بازی جذاب با آرایه دو بعدی



“`

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *