C 语言学习记录-实战篇-1

代码实战-皇帝后宫小游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //支持字符串操作
#define MAX 6 //常量MAX表示贵妃最大的数量
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "Winmm.Lib")
int main()
{
//使用字符数组表示字符串
char emperorName[50]; //皇帝的名号
int choice; //皇帝的选择1-4
int i,j,k = 0; //循环变量
int count = 5; //当前未打入冷宫的嫔妃数
char temp[20]; //用来存放临时字符串的数组
int searchIndex = -1; //用来存放超找到元素的下标
int replace; //临时整型变量
//嫔妃的姓名数组
char names[MAX][20] = {"貂蝉", "杨玉环", "不知火舞", "西施", "白晶晶"};
//嫔妃的级别数组
char levelNames[5][10] = {"贵人", "嫔妃", "贵妃", "皇贵妃", "皇后"};
//用来存放每个妃子的级别,每个数组元素对应每个妃子的级别
int levels[MAX] = {1, 2, 0, 0, 0, -1};
//loves数组中的每个元素对应每个人的好感度
int loves[MAX] = {100, 100, 100, 100, 100, -1};
PlaySound(TEXT("sounds\\背景音乐.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
printf("这是一个模拟皇帝管理后宫的游戏。\n");
printf("游戏开始后你将变成一位拥有五位妃子的皇帝,\n");
printf("你可以按照提示增添、宠幸、删除、召见妃子,\n");
printf("每当你做出不同的动作时妃子们的地位和好感度也会有所变化,\n");
printf("而当你的妃子中任意一位或以上妃子好感度降低到60以下时,\n");
printf("你的皇帝生涯也就会随之结束,\n");
printf("如果你能坚持十天,那么恭喜你你将会获得胜利!\n");
printf("下面开始你的皇帝之行吧。\n");
printf("请输入当前登记皇帝的名号:");
scanf("%s", emperorName); //录入字符串时不需要&
printf("\n**************************************************\n");
printf("** **\n");
printf("** 皇帝【%s】登基,吾皇万岁万岁万万岁 **\n", emperorName);
printf("** **\n");
printf("**************************************************\n");
printf("\n");
while(k < 10)
{
printf("吾皇【%s】登基第%d天!\n", emperorName, k + 1);
printf("当前您的后宫情况\n");
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]);
}
printf("**************************************************\n");
printf("\n");
printf("请问吾皇您要做些什么?\n");
printf("1、下旨选妃!\t\t(增加功能)\n");
printf("2、翻牌宠幸!\t\t(修改状态功能)\n");
printf("3、打入冷宫!\t\t(删除功能)\n");
printf("4、召见爱妃!\t\t(平衡功能)\n");
printf("陛下请选择:");
scanf("%d", &choice);
switch(choice)
{
case 1:
//选妃
//1、增加数组元素(names\loves\levels)
//2、增加前判断有没有足够的空间
PlaySound(TEXT("sounds\\选妃.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
if(count < MAX)//如果现存妃子数小于系统允许最大值
{
printf("请输入娘娘的名讳:");
scanf("%s", names[count]);
//将第count个元素的状态初始化
levels[count] = 0; //等级初始化
loves[count] = 100; //好感度初始化
for(i = 0; i < count; i++)
{
loves[i] -= 10;
}
count++; //添加完元素后增加计数器
}
else
{
printf("陛下要保重龙体呀,后宫已经人满为患了!\n添加失败!\n");
}
break;
case 2:
//宠幸
//1、找到要宠幸的妃子
//2、修改这个妃子的状态(好感度+10、级别升一级若最高级则不升级)
//3、修改其他妃子的状态(好感度-10)
PlaySound(TEXT("sounds\\翻牌.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
printf("陛下,请输入要宠幸娘娘的名讳:");
scanf("%s", temp);
while(1)
{
for(i = 0; i < count; i++)
{
if(strcmp(temp, names[i]) == 0)
{
//字符串的查找strcmp,需要引入<string.h>头文件
//strcmp(char1, char2) 0-两个字符串相等 1-前一个大于后一个 -1-前一个小于后一个
for(i = 0; i < count; i++)
{
if(strcmp(temp, names[i]) == 0) //筛选出这个妃子
{
loves[i] += 10;
//注意级别不要超过最大级
levels[i] = levels[i] >= 4 ? 4 : levels[i] + 1; //三元运算符
}
else
{
loves[i] -= 10;
}
}
}
}
if(i == count)
{
printf("陛下,这个娘娘不存在,请再输入一次:");
scanf("%s", temp);
continue;
}
else
{
break;
}
}
break;
case 3:
//删除
//1、查找
//2、从要删除的那个开始后面的值付给前面的值
//3、总数减一
//4、修改其他妃子的状态
PlaySound(TEXT("sounds\\冷宫.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
printf("陛下,请输入要打入冷宫的妃子的名讳:");
scanf("%s", temp);
for(i = 0; i < count; i++)
{
if(strcmp(temp, names[i]) == 0) //验证输入的妃子姓名是否存在
{
//记录下标
searchIndex = i;
break;
}
}
if(-1 == searchIndex) //如果searchIndex仍然为初值,表示没找到
{
printf("\n**************************************************\n");
printf("虚惊一场,无人打入冷宫,该吃吃该喝喝。\n");
printf("**************************************************\n");
}
else
{
for(i = searchIndex; i < count -1; i++)
{
// names[i] = names[i + 1];因为是字符串,C语言不支持数组直接赋值
//需要使用strcpy函数实现数组的复制
strcpy(names[i], names[i + 1]);
loves[i] = loves[i + 1];
levels[i] = levels[i + 1];
}
count--;
for(i = 0; i < count; i++)
{
loves[i] += 10;
}
}
break;
case 4:
//召见
//1、查找要召见的妃子
//2、找到后增加好感度
PlaySound(TEXT("sounds\\一笑倾城.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
printf("陛下,请输入您要召见的娘娘的名讳:");
scanf("%s", temp);
while(1)
{
for(i = 0; i < count; i++) //判断输入的娘娘是不是存在
{
if(strcmp(temp, names[i]) == 0) //如果存在
{
for(i = 0; i < count; i++) //找到那个娘娘增加好感度和等级
{
if(strcmp(temp, names[i]) == 0)
{
loves[i] += 10;
levels[i] += 1;
}
}
}
}
if(i == count) //如果不存在,重新输入
{
printf("陛下,这个娘娘不存在,请再输入一次:");
scanf("%s", temp);
continue;
}
else
{
break;
}
}
break;
default:
printf("君无戏言,陛下请再次确认!\n");
}
for(i = 0; i < count; i++) //判断是否存在妃子好感度小于60
{
if(loves[i] < 60)
{
printf("后宫暴动,皇帝%s昏庸无能被迫下台!\n", emperorName);
//最后打印所有妃子状态前,以级别进行排序,使用冒泡排序
for(i = 0; i < count - 1; i++) //外层控制轮数
{
for(j = 0; j < count - i - 1; j++) //内存循环控制
{
//从大到小,
if(levels[j] < levels[j + 1])
{
//需要交换姓名、级别和好感度
replace = levels[j];
levels[j] = levels[j +1];
levels[j + 1] = replace;
replace = loves[j];
loves[j] = loves[j + 1];
loves[j +1] = replace;
//注意字符串的交换
strcpy(temp, names[j]);
strcpy(names[j], names[j + 1]);
strcpy(names[j + 1], temp);
}
}
}
printf("\n**************************************************\n");
printf("游戏结束,皇帝%s共执政%d天\n", emperorName, k+1);
printf("%-12s级别\t好感度\n", "姓名");
for(i = 0; i < count; i++)
{
printf("%-12s%s\t%d\n", names[i], levelNames[levels[i]], loves[i]);
}
printf("**************************************************\n");
exit(0);
}
}
k++;
}
//游戏结束
for(i = 0; i < count - 1; i++) //外层控制轮数
{
for(j = 0; j < count - i - 1; j++) //内存循环控制
{
//从大到小,
if(levels[j] < levels[j + 1])
{
//需要交换姓名、级别和好感度
replace = levels[j];
levels[j] = levels[j +1];
levels[j + 1] = replace;
replace = loves[j];
loves[j] = loves[j + 1];
loves[j +1] = replace;
//注意字符串的交换
strcpy(temp, names[j]);
strcpy(names[j], names[j + 1]);
strcpy(names[j + 1], temp);
}
}
}
printf("\n**************************************************\n");
printf("恭喜您获得胜利,皇帝%s共执政%d天\n", emperorName, k+1);
printf("%-12s级别\t好感度\n", "姓名");
for(i = 0; i < count; i++)
{
printf("%-12s%s\t%d\n", names[i], levelNames[levels[i]], loves[i]);
}
printf("**************************************************\n");
return 0;
}

用时两小时,跟随教学视频完成,已经简单的修复了基础bug,但代码仍然不完整,有待改善。