186 lines
7.4 KiB
Markdown
186 lines
7.4 KiB
Markdown
|
||
# بازی سنگ، کاغذ، قیچی
|
||
یک پروژه کلاس با کاتلین
|
||
|
||
---
|
||
|
||
## سناریوی کامل بازی
|
||
|
||
- کاربر وارد برنامه میشود.
|
||
- یک پیام خوشآمد نشان داده میشود.
|
||
- برنامه از کاربر میخواهد یکی از گزینهها ("سنگ"، "کاغذ"، "قیچی") را انتخاب کند.
|
||
- اگر کاربر عبارت "تموم" را وارد کند، بازی تمام میشود و برنامه بسته میشود.
|
||
- اگر کاربر اشتباهی وارد کند (مثلاً "آب"، "کفش") پیام خطا نمایش داده میشود و دوباره ورودی میخواهد.
|
||
- برنامه به صورت تصادفی یکی از گزینهها را برای کامپیوتر انتخاب میکند.
|
||
- برنامه نتیجه هر دور را نمایش میدهد ("مساوی شدین!" یا "هورا بردی!" یا "متاسفانه باختی").
|
||
- سپس بازی برای دور بعدی آماده میشود.
|
||
|
||
---
|
||
|
||
## کد کامل برنامه
|
||
|
||
```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()` ورودی را اصلاح کنید و اعتبارسنجی انجام دهید.
|
||
|
||
---
|
||
|
||
## جمعبندی
|
||
|
||
این پروژه تمرینی باعث میشود:
|
||
- مفاهیم **لیست**، **حلقه**، **شرط**، و **دریافت ورودی** را به صورت عملی بفهمید و تجربه کدنویسی داشته باشید.
|
||
|
||
---
|