飞道的博客

C语言项目-后宫选妃系统-第三天-终结

401人阅读  评论(0)

因为疫情只能在家看网课,学了几天C语言之后,就打算找个项目来,今天是做这个项目的第三天,想要看之前的内容可以到我同一个专栏去找

项目:后宫选妃系统

六大模块:

1.下旨选妃 -完成
    输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
2.翻牌宠幸-完成
    输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
3.打入冷宫-完成
    输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
4.朕的爱妃呢-完成
    查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
5.巡视后宫-完成
    巡视后宫,显示所有在宫妃子信息
6.游戏规则判定-完成
	1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
    2.若有人宠爱度达到100,镇压后宫,游戏结束

第三天,今天基本把合格项目做完了,为什么说是基本,因为还是有一些小问题需要处理,好了,废话少说,今天遇到的坑和留下的问题都会放在下面的,完整代码在最后

1.游戏规则判定

其实这个判定模块总共只写了10分钟,非常快,下面是代码,两个函数,一个函数判定一条规则,然后将返回值进行与运算,传给最开始的while循环条件

//判定函数,失败返回0,否则1
//不放完整代码.需要最后看
int judege_1(concu *ptca, int *num);
int judege_2(concu *ptca, int *num);


int c, d; //控制,循环控制界面
while (d)//d是循环条件
{....
	switch{}
	d = judege_1(p, num) && judege_2(p, num);//!!!关键
	if (d == 0)
	{
	     printf("后宫暴动,游戏失败!");
	     printf("输入任意键以退出.....\n");
	     scanf("%d", &c);
	 }
 }

2.选妃时进行甄别,防止姓名重复

之前做的时候没有考虑到重复添加的问题,知道我自己无意间连续选了两个同名的"妃",才发现这个问题,我的方法是在选妃以及宠爱度增减的之前再加一层判断,如果发现同名,就直接退出这个函数,虽然有点繁琐,但是也没得办法
下面是实现代码

 for (int i = 0; i < n + 1; i++)
    {
        if (strcmp(p->name, ch) == 0)//P是一个数组指针 数组存储的是结构体
        {
            printf("皇上,%s已经在宫中了呢!\n", ch);
            return 0;//直接用return退出函数
        }
        p++;
    }
    
//判断是否在宫中
concu *p = ptca;
int a_count = 0; //不同名妃子计数器
for (int i = 0; i < n; i++)
{
   // printf("%s --- %s\n", p->name, a_name);
   if (strcmp(p->name, a_name) != 0)
     {
         a_count++;
      }
   // printf("%d\n", a_count);
   p++;
}
if (a_count == n)
  {
      printf(" %s 还不在宫中呢...\n", a_name);
      return 0;
  }

其实上面都是今天上午就做好的,但是一直有点烦恼,因为在解决问题的过程中发现如果要去修改的话要对之前的代码大动干戈在这个项目里还好我变量名用的统一,因此只是改了一下每个子函数的返回类型和添加了一个判断,可是自己感觉还是不满意,这个项目算上注释总共420行,不大也不小,但是逻辑还算简单,由此可见在进行中大型项目之前进行构思,伪代码实现多重要!!不要像我这样一头扑上来就写代码,也算是吃了教训了,继续加油!奥利给!

/*
后宫选妃系统
六大模块:
    1.下旨选妃 -完成
        输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
    2.翻牌宠幸-完成
        输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
    3.打入冷宫-完成
        输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
    4.朕的爱妃呢-完成
        查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
    5.巡视后宫-完成
        巡视后宫,显示所有在宫妃子信息
    6.游戏规则判定-未
妃子等级制(始皇制):
    一后
    三夫人
    九嫔
    二十七世妇
    八十一御女
游戏规则:1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
        2.若有人宠爱度达到100,镇压后宫,游戏结束
        3.每名妃子默认宠爱度70点
*/

#include <stdio.h>
#include <string.h>

typedef struct concubine
{
    char name[10];  //名字,最多十个字符
    int level;      //后宫等级
    int likability; //宠爱度
} concu;

//函数声明
int addOne(concu *ptca, int *num);
int chooseOne(concu *ptca, int *num);
int forsakeOne(concu *ptca, int *num);
int findOne(concu *ptca, int *num);
void seeAll(concu *ptca, int *num);
int judege_1(concu *ptca, int *num);
int judege_2(concu *ptca, int *num);

//   游戏规则判断计数器1   冷宫总人数
int count = 0, leave = 0; //初始化总比不初始化好

