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