آموزش آرایه در پایتون – ویژه نوجوانان


🧸 آرایه در پایتون

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

آرایه یک‌بعدی مثل یک صف یا لیست خرید می‌مونه. فرض کن داری لیست کارهایی که باید انجام بدی رو مینویسی: [“خرید”, “بازی”, “خواب”] . هر کدوم از اینا یک جایگاه داره (شاخص) که از ۰ شروع میشه.
کاربردها: ذخیره نمرات، امتیازهای بازی، اسم شخصیت‌ها، دماهای هفته.
💡 چرا از آرایه یک‌بعدی استفاده کنیم؟ خیلی راحت می‌تونیم همه چیز رو یک جا نگه داریم و سریع بهشون دسترسی پیدا کنیم. توی بازی میشه امتیازهای مرحله‌ها رو توی یک لیست ذخیره کرد!

🗂️ آرایه دو‌بعدی چیست؟ (مثل جدول شطرنج)

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

⚖️ فرق آرایه یک‌بعدی و دو بعدی

🔹 یک‌بعدی
• شکل: خطی مثل صف
• اندیس: فقط یک عدد [i]
• کاربرد: لیست نمرات، امتیازها
🔸 دو بعدی
• شکل: جدولی سطر و ستون
• اندیس: دو عدد [i][j]
• کاربرد: صفحه بازی، نقشه

🎮 ۱۰ پروژه بازی برای نوجوانان (با توضیح خط به خط)

۱️⃣ بازی حدس عدد جادویی
📌 سوال: برنامه‌ای بنویس که عدد تصادفی ۱ تا ۱۰۰ انتخاب کنه. کاربر حدس بزنه و راهنمایی بگیره. از آرایه یک‌بعدی برای ذخیره حدس‌های قبلی استفاده کن.
📺 خروجی نمونه:
حدس بزن: ۵۰ 👈 برو بالا
حدس بزن: ۷۵ 👈 برو پایین
🎉 درست! عدد ۶۳ بود. حدس‌ها: [۵۰,۷۵,۶۳]
import random

عدد_راز = random.randint(1,100)
حدس_ها = []

while True:
try:
حدس = int(input(“عدد را حدس بزن: “))
if حدس in حدس_ها:
print(“قبلاً این عدد رو گفتی!”)
continue
حدس_ها.append(حدس)
if حدس == عدد_راز:
print(f”آفرین! عدد {عدد_راز} بود. تعداد حدس: {len(حدس_ها)}”)
break
elif حدس < عدد_راز:
print(“برو بالا ⬆️”)
else:
print(“برو پایین ⬇️”)
except:
print(“لطفاً یک عدد وارد کن”)

📝 توضیح خط به خط (خیلی ساده):
import random → ابزار تولید عدد تصادفی رو صدا می‌زنه.
عدد_راز = random.randint(1,100) → یک عدد بین ۱ تا ۱۰۰ انتخاب می‌کنه و توی متغیر می‌ذاره.
حدس_ها = [] → یه آرایه یک‌بعدی خالی برای نگهداری حدس‌های قبلی درست می‌کنه.
while True: → یه حلقه بی‌نهایت که تا درست شدن ادامه میده.
if حدس in حدس_ها: → چک می‌کنه آیا این عدد قبلاً توی آرایه هست (جستجوی خطی).
حدس_ها.append(حدس) → عدد جدید رو به آخر آرایه اضافه می‌کنه.
• بقیه شرط‌ها راهنمایی می‌دن که عدد بزرگتر یا کوچیکتر بگه.

۲️⃣ مار و پله ساده
📌 سوال: یک صفحه ۳۰ خانه‌ای بساز، تاس بینداز و مهره حرکت کنه. از آرایه یک‌بعدی برای مار و پله استفاده کن.
🎲 تاس: ۴ → حرکت به خانه ۱۱
🎁 پله! رفت به ۱۸
🏆 برنده شدی!
import random

خانه‌ها = [۰]*۳۰
خانه‌ها[۳] = ۱۲
خانه‌ها[۱۶] = -۷
مکان = ۰

