c语言设计简易游戏背包

通过学习c语言的指针,结构体,以及基本的c语言语法对游戏背包进行一个简易的实现,让自己对结构体和指针有更加深入的理解。下面是我的一些分享,功能如下:
	1.手动录入玩家和商品信息,没有对录入信息做处理,需要按要求填写。
	2.展示用户和商品信息
	3.对商品进行购买,商城中的商品减少,玩家背包中的商品增加
	4.展示不同玩家购买的商品
	首先需要定义我们的结构体,说到背包,那么我们需要构造购买的商城以及拥有背包的玩家。那么我们的三个结构体就是玩家,背包,商城,玩家拥有背包,背包中的商品是从商城中买来的,这就是这三者的联系。那么我们先来把它们的属性列出来,如下所示:
商品:假想我们进入游戏商城界面,那么商品会有什么属性,有商品编号、商品名、商品库存、商品单价、商品描述。
背包:背包中最重要的就是我们的商品属性,因为我们的商品是从商城(可以理解为一个商品的数组)中来的,那么背包中的属性就有商品,背包的最大容量,背包当前容量(多个同一商品只占用一个背包格子),以及背包所属的玩家编号。
玩家:玩家有玩家id,是玩家的唯一标识,玩家名字,玩家拥有的金币,最重要的一点是玩家拥有背包。

那么我们的结构体可以定义为如下:
typedef struct _prop{ //定义商品结构体
int id; //商品编号
char []name; //商品名
int stock; //商品库存
double price; //商品单价
char []desc; //商品描述
}Prop; //通过typedef起的别名

typedef struct _bag{
int playerId; //所属玩家
int count; //背包当前物品个数
int max; //背包最大物品个数
Prop props[]; //商品数组
}Bag;

typedef struct _player{
int id; //玩家编号
char []name; //玩家名字
char []pass; //玩家密码
Bag bag; //玩家拥有的背包
double gold; //玩家金币
}

直接上代码:
1.初始化函数

