嗯,抽卡是坏文明。但不得不承认这种形式的设计确实是抓住了人性。就像斯金纳箱中的小老鼠一样。
所以不能被这种心理利用,而要利用这种心理来学习。因此决定模仿抽卡类游戏做一个用以读书的游戏。
写代码前,首先设计游戏大致的整体结构:
游戏的主旋律是这样的:
获得卡(概率性、稀有度)->强化卡(加深与该卡的羁绊、获得提升感)->完成任务(获得成就感)->获得抽卡道具(奖励系统)->获得卡(进入循环)
其中主要游戏性的部分应该是强化和任务,这占据着90%的时间,虽然抽卡是其 骗氪点,但是主要的90%时间才是决定持续这个循环的关键。
因此将在强化和升级内容中,把一般游戏中游戏性的内容替换为阅读和做习题,并通过相应的时间积累作为奖励反馈。而抽卡系统中的卡,将换为各类书籍,并按难度和重要度分不同的稀有度。
如图:
需要一个卡类(卡面以及数据),任务类,主角数据类,系统类。
设计部分的类如下:
class card{//卡基类-基本的卡、作为图鉴存在
private:
picture*pic;
int id;
int lv;//稀有度 1~5星 通过查稀有度表可得出 暂时用名字第一个数字代替
int search(string name){
return name[0] - '0';
}
public:
card(string filename){//图片文件名和内容描述文件名一致
pic = picture::create(res_file+filename+picsuff);
id = cardcount++;
lv = search(filename);
}
virtual void show(){
cout << pic->getname() << endl;
}
};
class card_usr:public card{//卡子类-用户使用得到
private:
int charpter;//总章节数(决定等级上限 总上限是100级,每章节完成强化后突破上限)
int lv_mx;//当前等级上限
int cur_lv;//当前等级
int fet_mx;//当前羁绊上限
int fetter;//羁绊点-再次召唤增加其上限
public:
card_usr(string filename):card(filename){//这里需要程序随机加密
filename += ".txt";
ifstream fin(res_file+filename);
fin >> charpter >> lv_mx >> cur_lv >> fet_mx >> fetter;
fin.close();
}
virtual void show(){
card::show();
}
};
class card_system{//卡系统 游戏总导演
private:
//客户端数据
const string cardnamefile = "card.txt";//卡名文件
//服务器数据
const string usrnamefile = "usrs.txt";//用户文件
const string usrresfile = "usr_data\\";//用户数据文件夹
vector<card*>cards;
vector<int>id;//用户的卡号
int num;
string usr_name = "dljgs1";//
string usr_key;
public:
void login(){
;//登陆 暂空
}
void load_database(){//读取卡数据
ifstream fin(cardnamefile);
string buf;
while (!fin.eof()){
fin >> buf;
cards.push_back(new card_usr(buf));
}
num = cardcount;
if (num != cards.size())report("数量不一致");
}
void load_user(){
ifstream fin(usrresfile + usr_name + ".txt");
if (fin.fail()){ report("用户"+usr_name+"不存在!"); }
//*!这里需要加密
int k;
fin >> k;//数量
while (k--){
int temp; fin >> temp;
id.push_back(temp);
}//读取卡号
}
void init(){//初始化
srand(time(NULL));
login();//登陆
load_database();//读取数据库所有卡
load_user();//读取用户有的卡
}
void run(){
init();
//游戏本体
;
int i;
while (1){
cout << "1.查看当前卡\n2.抽卡";
cin >> i;
if (i == 1){
for each (auto var in id)
{
cards[var]->show();
}
system("pause");
}
else{
;
}
system("cls");
}
}
card_system(){
init();
run();
}
};
目前暂时只做好大致框架仅供本地测试,也并没有分客户端和服务端,之后会结合cocos的学习逐步分离。