while مکان < 29:
input(“Enter بزن تا تاس بیندازی…”)
تاس = random.randint(1,6)
print(f”تاس: {تاس}”)
مکان += تاس
if مکان >= ۲۹:
print(“🏆 برنده شدی!”)
break
اثر = خانه‌ها[مکان]
if اثر > ۰:
print(f”پله! میری به {مکان+اثر+۱}”)
مکان += اثر
elif اثر < 0:
print(f”مار! میری به {مکان+اثر+۱}”)
مکان += اثر
print(f”مهره در خانه {مکان+۱}”)

✏️ توضیح: خانه‌ها = [۰]*۳۰ یک آرایه یک‌بعدی با ۳۰ تا صفر می‌سازه. با خانه‌ها[۳] = ۱۲ یعنی هر کی برسه به خونه ۳ (اندیس ۳) پله +۱۲ تا میره بالا. حلقه while تا وقتی که مهره به انتها نرسه، تاس میندازه. اثر خانه فعلی رو از آرایه میخونه و مهره رو جابجا می‌کنه.

۳️⃣ ❌⭕ بازی دوز (تیک تاک تو)
📌 سوال: صفحه ۳×۳ با آرایه دو بعدی درست کن، دو بازیکن علامت بذارن و برنده رو تشخیص بده.
X | O | X
—+—+—
O | X |
—+—+—
O | |
🏆 بازیکن X برنده شد!
board = [[” ” for _ in range(3)] for _ in range(3)]

def نمايش():
for سطر in board:
print(“|”.join(سطر))
print(“—“)

def برنده(نشان):
for i in range(3):
if all(board[i][j] == نشان for j in range(3)): return True
if all(board[j][i] == نشان for j in range(3)): return True
if board[0][0]==board[1][1]==board[2][2]==نشان: return True
if board[0][2]==board[1][1]==board[2][0]==نشان: return True
return False

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

🧩 توضیح آرایه دو بعدی: board = [[" " for _ in range(3)] for _ in range(3)] یک جدول ۳×۳ می‌سازه. هر خونه با board[سطر][ستون] در دسترسه. تابع برنده با چک کردن سطرها، ستون‌ها و قطرها از آرایه دوبعدی می‌فهمه چه کسی برنده شده.

۴️⃣ جستجوی سریع (دودویی) در رکوردها
📌 سوال: یه آرایه مرتب از امتیازها بساز و با جستجوی دودویی جایگاه امتیاز کاربر رو پیدا کن.
امتیازها: [۱۲۰, ۳۴۰, ۵۶۰, ۷۸۰, ۹۰۰]
امتیاز ۵۶۰ → رتبه ۳
def جستجوی_دودویی(arr, هدف):
چپ = ۰
راست = len(arr)-1
while چپ <= راست:
وسط = (چپ + راست)//۲
if arr[وسط] == هدف:
return وسط
elif arr[وسط] < هدف:
چپ = وسط + ۱
else:
راست = وسط – ۱
return -1

امتیازها = [۱۲۰, ۳۴۰, ۵۶۰, ۷۸۰, ۹۰۰]
چاپ(“لیست مرتب:”, امتیازها)
امتیاز_کاربر = int(input(“امتیاز خود را وارد کن: “))
نتیجه = جستجوی_دودویی(امتیازها, امتیاز_کاربر)
if نتیجه != -۱:
print(f”امتیاز {امتیاز_کاربر} در جایگاه {نتیجه+۱} است”)
else:
print(“پیدا نشد”)

📖 جستجوی دودویی یعنی چی؟ مثل اینکه توی یه کتاب مرتب، هر بار کتاب رو نصف می‌کنی و میبینی هدف کدوم قسمته. خیلی سریعتر از جستجوی خطی. اینجا آرایه یک‌بعدی مرتب رو نصف نصف می‌کنیم تا ایندکس رو پیدا کنیم.

۵️⃣ ضرب ماتریس برای تغییر شکل در بازی
📌 سوال: دو ماتریس ۲×۲ رو ضرب کن تا نتیجه رو ببینی (کاربرد در گرافیک بازی).
[[۱,۲],[۳,۴]] * [[۲,۰],[۱,۲]] = [[۴,۴],[۱۰,۸]]
A = [[1,2],[3,4]]
B = [[2,0],[1,2]]
نتیجه = [[۰,۰],[۰,۰]]