int main(void)
{
    //存储conu的(X可变长)数组
    concu concus[31];
    int n = 0, *num = &n; //存储后宫妃子总数,使用指针方便更改!数字指针定义时需要&取地址
    concu *p;

    //后宫初始化,默认有三位妃子
    concu c1 = {"刘解忧", 1, 70};
    concu c2 = {"孙尚香", 1, 70};
    concu c3 = {"鱼幼薇", 1, 70};
    concus[0] = c1;
    concus[1] = c2;
    concus[2] = c3;
    *num = 3;

    //选妃系统界面控制

    int c, d; //控制,循环控制界面
    while (d)
    {
        p = concus; //初始化指针
        printf("-------后宫选妃系统-------\n\
            四大模块:\n\
                1.下旨选妃\n\
                2.翻牌宠幸\n\
                3.打入冷宫\n\
                4.朕的爱妃呢\n\
                5.后宫巡视\n\
                6.退出选妃系统\n\
            请输入序号选择功能:\n");

        scanf("%d", &c);
        switch (c)
        {
        case 1:
            // printf("1\n");
            addOne(p, num); //函数1
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        case 2:
            // printf("2");
            chooseOne(p, num); //函数2
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        case 3:
            // printf("3");
            forsakeOne(p, num); //函数3
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        case 4:
            // printf("4");
            findOne(p, num); //函数4
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        case 5:
            // printf("5");
            seeAll(p, num); //函数5
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        case 6:
            printf("退出成功...\n");
            c = 0;
            break;
        default:
            printf("小主,查无此功能啊!\n");
            printf("输入任意键以继续.....\n");
            scanf("%d", &c);
            break;
        }

        d = judege_1(p, num) && judege_2(p, num);
        if (d == 0)
        {
            printf("后宫暴动,游戏失败!");
            printf("输入任意键以退出.....\n");
            scanf("%d", &c);
        }
    }
}

//1.下旨选妃-输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
int addOne(concu *ptca, int *num)
{
    //根据输入初始化一位妃子的信息
    char ch[10];
    int lev;
    printf("请输入妃子姓名,等级(1-5)(空号间隔):\n");
    scanf("%s %d", ch, &lev);
    concu c;
    strcpy(c.name, ch);
    c.level = lev;
    c.likability = 70;
    int n = *num; //临时数量控制器,操纵循环
    //使用遍历完成下旨选妃中的操作
    concu *p = ptca;
    for (int i = 0; i < n + 1; i++)
    {
        if (strcmp(p->name, ch) == 0)
        {
            printf("皇上,%s已经在宫中了呢!\n", ch);
            return 0;
        }
        p++;
    }
    for (int i = 0; i < n + 1; i++)
    {

        if (i < *num)
        {
            ptca->likability -= 10;
            ptca++;
        }
        else
        {
            *ptca = c;
            *num += 1; //总数加一
            printf("恭喜选妃成功;妃子信息:姓名:%s,等级:%d,宠爱度:%d\n", ptca->name, ptca->level, ptca->likability);
            // printf("当前后宫总人数:%d\n", *num);
        }
    }
}

//2.翻牌宠幸-输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
int chooseOne(concu *ptca, int *num)
{
    int n = *num; //临时变量,控制循环
    char a_name[10];

    //准备翻牌
    printf("皇上,可以翻牌了呢,输入想翻牌的妃子名字即可:\n");
    scanf("%s", a_name);
    // gets(name);
    // printf("1");
    // int i = 0;
    printf("当前即将被翻牌的妃子名称是 %s ...\n", a_name);

    //判断是否在宫中
    concu *p = ptca;
    int a_count = 0; //不同名妃子计数器
    for (int i = 0; i < n; i++)
    {
        // printf("%s --- %s\n", p->name, a_name);
        if (strcmp(p->name, a_name) != 0)
        {
            a_count++;
        }
        // printf("%d\n", a_count);
        p++;
    }
    if (a_count == n)
    {
        printf(" %s 还不在宫中呢...\n", a_name);
        return 0;
    }

    printf("\n");
    for (int i = 0; i < n; i++)
    {
        if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
        {
            ptca->likability += 10;
            printf(" %s 翻牌成功!\n", ptca->name);
        }
        else
        {
            ptca->likability -= 10;
            printf("后宫徒生嫉妒, %s 宠爱度减少10点!\n", ptca->name);
        }
        ptca++; //指针指向下一个结构体
    }
};