Prop *props;  //定义一个指针指向商品,方便操作
Player *player; //定义一个指针指向玩家
Prop propArray[100];  //定义一个商品数组用来存放商品当做商场
Player playerArray[10];     //定义一个玩家数组存放玩家信息
void init(){
    int i = 0;
    /*循环遍历录入商品信息,直到用户输出n为止*/
    while(1){
        char flag = 'y';		//结束循环标识
        printf("请输入需要添加的商品信息");
        printf("商品编号:");
        scanf("%d", &propArray[i].id);		//给数组中的第i+1个商品赋予商品编号(获取商品数组中第i+1个元素里面id的地址)
        fflush(stdin);		//清除缓冲区
        printf("商品名称:");
        scanf("%s", &propArray[i].name);		//给数组中的第i+1个商品赋予商品名
        fflush(stdin);
        printf("商品价格:");
        scanf("%lf", &propArray[i].price);		//给数组中的第i+1个商品赋予单价
        fflush(stdin);
        printf("商品库存:");
        scanf("%d", &propArray[i].stock);		//给数组中的第i+1个商品赋予商品库存
        fflush(stdin);
        printf("商品描述:");
        scanf("%s", &propArray[i].desc);		//给数组中的第i+1个商品赋予商品描述
        fflush(stdin);
        printf("输入n结束,其他任意键继续录入");
        scanf("%c", &flag);		//接受判断标识
        if(flag == 'n' || flag == 'N'){		//是否继续输入判断
            break;
        }
        i++;		//将新商品添加到数组下一个元素中
    }

2.交易函数

/*首先传入需要购买的玩家和需要购买的物品,交易开始。
1.需要判断商城中是否存在传入的商品id。
2.判断商品库存量是否足够
3.判断玩家钱是否足够
4.判断玩家背包是否已满
5.判断玩家背包中是否存在该商品
*/
void trade(Player *player, int propId){
    Prop * propTrade = NULL;		//定义一个具体的商品地址,首先赋值一个空指针,防止造成野指针
    int propsCount = sizeof(propArray)/sizeof(propArray[0]);		//商品总数
    for(int i = 0; i < propsCount; i++){		//利用传进来的商品id循环找到对应的商品地址赋值给定义好的指向商品地址的指针
        if(propId == (*(props + i)).id){
            propTrade = props + i;
            break;
        }

    }
    if(propTrade->stock <= 0){		//利用指向商品地址的指针查看商城中该商品是否有存货
        printf("商品已经被卖完了\n");
        return;
    }
    if(player->gold < propTrade->price){		//查看玩家金钱是否足够
        printf("玩家金币不够\n");
        return;
    }
    if(player->bag.count > player->bag.max){		//查看背包容量是否足够
        printf("背包已满\n");
        return;
    }
     propTrade->stock--; //商城中库存量减一
     player->gold -= propTrade->price;		//用户金币减去商品单价后的金币
     int i = 0;
    for(; i < player->bag.count; i++){		//查看玩家是否已有该商品,如果有则将该商品在玩家的背包中自加
        if(player->bag.prop[i].id == propId){
            player->bag.prop[i].stock++;
            break;
        }
    }
    if(i == player->bag.count){		//没有相同的物品,添加一个新的商品
        int playCount = player->bag.count;		//定义变量存储玩家已有商品数量
        player->bag.prop[playCount].id = propTrade->id;		//利用已有的商品数量来确定新的商品的位置,然后拷贝一份指针指向商品地址中id的值。
        strcpy(player->bag.prop[playCount].name,propTrade->name);		//将商品名拷贝给玩家背包中的商品
        strcpy(player->bag.prop[playCount].desc,propTrade->desc);		//将商品描述拷贝给玩家背包中的商品描述
        player->bag.prop[playCount].price = propTrade->price;		//将商品价格拷贝给玩家背包中的商品价格
        player->bag.prop[playCount].stock = 1;		//设置玩家刚刚购买的商品数目为一
        player->bag.count++;		//商品数加一
    }
}

3.玩家和用户展示

void propShow(){
    props = propArray; //设置商品指针指向
    printf("%-12s%-8s%-10s%-10s%-10s\n","道具编号","道具名","道具单价","道具库存","道具功能");
    for(int i = 0; i < sizeof(propArray)/sizeof(propArray[0]); i++){  //展示商场物品
        if(propArray[i].id != 0){
             printf("%d\t%s\t%.lf\t%d\t%s\n",(*(props+i)).id,(*(props+i)).name,(*(props+i)).price,(*(props+i)).stock,(*(props+i)).desc);		//打印商城商品清单
        }
    }
}
void playerShow(){
        player = playerArray; //设置玩家指针指向
        printf("%-10s%-10s%-12s%-12s\n","玩家编号","玩家账号","玩家密码","玩家金币");
    for(int i = 0; i < sizeof(playerArray)/sizeof(playerArray[0]); i++){
        if(playerArray[i].id != 0){		//循环打印每一位玩家的信息
            printf("%d\t%s\t%s\t%.2lf\t\n",(*(player+i)).id, (*(player+i)).name, (*(player+i)).pass, (*(player+i)).gold);
            for(int j = 0; j < (*(player+i)).bag.count; j++){		//循环输出每个玩家背包中的物品,这里我只输出物品名和数量
                printf("%s\t%d\t\n",(*(player+i)).bag.prop[j].name,(*(player+i)).bag.prop[j].stock);
            }
        }
    }
}

完整代码如下:
main.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "game.h"
extern Player* player;
int main()
{
    init();
    printf("交易前商品如下***********\n");
    propShow();
    playerShow();
    while(1){
        char flag ; //退出表示
        int i = 0;
        int propId = 0;
        printf("请输入需要物品的玩家编号:");
        scanf("%d",&i);
        printf("请输入需要购买的商品编号:");
        scanf("%d",&propId);
        trade(&player[i-1],propId);
        printf("交易后***********\n");
        propShow();
        playerShow();
        printf("输入任意字符继续,输入n结束:");
        fflush(stdin);
        scanf("%c",&flag);
        if(flag == 'n'){
            break;
        }
    }

    return 0;
}

头文件game.h文件如下:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
#include<string.h>
void propShow();
void playerShow();
void trade();
void init();
/*
1.商品:商品编号,商品名,商品价格,商品数量,商品描述
2.背包:编号,大小,商品,
3.角色
*/
/*商品结构*/
typedef struct _prop{
    int id;         //道具的唯一表示
    char name[50];  //道具名
    double price;   //道具单价
    int stock;      //库存量
    char desc[200]; //道具功能描述
}Prop;



/*背包结构*/
typedef struct _bag{
    int playerId;   //所属玩家编号
    int count;      //当前背包中,道具的数量
    int max;        //背包最大存储容量
    Prop prop[8];       //当前背包中的道具数组

}Bag;

/*玩家结构*/

typedef struct _player{
    int id;     //玩家编号
    char name[50]; //用户名
    char pass[50]; //密码
    Bag bag;        //玩家的背包
    double gold;    //玩家金币
    double sysee;   //元宝数量
}Player;

Prop *props;  //定义一个指针显示商品
Player *player; //定义一个指针显示玩家
Prop propArray[100];  //定义一个商品数组用来存放商品当做商场
Player playerArray[10];     //定义一个玩家数组存放玩家信息

void init(){
    int i = 0;
    /*循环遍历录入商品信息,直到用户输出n为止*/
    while(1){
        char flag = 'y';		//结束循环标识
        printf("请输入需要添加的商品信息");
        printf("商品编号:");
        scanf("%d", &propArray[i].id);		//给数组中的第i+1个商品赋予商品编号
        fflush(stdin);		//清除缓冲区
        printf("商品名称:");
        scanf("%s", &propArray[i].name);		//给数组中的第i+1个商品赋予商品名
        fflush(stdin);
        printf("商品价格:");
        scanf("%lf", &propArray[i].price);		//给数组中的第i+1个商品赋予单价
        fflush(stdin);
        printf("商品库存:");
        scanf("%d", &propArray[i].stock);		//给数组中的第i+1个商品赋予商品库存
        fflush(stdin);
        printf("商品描述:");
        scanf("%s", &propArray[i].desc);		//给数组中的第i+1个商品赋予商品描述
        fflush(stdin);
        printf("输入n结束,其他任意键继续录入");
        scanf("%c", &flag);		//接受判断标识
        if(flag == 'n' || flag == 'N'){		//是否继续输入判断
            break;
        }
        i++;		//将新商品添加到下一个数组中
    }

    int j = 0;
    while(1){
        char flag = 'y';
        printf("请输入需要录入的玩家信息");
        printf("玩家编号:");
        scanf("%d", &playerArray[j].id);		//给数组中的第i+1个玩家赋予玩家编号
        fflush(stdin);
        printf("玩家名称:");
        scanf("%s", &playerArray[j].name);		//给数组中的第i+1个玩家赋予玩家名字
        fflush(stdin);
        printf("玩家密码:");
        scanf("%s", &playerArray[j].pass);		//给数组中的第i+1个玩家赋予玩家登录密码
        fflush(stdin);
        printf("玩家金钱:");
        scanf("%lf", &playerArray[j].gold);		//给数组中的第i+1个玩家赋予玩家拥有的金钱
        fflush(stdin);
        printf("玩家背包最大容量:");
        scanf("%d", &playerArray[j].bag.max);		//给数组中的第i+1个玩家赋予玩家背包的最大容量
        fflush(stdin);
        printf("输入n结束,其他任意键继续录入");
        scanf("%c", &flag);
        if(flag == 'n' || flag == 'N'){
            break;
        }
        i++;
    }
}
/*
//初始化变量
Prop propArray[] = {
{1,"双倍经验卡",1000,10,"打怪经验翻倍"},
{2,"破旧的长剑",10000,10,"攻击力加10"},
{3,"普通的长剑",100000,10,"攻击力加100"},
{4,"精致的长剑",1000000,10,"攻击力加1000"},
{5,"完美的长剑",1000000,10,"攻击力加10000"}
};

 Player playerArray[] = {
    {1,"xiaozhang","123456", .gold=10000000.0, .bag.max=8},
    {2,"xiaochai","123456", .gold=1000000.0, .bag.max = 8},
    {3,"xiaoliud","123456", .gold=100000, .bag.max = 8},
    {4,"xiaozeng","123456", .gold=10000, .bag.max = 8},
    {5,"xiaoxied","123456", .gold=1000, .bag.max = 8}
};
*/
void propShow(){
    props = propArray; //设置商品指针指向

    printf("%-12s%-8s%-10s%-10s%-10s\n","道具编号","道具名","道具单价","道具库存","道具功能");
    for(int i = 0; i < sizeof(propArray)/sizeof(propArray[0]); i++){  //展示商场物品
        if(propArray[i].id != 0){
             printf("%d\t%s\t%.lf\t%d\t%s\n",(*(props+i)).id,(*(props+i)).name,(*(props+i)).price,(*(props+i)).stock,(*(props+i)).desc);
        }
    }
}
void playerShow(){
        player = playerArray; //设置玩家指针指向
        printf("%-10s%-10s%-12s%-12s\n","玩家编号","玩家账号","玩家密码","玩家金币");
    for(int i = 0; i < sizeof(playerArray)/sizeof(playerArray[0]); i++){
        if(playerArray[i].id != 0){
            printf("%d\t%s\t%s\t%.2lf\t\n",(*(player+i)).id, (*(player+i)).name, (*(player+i)).pass, (*(player+i)).gold);
            for(int j = 0; j < (*(player+i)).bag.count; j++){
                printf("%s\t%d\t\n",(*(player+i)).bag.prop[j].name,(*(player+i)).bag.prop[j].stock);
            }
        }
    }
}

/*
获取玩家的地址和需要购买的物品。
1.判断商品中是否存在传入的商品
2.判断商品库存是否大于0,没有库存则退出此次购买
3.判断玩家钱是否足够,足够则扣除玩家金钱,该商品库存减一
4.判断玩家背包是否满了
*/
void trade(Player *player, int propId){
    Prop * propTrade = NULL;		//定义一个具体的商品地址
    int propsCount = sizeof(propArray)/sizeof(propArray[0]);		//商品总数
    for(int i = 0; i < propsCount; i++){		//利用传进来的商品id循环找到商品地址赋值给定义好的指向商品地址的指针
        if(propId == (*(props + i)).id){
            propTrade = props + i;
            break;
        }

    }
    if(propTrade->stock <= 0){		//利用指向商品地址的指针查看商城中该商品是否有存货
        printf("商品已经被卖完了\n");
        return;
    }
    if(player->gold < propTrade->price){		//查看玩家金钱是否足够
        printf("玩家金币不够\n");
        return;
    }
    if(player->bag.count > player->bag.max){		//查看背包容量是否足够
        printf("背包已满\n");
        return;
    }
     propTrade->stock--; //商城库存量减一
     player->gold -= propTrade->price;		//用户金币减去商品单价后的金币
     int i = 0;
    for(; i < player->bag.count; i++){		//查看玩家是否已有该商品,如果有则将该商品在玩家的背包中自加
        if(player->bag.prop[i].id == propId){
            player->bag.prop[i].stock++;
            break;
        }
    }
    if(i == player->bag.count){		//添加一个新的商品
        int playCount = player->bag.count;		//定义变量存储玩家已有商品数量
        player->bag.prop[playCount].id = propTrade->id;		//利用已有的商品数量来确定新的商品的位置
        strcpy(player->bag.prop[playCount].name,propTrade->name);		//将商品名拷贝给玩家背包中的商品
        strcpy(player->bag.prop[playCount].desc,propTrade->desc);		//将商品描述拷贝给玩家背包中的商品描述
        player->bag.prop[playCount].price = propTrade->price;		//将商品价格拷贝给玩家背包中的商品价格
        player->bag.prop[playCount].stock = 1;		//设置玩家刚刚购买的商品数目为一
        player->bag.count++;		//商品数加一
    }
}

#endif // GAME_H_INCLUDED
小白文章,希望对大家有帮助,同时也欢迎各位大佬多多指教,一起进步成长。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值