Add readme.md

This commit is contained in:
2026-05-03 08:09:26 +00:00
commit b9a3af59a9

185
readme.md Normal file
View File

@@ -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()` ورودی را اصلاح کنید و اعتبارسنجی انجام دهید.
---
## جمع‌بندی
این پروژه تمرینی باعث می‌شود:
- مفاهیم **لیست**، **حلقه**، **شرط**، و **دریافت ورودی** را به صورت عملی بفهمید و تجربه کدنویسی داشته باشید.
---