2026-05-03 08:09:26 +00:00
2026-05-03 08:09:26 +00:00

بازی سنگ، کاغذ، قیچی

یک پروژه کلاس با کاتلین


سناریوی کامل بازی

  • کاربر وارد برنامه می‌شود.
  • یک پیام خوش‌آمد نشان داده می‌شود.
  • برنامه از کاربر می‌خواهد یکی از گزینه‌ها ("سنگ"، "کاغذ"، "قیچی") را انتخاب کند.
  • اگر کاربر عبارت "تموم" را وارد کند، بازی تمام می‌شود و برنامه بسته می‌شود.
  • اگر کاربر اشتباهی وارد کند (مثلاً "آب"، "کفش") پیام خطا نمایش داده می‌شود و دوباره ورودی می‌خواهد.
  • برنامه به صورت تصادفی یکی از گزینه‌ها را برای کامپیوتر انتخاب می‌کند.
  • برنامه نتیجه هر دور را نمایش می‌دهد ("مساوی شدین!" یا "هورا بردی!" یا "متاسفانه باختی").
  • سپس بازی برای دور بعدی آماده می‌شود.

کد کامل برنامه

fun main() {
    val options = listOf("سنگ", "کاغذ", "قیچی")

    println("به بازی سنگ کاغذ قیچی خوش آمدید!")

    while (true) {
        println("یک گزینه رو انتخاب کنید")
        val userSelection = readln()
        if (userSelection == "تموم") {
            break
        }
        if (userSelection !in options) {
            println("انتخابت اشتباهه")
            continue
        }
        val cpuSelection = options.random()
        if (cpuSelection == userSelection) {
            println("مساوی شدین!")
        } else if ((userSelection == "قیچی" && cpuSelection == "کاغذ")
            || (userSelection == "سنگ" && cpuSelection == "قیچی")
            || (userSelection == "کاغذ" && cpuSelection == "سنگ")
        ) {
            println("هورا بردی!")
        } else {
            println("متاسفانه باختی")
        }
        println("-------------------------------------------")
        println()
    }
}

توضیح گام به گام کد و مفاهیم هر بخش

۱. تعریف لیست (Array/لیست)

val options = listOf("سنگ", "کاغذ", "قیچی")
  • لیست چیست؟
    لیست یک نوع آرایه در کاتلین است، یعنی یک مجموعهٔ داده که چند مقدار رو کنار هم نگه می‌داره.
    هر مقدار (اینجا "سنگ"، "کاغذ"، "قیچی") در یک سلول قرار گرفته و هر بار می‌توانیم با اسم لیست بهش دسترسی داشته باشیم.
    این کار باعث می‌شود دیگر نیاز نباشد برای هر گزینه یک متغیر جدا بسازیم.

۲. پیام خوش‌آمد به کاربر

println("به بازی سنگ کاغذ قیچی خوش آمدید!")
  • println() یعنی چاپ یک جمله یا مقدار روی صفحه کنسول.

۳. حلقه بی‌نهایت (Infinite Loop)

while (true) {
    ...
}
  • حلقه چیست؟
    حلقه یا Loop، بخش مهمی از برنامه‌نویسی است که باعث می‌شود دستورات برنامه چند بار تکرار شوند.
    اینجا شرط حلقه true است، پس تا زمانی که داخلش با break قطع نشود، همیشه اجرا می‌شود.

۴. گرفتن ورودی از کاربر (readln())

val userSelection = readln()
  • این دستور، مقدار وارد شده توسط کاربر را از کنسول دریافت و داخل متغیر userSelection ذخیره می‌کند.

۵. شرط خروج از بازی (if ... break)

if (userSelection == "تموم") {
    break
}
  • اگر کاربر "تموم" را وارد کند، با دستور break از حلقه خارج می‌شود (یعنی بازی پایان می‌پذیرد).

۶. اعتبارسنجی ورودی کاربر

if (userSelection !in options) {
    println("انتخابت اشتباهه")
    continue
}
  • شرط !in بررسی می‌کند آیا ورودی کاربر جزو لیست options هست یا نه.
  • اگر اشتباه باشد پیام خطا چاپ می‌شود و با continue، این دور از حلقه رد می‌شود و برنامه دوباره از کاربر ورودی می‌خواهد.

۷. انتخاب تصادفی کامپیوتر (.random())

val cpuSelection = options.random()
  • با استفاده از تابع .random() یکی از اعضای لیست به صورت شانسی انتخاب می‌شود و در متغیر cpuSelection قرار می‌گیرد.

۸. منطق داوری بازی (if...else)

if (cpuSelection == userSelection) {
    println("مساوی شدین!")
} else if ((userSelection == "قیچی" && cpuSelection == "کاغذ")
    || (userSelection == "سنگ" && cpuSelection == "قیچی")
    || (userSelection == "کاغذ" && cpuSelection == "سنگ")
) {
    println("هورا بردی!")
} else {
    println("متاسفانه باختی")
}
  • اگر انتخاب کاربر و کامپیوتر یکی باشد → مساوی.
  • اگر انتخاب کاربر برنده باشد → پیام برنده.
  • در غیر این صورت → پیام باخت.

۹. خط جداکننده برای دورهای بعدی

println("-------------------------------------------")
println()
  • فقط برای زیبایی خروجی و راحت‌تر شدن مشاهده نتیجه هر دور.

تعریف مفاهیم اصلی به زبان ساده

  • لیست:
    مجموعه‌ای از داده‌ها مثل یک صندوقچه، که می‌توانید هر نوع داده‌ (متن، عدد و…) داخلش ذخیره کنید.

  • حلقه:
    بخشی از برنامه که بارها تکرار می‌شود، تا زمانی که یک شرط برقرار است یا تا زمانی که متوقفش کنیم (مثلاً کاربر پایان بازی را اعلان کند).

  • شرط (if/else):
    روشی برای کنترل مسیر اجرا؛ یعنی اگر یک حالت خاص اتفاق افتاد کاری انجام شود، و اگر حالت دیگر اتفاق افتاد، کار دیگری انجام شود.

  • دریافت داده از کاربر:
    برای تعامل با کاربر، مقدار وارد شده توسط او را با readln() می‌گیریم و بررسی می‌کنیم.


تمرین و چالش (برای دانشجوها)

  1. اضافه کردن شمارنده امتیاز برای کاربر و کامپیوتر.
  2. به جای بازی بی‌نهایت، بازی را بعد از رسیدن به ۳ برد یکی از طرفین تمام کنید.
  3. اگر کاربر اشتباه تایپ کرد (مثلاً "سنگ " با فاصله)، با دستور .trim() ورودی را اصلاح کنید و اعتبارسنجی انجام دهید.

جمع‌بندی

این پروژه تمرینی باعث می‌شود:

  • مفاهیم لیست، حلقه، شرط، و دریافت ورودی را به صورت عملی بفهمید و تجربه کدنویسی داشته باشید.

Description
No description provided
Readme 26 KiB