通过学习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
小白文章,希望对大家有帮助,同时也欢迎各位大佬多多指教,一起进步成长。

c语言设计简易游戏背包相关推荐

  1. c语言设计生命游戏,C语言实现生命游戏.doc

    C语言实现生命游戏 本世纪70年代,人们曾疯魔一种被称作"生命游戏"的小游戏,这种游戏相当简单.假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:&q ...

  2. 用C语言设计简易银行系统

    简易银行系统 此银行系统基于C语言,实现了开卡.读卡.转账.存钱.取钱.存文档.都文档以及密码三次输入机会等基本功能.比较简单,容易理解,适合新手学习.(所用软件:DEV-C++) 1. 实现账户用链 ...

  3. 利用C语言设计扫雷游戏

    问题解决: 利用二维数组设计了一个扫雷游戏,通过这个游戏去进一步理解二维数组与函数之间的相互嵌套,有空也可以和舍友一起玩玩 游戏规则:先任意点开少量的方格,没有爆炸时,会出现一个数字,这个数字代表的意 ...

  4. 1.15、C语言设计简易五子棋

    实现一个20*20的简易五子棋,双方使用键盘输入落子的坐标,刷新输出当前棋局状态,并且判断有无五子连心,裁决输赢. /***************************************** ...

  5. c语言程序设计作业电话簿,C语言设计简易电话簿

    #include #include #include #include #include typedef struct Contact{ //定义联系人结构体 char name[20]; //姓名 ...

  6. c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...

    基于Windows平台C语言实现迷宫游戏的设计 摘 要 随着科技的日益发展,计算机信息知识越来越被人们所认知和使用,在当今知识爆炸的时代计算机毫无疑问成为人们常用的日常工具,而Windows和C语言都 ...

  7. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  8. c语言八个方向迷宫课程设计,【精品资料最新版】C语言课程设计-迷宫游戏.doc...

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  9. 2048游戏c语言linux简易代码,C语言实现2048游戏代码

    本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下 效果图: 使用文本界面的屏幕绘图库 ncurses. 设计思路: 在满足条件情况下消除方块 允许在游戏主界面(16 宫格) ...

  10. c语言课程设计--拼图游戏,C语言课程设计_拼图游戏.pdf

    C -- 语言课程设计 拼图游戏 一.实验内容 玩家通过鼠标单击相邻位有空位的方块来移动方块,从而最终将一副散乱的图片拼成完 整的图片.要求如下: 1. 游戏的初始界面如图一,单击空格键进入游戏,进入 ...

最新文章

  1. 安徽池州贵池中学老师经典语录,我喷了
  2. apk反编译看包名什么的
  3. leetcode刷题实录:1
  4. svn:error use xcode-select to change
  5. 嵌入式开发C语言中的uint8_t
  6. 计算机对教育的影响雅思听力,雅思听力机考带来的两大影响
  7. QT每日一练day18:文件IO
  8. python对投标_batterytender-为Python del API投标-Jason Kölker Module
  9. Unity3D之NGUI基础3.1:代码控制UILabel
  10. java freepascal_Free Pascal
  11. ios lottie动画_在iOS中使用Lottie动画
  12. Nexperia | 采用Trench肖特基二极管,实现功率密度的显著提升
  13. 【程序员如何买基金 五】挑选合适的指数和指数基金
  14. mysql瀑布流布局插件_瀑布流JS插件
  15. RT-Thread 应用方面的一点总结(二)
  16. vue中头像加载不出来,怎样设置默认头像
  17. 伊诺ET-33夹式校(音器吉他/贝司/小提琴/尤克里里 使用
  18. mysql分区表去重复_MySQL分区表管理
  19. 淘宝店群月入万元,店群20大常见方法都在这
  20. 中文词性标注学习笔记(一)---词性标注概念

热门文章

  1. Orcad allegro 安装补丁
  2. 2021年企业商务网站建设必须安装的24个WordPress插件
  3. 【数论】快速分解质因数的技巧 筛法求素数(快速筛)
  4. 用python 控制台打印图片示例
  5. linux图片编辑器下载软件,Pix图片编辑器
  6. 20春季 7-2 The Judger (25 分)
  7. 写了一个根据ISBN查询图书信息接口,把收藏的几百万本图书分享给大家
  8. 支付宝支付出现该商户未开通支付宝服务,无法付款
  9. windows切换窗口快捷键
  10. IDEA社区版配置Tomcat