for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
نتیجه[i][j] += A[i][k] * B[k][j]

print(“حاصل ضرب:”)
for سطر in نتیجه:
print(سطر)

✖️ کار با آرایه دو بعدی در ضرب: سه حلقه تو در تو: i روی سطرهای ماتریس اول، j روی ستون‌های ماتریس دوم، k برای جمع کردن. هر خونه نتیجه از جمع ضرب‌ها بدست میاد. توی بازی‌ها برای چرخاندن تصاویر کاربرد داره.

۶️⃣ بازی حدس کلمه (حرف به حرف)
📌 سوال: کلمه مخفی رو با حدس زدن حروف پیدا کن. از آرایه یک‌بعدی برای نمایش کلمه استفاده کن.
کلمه: _ ا _ _ _
حرف “ل”: آفرین! _ ا ل _ _
شما برنده شدید!
کلمه = “بازی”
حروف_نمایش = [“_”] * len(کلمه)
جان = ۶

while جان > ۰ and “_” in حروف_نمایش:
print(” “.join(حروف_نمایش))
حرف = input(“یک حرف بزن: “)
پیدا_شد = False
for i,ch in enumerate(کلمه):
if ch == حرف:
حروف_نمایش[i] = حرف
پیدا_شد = True
if not پیدا_شد:
جان -= ۱
print(f”غلط! جان‌های باقی: {جان}”)

if “_” not in حروف_نمایش:
print(f”🎉 بردی! کلمه {کلمه} بود”)

🔤 توضیح آرایه یک‌بعدی برای کلمه: حروف_نمایش = ["_"] * len(کلمه) یه آرایه به تعداد حروف کلمه درست میکنه که جای خالی نشون بده. حلقه for با enumerate هم اندیس و هم حرف رو می‌ده. اگر حرف کاربر توی کلمه باشه، همون جای آرایه عوض میشه.

۷️⃣ اسب روی صفحه شطرنج ۵×۵
📌 سوال: یه صفحه ۵×۵ با آرایه دو بعدی بساز و حرکت اسب رو بررسی کن.
اسب در (۲,۲) ➡️ حرکت به (۴,۳) مجاز است ✅
board = [[“.” for _ in range(5)] for _ in range(5)]
اسب_x, اسب_y = 2,2
board[اسب_x][اسب_y] = “♞”

def نمایش():
for سطر in board: print(” “.join(سطر))

نمایش()
حرکات = [(۲,۱),(۲,-۱),(-۲,۱),(-۲,-۱),(۱,۲),(۱,-۲),(-۱,۲),(-۱,-۲)]
جدید_x = int(input(“x جدید (۰-۴): “))
جدید_y = int(input(“y جدید (۰-۴): “))
if (جدید_x-اسب_x, جدید_y-اسب_y) in حرکات and 0<=جدید_x<5 and 0<=جدید_y<5:
board[اسب_x][اسب_y] = “.”
board[جدید_x][جدید_y] = “♞”
print(“حرکت کرد ✅”)
else:
print(“حرکت غیرمجاز ❌”)
نمایش()

🐎 آرایه دو بعدی و حرکت اسب: با board[اسب_x][اسب_y] به جایگاه اسب دسترسی داریم. حرکات مجاز اسب به صورت لیستی از تاپل‌ها ذخیره شده. اگه تفاوت مختصات جدید با قدیم توی لیست حرکات باشه، حرکت مجازه.

۸️⃣ دفترچه قهرمانان با جستجوی دودویی
📌 سوال: لیست اسم قهرمانان رو مرتب کن و با جستجوی دودویی اسم مورد نظر رو پیدا کن.
[‘آرش’, ‘بهمن’, ‘سارا’, ‘زهرا’]
جستجوی ‘بهمن’ ✅ پیدا شد
قهرمانان = [“زهرا”, “آرش”, “بهمن”, “سارا”]
قهرمانان.sort()
print(“لیست مرتب:”, قهرمانان)

