# بازی سنگ، کاغذ، قیچی یک پروژه کلاس با کاتلین --- ## سناریوی کامل بازی - کاربر وارد برنامه می‌شود. - یک پیام خوش‌آمد نشان داده می‌شود. - برنامه از کاربر می‌خواهد یکی از گزینه‌ها ("سنگ"، "کاغذ"، "قیچی") را انتخاب کند. - اگر کاربر عبارت "تموم" را وارد کند، بازی تمام می‌شود و برنامه بسته می‌شود. - اگر کاربر اشتباهی وارد کند (مثلاً "آب"، "کفش") پیام خطا نمایش داده می‌شود و دوباره ورودی می‌خواهد. - برنامه به صورت تصادفی یکی از گزینه‌ها را برای کامپیوتر انتخاب می‌کند. - برنامه نتیجه هر دور را نمایش می‌دهد ("مساوی شدین!" یا "هورا بردی!" یا "متاسفانه باختی"). - سپس بازی برای دور بعدی آماده می‌شود. --- ## کد کامل برنامه ```kotlin 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/لیست) ```kotlin val options = listOf("سنگ", "کاغذ", "قیچی") ``` - **لیست چیست؟** لیست یک نوع آرایه در کاتلین است، یعنی یک مجموعهٔ داده که چند مقدار رو کنار هم نگه می‌داره. هر مقدار (اینجا "سنگ"، "کاغذ"، "قیچی") در یک سلول قرار گرفته و هر بار می‌توانیم با اسم لیست بهش دسترسی داشته باشیم. این کار باعث می‌شود دیگر نیاز نباشد برای هر گزینه یک متغیر جدا بسازیم. --- ### ۲. پیام خوش‌آمد به کاربر ```kotlin println("به بازی سنگ کاغذ قیچی خوش آمدید!") ``` - `println()` یعنی چاپ یک جمله یا مقدار روی صفحه کنسول. --- ### ۳. حلقه بی‌نهایت (Infinite Loop) ```kotlin while (true) { ... } ``` - **حلقه چیست؟** حلقه یا Loop، بخش مهمی از برنامه‌نویسی است که باعث می‌شود دستورات برنامه چند بار تکرار شوند. اینجا شرط حلقه `true` است، پس تا زمانی که داخلش با `break` قطع نشود، همیشه اجرا می‌شود. --- ### ۴. گرفتن ورودی از کاربر (`readln()`) ```kotlin val userSelection = readln() ``` - این دستور، مقدار وارد شده توسط کاربر را از کنسول دریافت و داخل متغیر `userSelection` ذخیره می‌کند. --- ### ۵. شرط خروج از بازی (`if ... break`) ```kotlin if (userSelection == "تموم") { break } ``` - اگر کاربر "تموم" را وارد کند، با دستور `break` از حلقه خارج می‌شود (یعنی بازی پایان می‌پذیرد). --- ### ۶. اعتبارسنجی ورودی کاربر ```kotlin if (userSelection !in options) { println("انتخابت اشتباهه") continue } ``` - شرط `!in` بررسی می‌کند آیا ورودی کاربر جزو لیست `options`‌ هست یا نه. - اگر اشتباه باشد پیام خطا چاپ می‌شود و با `continue`، این دور از حلقه رد می‌شود و برنامه دوباره از کاربر ورودی می‌خواهد. --- ### ۷. انتخاب تصادفی کامپیوتر (`.random()`) ```kotlin val cpuSelection = options.random() ``` - با استفاده از تابع `.random()` یکی از اعضای لیست به صورت شانسی انتخاب می‌شود و در متغیر `cpuSelection` قرار می‌گیرد. --- ### ۸. منطق داوری بازی (`if...else`) ```kotlin if (cpuSelection == userSelection) { println("مساوی شدین!") } else if ((userSelection == "قیچی" && cpuSelection == "کاغذ") || (userSelection == "سنگ" && cpuSelection == "قیچی") || (userSelection == "کاغذ" && cpuSelection == "سنگ") ) { println("هورا بردی!") } else { println("متاسفانه باختی") } ``` - اگر انتخاب کاربر و کامپیوتر یکی باشد → مساوی. - اگر انتخاب کاربر برنده باشد → پیام برنده. - در غیر این صورت → پیام باخت. --- ### ۹. خط جداکننده برای دورهای بعدی ```kotlin println("-------------------------------------------") println() ``` - فقط برای زیبایی خروجی و راحت‌تر شدن مشاهده نتیجه هر دور. --- ## تعریف مفاهیم اصلی به زبان ساده - **لیست:** مجموعه‌ای از داده‌ها مثل یک صندوقچه، که می‌توانید هر نوع داده‌ (متن، عدد و…) داخلش ذخیره کنید. - **حلقه:** بخشی از برنامه که بارها تکرار می‌شود، تا زمانی که یک شرط برقرار است یا تا زمانی که متوقفش کنیم (مثلاً کاربر پایان بازی را اعلان کند). - **شرط (if/else):** روشی برای کنترل مسیر اجرا؛ یعنی اگر یک حالت خاص اتفاق افتاد کاری انجام شود، و اگر حالت دیگر اتفاق افتاد، کار دیگری انجام شود. - **دریافت داده از کاربر:** برای تعامل با کاربر، مقدار وارد شده توسط او را با `readln()` می‌گیریم و بررسی می‌کنیم. --- ## تمرین و چالش (برای دانشجوها) 1. اضافه کردن شمارنده امتیاز برای کاربر و کامپیوتر. 2. به جای بازی بی‌نهایت، بازی را بعد از رسیدن به ۳ برد یکی از طرفین تمام کنید. 3. اگر کاربر اشتباه تایپ کرد (مثلاً "سنگ " با فاصله)، با دستور `.trim()` ورودی را اصلاح کنید و اعتبارسنجی انجام دهید. --- ## جمع‌بندی این پروژه تمرینی باعث می‌شود: - مفاهیم **لیست**، **حلقه**، **شرط**، و **دریافت ورودی** را به صورت عملی بفهمید و تجربه کدنویسی داشته باشید. ---