c語言實現皇帝翻牌游戲


一個綜合的游戲,對所學的知識進行整合!融會貫通!

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 支持字符串操作
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define MAX 6 // 最大的妃子數量
int main()
{
    // 項請目實踐之陛下翻牌
    // 播放音樂
    PlaySound(TEXT("sounds\\背景音樂.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);


    // 8個字符能存放4個漢字
    char tempName[20];
    // 定義二維數組來存放妃子
    char names[MAX][20] = {"西施","貂蟬","王昭君","楊玉環","趙飛燕"};

    // 定義二維數組來存放妃子等級
    char levelNames[5][8] = {"貴人","嬪妃","貴妃","皇貴妃","皇后"};

    // 存放每個妃子的等級
    int levels[MAX] = {0,0,2,0,0,-1};

    // 用來存放每個妃子的好感度
    int loves[MAX] = {100,100,100,100,100,-1};

    int i,j,temp; // 用於冒泡排序
    int count = 5; // 當前未被打入冷宮的妃子數量
    int day = 1; // 第幾天

    /*
    printf("測試代碼:查看當前嬪妃的狀態\n");
    printf("%-12s級別\t好感度\n","姓名");
    for (i = 0;i <count;i++) {
        printf("%-12s%s\t%d\n",names[i],levelNames[levels[i]],loves[i]);
    }
    */

    // 皇帝的名號
    char emperorName[50];
    // 皇帝的選擇
    int choice;

    int selectIndex; // 選擇的妃子的index

    // 使用字符數組表示字符串
    printf("請輸入當前登基的皇帝名號:");

    scanf("%s",emperorName); // 錄入字符串
    printf("當前皇帝是【%s】,萬歲萬歲萬萬歲!\n",emperorName);


    while (day <= 10) {
        printf("******************************************************\n");
        printf("第%d天\n",day);
        day++;

        // 做出菜單
        printf("1.皇帝下旨選妃\t\t (增加)\n");

        printf("2.翻牌寵幸 \t\t (修改狀態)\n");

        printf("3.打入冷宮 \t\t (刪除)\n");

        printf("4.召見愛妃去談心 \n");

        printf("陛下請選擇: \n");


        scanf("%d",&choice);

        switch(choice) {
            case 1: // 1.皇帝下旨選妃\t\t (增加)\n
                PlaySound(TEXT("sounds\\選妃.wav"),NULL,SND_FILENAME | SND_ASYNC);

                if (count < MAX) {
                    // 執行添加操作
                    printf("請輸入娘娘的名諱:");
                    scanf("%s",names[count]);
                    // 初始化狀態
                    levels[count] = 0;
                    loves[count]  = 100;

                    count++;

                } else {
                    printf("陛下要注意龍體啊,后宮已經人滿為患!\n");
                }


                break;

            case 2: // 2.翻牌寵幸 \t\t (修改狀態)\n
                PlaySound(TEXT("sounds\\翻牌.wav"),NULL,SND_FILENAME | SND_ASYNC);
                // 1. 找到妃子
                // 2. 修改妃子狀態 好感度+10 級別升1級 最高級不再升
                // 3. 修改其他妃子的狀態 其他妃子 好感度 -10
                printf("陛下請輸入今天要翻牌的妃子:");
                scanf("%s",tempName);

                selectIndex = -1;

                // strcmp(tempName,"abc") 0表示兩個字符串相等,1表示前一個大於后一個,-1表示前一個小於后一個
                for (i = 0;i<count ;i++) {
                    if (strcmp(tempName,names[i]) == 0) {
                        selectIndex = i;
                        break;
                    }
                }

                if (selectIndex == -1) {
                    printf("皇上,這個妃子不存在啊!\n");
                    break;
                }

                // 更改選中人的狀態
                if (levels[selectIndex] < 4) {
                    levels[selectIndex] += 1;
                }
                loves[selectIndex]  += 10;

                // 更改其他妃子的狀態
                for (i = 0;i<count ;i++) {
                    if (i != selectIndex) {
                        loves[i]  -= 10;
                    }
                }


                break;


            case 3: // 3.打入冷宮 \t\t (刪除)\n
                PlaySound(TEXT("sounds\\冷宮.wav"),NULL,SND_FILENAME | SND_ASYNC);
                // 1.查找
                // 2.后面一個賦給前面一個
                // 3.總數--
                printf("請輸入需要打入冷宮的妃子姓名:");
                scanf("%s",tempName);

                selectIndex = -1;

                // strcmp(tempName,"abc") 0表示兩個字符串相等,1表示前一個大於后一個,-1表示前一個小於后一個
                for (i = 0;i<count ;i++) {
                    if (strcmp(tempName,names[i]) == 0) {
                        selectIndex = i;
                        break;
                    }
                }

                if (selectIndex == -1) {
                    printf("皇上,這個妃子不存在啊!\n");
                    break;
                }

                for (i = selectIndex ; i<count - 1;i++) {
                    // names[i] = names[i + 1]; C語言中不支持數組的直接賦值,字符串在C語言中就是數組
                    strcpy(names[i],names[i+1]);
                    loves[i] = loves[i + 1];
                    levels[i] = levels[i + 1];
                }
                count-- ;

                break;


            case 4: // 4.召見愛妃去談心 \n
                PlaySound(TEXT("sounds\\一笑傾城.wav"),NULL,SND_FILENAME | SND_ASYNC);

                printf("請輸入需要單獨約見的妃子姓名:");
                scanf("%s",tempName);

                selectIndex = -1;

                // strcmp(tempName,"abc") 0表示兩個字符串相等,1表示前一個大於后一個,-1表示前一個小於后一個
                for (i = 0;i<count ;i++) {
                    if (strcmp(tempName,names[i]) == 0) {
                        selectIndex = i;
                        loves[i] += 10;
                        break;
                    }
                }

                if (selectIndex == -1) {
                    printf("皇上,這個妃子不存在啊!\n");
                    break;
                }

                break;

            default:
                printf("君無戲言,陛下請再次確認!\n");
                break;

        }

        // 播放背景音樂
        PlaySound(TEXT("sounds\\背景音樂.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);

        // 按照級別進行排序,使用冒泡排序
        for (i = 0;i<count-1;i++) {
            for ( j = 0;j< count - i - 1;j++) {
                if (levels[j] < levels[j+1]) { // 交換
                    temp = levels[j];
                    levels[j] = levels[j+1];
                    levels[j+1] = temp;

                    temp = loves[j];
                    loves[j] = loves[j+1];
                    loves[j+1] = temp;

                    strcpy(tempName,names[j]);
                    strcpy(names[j],names[j+1]);
                    strcpy(names[j+1],tempName);
                }
            }
        }

        printf("當前后宮人員狀態\n");
        printf("%-12s級別\t好感度\n","姓名");
        for (i = 0;i <count;i++) {
            printf("%-12s%s\t%d\n",names[i],levelNames[levels[i]],loves[i]);
        }

        for (i = 0;i <count ;i++) {
            if (loves[i] < 60) {
                printf("皇上,有妃子被冷落了,生了殺意。游戲失敗。\n");

                // 跳轉到over的位置
                goto over;
            }
        }


    }


    printf("恭喜你,贏了!\n");

    over:


    return 0;
}

通過這個小游戲,感悟循環,數組,變量,輸入輸出,冒泡排序等綜合知識的運用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM