一個綜合的游戲,對所學的知識進行整合!融會貫通!
#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;
}

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