def جستجوی_دودویی_اسم(آرایه, هدف):
چپ, راست = ۰, len(آرایه)-۱
while چپ <= راست:
وسط = (چپ+راست)//۲
if آرایه[وسط] == هدف: return وسط
elif آرایه[وسط] < هدف: چپ = وسط+1
else: راست = وسط-۱
return -1

اسم = input(“اسم قهرمان را بگو: “)
اندیس = جستجوی_دودویی_اسم(قهرمانان, اسم)
if اندیس != -۱:
print(f”{اسم} توی جایگاه {اندیس+۱} هست”)
else:
print(“توی لیست نیست”)

🧙 مرتب‌سازی و جستجوی دودویی: با sort() آرایه یک‌بعدی رو مرتب می‌کنیم. جستجوی دودویی فقط روی آرایه مرتب کار می‌کنه و خیلی سریع اسم رو پیدا می‌کنه.

۹️⃣ فروشگاه آیتم‌های بازی
📌 سوال: منوی فروشگاه رو با آرایه دو بعدی (نام و قیمت) بساز و جمع خرید رو حساب کن.
۰ – جان اضافه: ۱۰۰ سکه
۱ – بمب: ۲۰۰ سکه
مجموع: ۳۰۰ سکه
منو = [[“جان اضافه”, ۱۰۰], [“بمب”, ۲۰۰], [“سپر”, ۳۵۰]]
سبد_خرید = []

while True:
for i, آیتم in enumerate(منو):
print(f”{i} – {آیتم[۰]} : {آیتم[۱]} سکه”)
انتخاب = input(“کد کالا یا Enter برای خروج: “)
if انتخاب == “”:
break
کد = int(انتخاب)
if 0 <= کد < len(منو):
سبد_خرید.append(منو[کد][۱])
print(f”{منو[کد][۰]} به سبد اضافه شد”)
else:
print(“کد اشتباه”)

print(f”💰 مجموع: {sum(سبد_خرید)} سکه”)

🛒 آرایه دو بعدی منو: هر آیتم شامل یه لیست دو عضوی [اسم, قیمت] هست. دسترسی به اسم با منو[کد][۰] و قیمت با منو[کد][۱]. سبد خرید یک آرایه یک بعدی از قیمت‌هاست.

🔟 رتبه بندی مسابقه
📌 سوال: لیست امتیازها رو مرتب کن و رتبه کاربر رو مشخص کن.
امتیازها: [۹۰۰, ۷۵۰, ۶۰۰, ۴۰۰, ۲۰۰]
امتیاز شما ۶۰۰ ➡️ رتبه ۳
امتیازها = [۴۰۰, ۹۰۰, ۲۰۰, ۷۵۰, ۶۰۰]
امتیازها.sort(reverse=True)
print(“امتیازهای برتر:”, امتیازها)

امتیاز_من = int(input(“امتیاز خود را وارد کن: “))
رتبه = ۱
for ام in امتیازها:
if امتیاز_من >= ام:
break
رتبه += ۱

print(f”🏅 رتبه شما: {رتبه}”)

🥇 پیدا کردن رتبه: آرایه یک‌بعدی امتیازها رو نزولی مرتب می‌کنیم. با یه حلقه ساده می‌گردیم تا ببینیم امتیاز کاربر از چه جایی بیشتر یا مساوی میشه. هر چقدر پایین‌تر بریم رتبه بزرگتر میشه.

⚠️ خطاهای رایج (اشتباهات معمولی که ممکنه ببینی)

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

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

❌ ۳. کاما یادت بره توی لیست: n = [10 20 30] کاما نداره → ارور میده. درستش: [۱۰,۲۰,۳۰]

❌ ۴. IndexError (اندیس خارج از محدوده): مثلاً لیست ۵ تایی داری و می‌نویسی my_list[5] آخرین اندیس ۴ هست. همیشه طول لیست رو با len() چک کن.

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

🌟 نوشته شده توسط اکادمی خورشیدوب، برای نوجوانان عزیز – با آرایه‌ها بازی‌های جذاب بسازید 🌟


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

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