游戏介绍
这个迷宫探险游戏有以下功能:
-
探险:选择该选项后,玩家会进入地下迷宫进行探险。在随机事件中,可能会遇到陷阱、发现金币或者什么都没有发生。陷阱会使玩家失去一定的生命值,金币可以增加玩家的金币数量。
-
休息:选择该选项后,玩家可以休息一会儿。在休息过程中,有50%的概率会丢失随机数量的金币。而体力值将会回复15点,但不超过上限100。
-
查看背包:选择该选项后,玩家可以查看背包中的道具。当前游戏中有三种道具:能量药水、地图和食物。能量药水可以增加20点体力值,地图可以指示方向,而食物则可以增加10点生命值。
-
结束游戏:选择该选项后,游戏将会结束。
玩家需要通过探险获得足够的金币(100个)以及保持生命值大于0才能获得胜利。如果生命值降到0或者选择结束游戏,则游戏失败。
游戏示例
运用的知识点如下:
-
结构体:使用了结构体player来表示玩家的状态,包括生命值、体力值和金币数量。
-
typedef:使用typedef为结构体类型player定义别名Player,方便在代码中使用。
-
随机数:使用srand函数设置随机种子。然后使用rand函数生成随机数,用于产生随机事件、陷阱伤害、金币奖励等。
-
条件语句:使用if-else语句根据不同的条件执行相应的操作,例如判断玩家的选择、判断随机事件类型等。
-
循环语句:使用while循环控制游戏的进行,直到玩家的生命值小于等于0或金币数量达到200时结束游戏。
-
指针:使用指针作为函数参数,通过指针修改玩家的状态。
-
数组:使用数组items来表示玩家的背包道具,下标对应道具编号-1,数组元素表示道具数量。
-
函数:定义了多个函数来实现不同的功能,如探险、休息、查看背包、使用道具等。
-
switch语句:根据玩家的选择执行不同的操作。
-
类型转换:使用int类型将字符转换为整数,例如将用户输入的选择转换为整数
结构体定义
struct player {
int health; // 欢乐值
int stamina; // 体力值
int gold; // 金币
};
typedef struct player Player;
int items[3] = {0}; // 道具数组,下标分别对应道具编号-1
函数声明
void inif(Player* p);//初始化
void explore(Player* p);//收集
void rest(Player* p);//休息
void view_inventory(Player* p);//查看背包
void use_item(Player* p, int index);//使用道具
void use_item1(Player* p);//能量药水
void use_item2(Player* p);//地图
void use_item3(Player* p);//野果
void show_status(Player* p);//显示状态
void end_of_game(Player* p);//结束收集
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct player {
int health; // 欢乐值
int stamina; // 体力值
int gold; // 金币
};
typedef struct player Player;
int items[3] = {0}; // 道具数组,下标分别对应道具编号-1
void inif(Player* p);//初始化
void explore(Player* p);//收集
void rest(Player* p);//休息
void view_inventory(Player* p);//查看背包
void use_item(Player* p, int index);//使用道具
void use_item1(Player* p);//能量药水
void use_item2(Player* p);//地图
void use_item3(Player* p);//野果
void show_status(Player* p);//显示状态
void end_of_game(Player* p);//结束收集
int main() {
srand(time(NULL)); // 每次运行产生不同的随机种子
Player player;
// 初始化玩家状态
inif(&player);
printf("欢迎进行迷宫探险之旅!\n");
while (player.health > 0 && player.gold < 100) {
printf("\n-----------------------------------\n");
printf("你现在的状态:\n");
show_status(&player);
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
explore(&player); // 进行探险
break;
case 2:
rest(&player); // 休息
break;
case 3:
view_inventory(&player); // 查看背包中的道具
break;
case 4:
end_of_game(&player);
return 0;
default:
printf("无效选项,请重新输入。\n");
}
}
if (player.health <= 0) {
printf("\n你精疲力尽!收集失败...\n");
} else {
printf("\n你拥有%d个金币,有足够的信心离开迷宫。收集成功!\n", player.gold);
}
return 0;
}
void inif(Player* p){
p->health = 100;
p->stamina = 100;
p->gold = 0;
}
void explore(Player* p) {
if(p->stamina<=0)
{
printf("\n体力过低请补充体力...\n");
return;
}
printf("\n你开始了收集之旅...\n");
int random_event = (rand() % 10) + 1; // 随机事件
if (random_event < 3 && p->health > 0 && p->stamina >= 15) { // 遇到陷阱
p->stamina -= 15;
int damage = rand() % 31 + 10; // 随机减少10-20点生命值
printf("你踩到了陷阱,失去了%d点欢乐值\n", damage);
p->health -= damage;
} else if (random_event < 6 && p->health > 0 && p->stamina >= 10) { // 发现金币
p->stamina -= 10;
int gold = rand() % 36 + 5; // 随机获得金币
printf("你发现了%d个金币\n", gold);
p->gold += gold;
}else if(random_event < 9){
if(random_event==6){
p->stamina -=5;
printf("你获得了能量药水\n");
items[0]++;
}else if(random_event==7){
p->stamina -=5;
printf("你获得了地图\n");
items[1]++;
}else {
p->stamina -=5;
printf("你获得了野果\n");
items[2]++;
}
}else { // 什么都没发生,但是消耗体力值
p->stamina -= 5;
printf("你在迷宫徘徊...\n");
}
}
void show_status(Player* p) {
printf("\n体力:%d,欢乐值:%d,金币:%d\n\n", p->stamina, p->health, p->gold);
printf("请选择下一步操作:\n");
printf("1. 收集\n");
printf("2. 休息\n");
printf("3. 查看背包\n");
printf("4. 结束收集\n");
}
void rest(Player* p) {
printf("\n你决定休息一会儿...\n");
int lost_gold = rand() % 6; // 50% 的概率丢失随机数量的金币
if (lost_gold < 3 && p->gold > 0) {
int gold_loss = rand() % (p->gold + 1); // 丢失随机数量的金币
printf("你在休息过程中丢失了%d个金币\n", gold_loss);
p->gold -= gold_loss;
}
p->stamina += 15; // 回复15点体力值
if (p->stamina > 100) {
p->stamina = 100;
}
}
void view_inventory(Player* p) {
printf("\n你打开了背包...\n");
for (int i = 0; i < 3; i++) {
if (items[i] > 0) {
switch (i+1) {
case 1:
printf("1. 能量药水(增加20点体力):%d\n", items[0]);
break;
case 2:
printf("2. 地图(告诉你方向):%d\n", items[1]);
break;
case 3:
printf("3. 野果(增加10点欢乐值):%d\n", items[2]);
break;
}
} else {
switch (i+1) {
case 1:
printf("1. 能量药水(增加20点体力):0\n");
break;
case 2:
printf("2. 地图(告诉你方向):0\n");
break;
case 3:
printf("3. 野果(增加10点欢乐值):0\n");
break;
}
}
}
printf("\n请选择要使用的道具,或者输入其他选项返回游戏:\n");
int choice;
scanf("%d", &choice);
if (choice != 1 && choice != 2 && choice != 3) {
printf("\n你选择了返回游戏。\n");
return;
}
use_item(p,choice);
}
void use_item(Player* p, int index) {
if (items[index-1] <= 0) { // 没有该道具
printf("\n你没有这个道具!\n");
return;
}
switch (index) {
case 1:
use_item1(p);
break;
case 2:
use_item2(p);
break;
case 3:
use_item3(p);
break;
default:
printf("\n该选项无效!\n");
}
}
void end_of_game(Player* p) {
printf("\n游戏结束...\n");
printf("你的最终状态为:\n");
printf("体力:%d,欢乐值:%d,金币:%d\n", p->stamina, p->health, p->gold);
if (p->health <= 0) {
printf("你已经死亡!\n");
}
else if (p->gold >= 100) {
printf("你找到了100枚个金币,收集成功!\n");
}
else {
printf("你没有找到足够的金币,收集失败!\n");
}
}
void use_item1(Player* p){
if (p->stamina == 100) { // 体力值已满
printf("\n你现在的体力已经是满的了!\n");
return;
}
p->stamina += 20; // 增加20点体力值
if (p->stamina > 100) { // 不超过上限100
p->stamina = 100;
}
printf("\n你使用了一瓶能量药水,增加了20点体力值!\n");
items[0]--;
}
void use_item2(Player* p){
printf("\n你打开了地图,发现...还需要继续收集才能找到金币。\n");
items[1]--;
}
void use_item3(Player* p){
if (p->health == 100) { // 生命值已满
printf("\n你现在的欢乐值已经是满的了!\n");
return;
}
p->health += 10; // 增加10点生命值
if (p->health > 100) { // 不超过上限100
p->health = 100;
}
printf("\n你食用了一份美味佳肴,增加了10点欢乐值!\n");
items[2]--;
}