commit b9a3af59a9131a493ed8e66c957ea5e16109e8b1 Author: Saeid Yousefi Date: Sun May 3 08:09:26 2026 +0000 Add readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..9efdda9 --- /dev/null +++ b/readme.md @@ -0,0 +1,185 @@ + +# بازی سنگ، کاغذ، قیچی +یک پروژه کلاس با کاتلین + +--- + +## سناریوی کامل بازی + +- کاربر وارد برنامه می‌شود. +- یک پیام خوش‌آمد نشان داده می‌شود. +- برنامه از کاربر می‌خواهد یکی از گزینه‌ها ("سنگ"، "کاغذ"، "قیچی") را انتخاب کند. +- اگر کاربر عبارت "تموم" را وارد کند، بازی تمام می‌شود و برنامه بسته می‌شود. +- اگر کاربر اشتباهی وارد کند (مثلاً "آب"، "کفش") پیام خطا نمایش داده می‌شود و دوباره ورودی می‌خواهد. +- برنامه به صورت تصادفی یکی از گزینه‌ها را برای کامپیوتر انتخاب می‌کند. +- برنامه نتیجه هر دور را نمایش می‌دهد ("مساوی شدین!" یا "هورا بردی!" یا "متاسفانه باختی"). +- سپس بازی برای دور بعدی آماده می‌شود. + +--- + +## کد کامل برنامه + +```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()` ورودی را اصلاح کنید و اعتبارسنجی انجام دهید. + +--- + +## جمع‌بندی + +این پروژه تمرینی باعث می‌شود: +- مفاهیم **لیست**، **حلقه**، **شرط**، و **دریافت ورودی** را به صورت عملی بفهمید و تجربه کدنویسی داشته باشید. + +---