//3.打入冷宫-输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
int forsakeOne(concu *ptca, int *num)
{
    int n = *num; //临时变量,控制循环
    char a_name[10];
    concu c;
    strcpy(c.name, "0");
    c.level = 0;
    c.likability = 0;

    //准备翻牌
    printf("皇上,您要抛弃哪位妃子呢,输入妃子名字即可:\n");
    scanf("%s", a_name);
    // gets(name);
    // printf("1");
    int i = 0;
    printf("当前即将被即将被打入冷宫的妃子名称是 %s ...", a_name);

    //判断是否在宫中
    concu *p = ptca;
    int a_count = 0; //不同名妃子计数器
    for (int i = 0; i < n; i++)
    {
        // printf("%s --- %s\n", p->name, a_name);
        if (strcmp(p->name, a_name) != 0)
        {
            a_count++;
        }
        // printf("%d\n", a_count);
        p++;
    }
    if (a_count == n)
    {
        printf(" %s 还不在宫中呢...\n", a_name);
        return 0;
    }

    printf("\n");
    for (int i = 0; i < n; i++)
    {

        if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
        {
            *ptca = c;
        }
        else
        {
            ptca->likability += 10;
            printf("因 %s 被打入冷宫, %s宠爱度增加10点!\n", a_name, ptca->name);
        }

        ptca++; //指针指向下一个结构体
    }
};

//4.朕的爱妃呢-查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
int findOne(concu *ptca, int *num)
{
    int n = *num; //临时变量,控制循环
    char a_name[10];
    printf("皇上您要查找哪一位妃子呢,输入名字即可:\n");
    scanf("%s", a_name);
    printf("当前要查找的妃子是%s....\n", a_name);

   //判断是否在宫中
    concu *p = ptca;
    int a_count = 0; //不同名妃子计数器
    for (int i = 0; i < n; i++)
    {
        // printf("%s --- %s\n", p->name, a_name);
        if (strcmp(p->name, a_name) != 0)
        {
            a_count++;
        }
        // printf("%d\n", a_count);
        p++;
    }
    if (a_count == n)
    {
        printf(" %s 还不在宫中呢...\n", a_name);
        return 0;
    }

    //在遍历中寻找符合要求的妃子并打印信息
    for (int i = 0; i < n; i++)
    {

        if ((strcmp(a_name, (ptca->name)) == 0))
        {
            printf("姓名\t等级\t宠爱度\t\n");
            printf("%s\t", ptca->name);
            //打印等级,并用中文替代
            switch (ptca->level)
            {
            case 1:
                printf("御女\t");
                break;
            case 2:
                printf("世妇\t");
                break;
            case 3:
                printf("嫔\t");
                break;
            case 4:
                printf("夫人\t");
                break;
            case 5:
                printf("后\t");
                break;
            default:
                printf("0\t");
                break;
            }
            //打印宠爱度
            printf("%d\n", ptca->likability);
        }
        ptca++;
    }
};

//5.巡视后宫,打印所有妃子信息,跳过被打入冷宫的妃子信息
void seeAll(concu *ptca, int *num)
{
    int n = *num; //临时变量控制循环
    printf("-----------------------------------------\n");
    printf("姓名\t等级\t宠爱度\t\n");
    for (int i = 0; i < n; i++)
    {
        if (ptca->level != 0)
        {
            //打印姓名
            printf("%s\t", ptca->name);
            //打印等级,并用中文替代
            switch (ptca->level)
            {
            case 1:
                printf("御女\t");
                break;
            case 2:
                printf("世妇\t");
                break;
            case 3:
                printf("嫔\t");
                break;
            case 4:
                printf("夫人\t");
                break;
            case 5:
                printf("后\t");
                break;
            default:
                printf("0");
                break;
            }
            //打印宠爱度
            printf("%d\n", ptca->likability);
        }
        ptca++;
    }
};

//6.1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
int judege_1(concu *ptca, int *num)
{
    int n = *num; //临时变量,控制循环
    count = 0;    //计数器清0

    //循环  计数器
    for (int i = 0; i < n; i++)
    {
        if (ptca->likability < 50)
        {
            count++;
        }
    }

    //判断
    if (count >= 3)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

//6.2.若有人宠爱度达到100,镇压后宫,游戏结束
int judege_2(concu *ptca, int *num)
{
    int n = *num; //临时变量,控制循环

    //循环  计数器
    for (int i = 0; i < n; i++)
    {
        if (ptca->likability >= 100)
        {
            return 0;
        }
    }
    return 1;
}


转载:https://blog.csdn.net/weixin_45761327/article/details/104826888
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场