今天主要解决了登录界面的提示问题
原先在登录界面输入账号密码后,点击注册(Register)后没有任何提示,无论成功或失败,而点击登录(Login)后,如果账号密码正确便直接进入游戏,而错误也没有任何提示,这交互显然不友好。
虽然我一早就想解决这个问题,但是由于我先前只负责客户端的编写,对于消息通信不太了解,不知道他们的发消息机制,也就没第一时间解决。
在咨询了组长之后,我姑且看懂了如何服务端与客户端的信息是如何交换的,也就立马账解决了这个问题。
首先在原本的通信协议中,关于登陆注册的消息,只有客户端发给服务端的账号密码,然后由服务端判断这个账号密码是否正确,正确的话调用initPlayer()函数,然后给客户端发送一个初始化玩家自身信息的消息
void initPlayer(client* c)//参数为线程指针,无返回值,创建线程线程初始化玩家信息{ char buf[MAXSIZE + 1]; sprintf(buf, "I %d %lf %lf %d %d %d %lf %lf", c->p.id, c->p.wx, c->p.wy, c->p.lv, c->p.exp, c->p.maxexp,c->p.hp,c->p.maxhp); //初始化玩家自身信息 send(c->sclient, buf, MAXSIZE, 0); c->exist = true; //将玩家状态置为登陆状态}
然而错误的话则未给客户端发送任何信息,于是我在服务端添加了新的通信协议
P 登录相关
P PL 1 登录失败,密码错误 P PL 0 登录失败,账号不存在 P PR 1 注册失败,账号已存在
else if (ch == 'P') { int sel = 0; bool b = false; string username; string password; ss >> username >> password; ifstream infile("datebase.txt"); if (infile) { char jl[80]; string un, pw; while (infile.getline(jl, 80)) { stringstream sjl(jl); sjl >> un >> pw; if (username == un&&password == pw) { c->username = username; c->password = password; sjl >> c->p.wx >> c->p.wy >> c->p.exp >> c->p.hp >> c->p.lv; c->p.setlv(c->p.lv); c->p.tj.x = c->p.wx; c->p.tj.y = c->p.wy; b = true; break; } else if (username == un) { //密码错误 sel = 1; break; } else if (password == pw) { //账号不存在 sel = 0; break; } } infile.close(); } if (b) { //登陆成功 initPlayer(c); //初始化玩家信息 waitplayers.erase(waitplayers.begin()+i); c->p.initMap(&m); c->p.curmap->insertPlayer(c); } else { if (sel == 1) sprintf(buf1, "PL %d", 1); else sprintf(buf1, "PL %d", 0); send(c->sclient, buf1, MAXSIZE, 0); } }
else if (ch == 'R') { bool b=true; string username; string password; ss >> username >> password; ifstream infile("datebase.txt"); if (infile) { char jl[80]; string un, pw; while (infile.getline(jl, 80)) { stringstream sjl(jl); sjl >> un >> pw; if (username == un) { b = false; break; } } infile.close(); } if (b) { c->username = username; c->password = password; ofstream outfile("datebase.txt",ios::app); outfile << username << " " << password << " " << c->p.wx << " " << c->p.wy << " " << c->p.exp << " " << c->p.hp << " " << c->p.lv << endl; initPlayer(c); //初始化玩家信息 waitplayers.erase(waitplayers.begin() + i); c->p.initMap(&m); c->p.curmap->insertPlayer(c); outfile.close(); } else { sprintf(buf1, "PR %d", 1); send(c->sclient, buf1, MAXSIZE, 0); } }
在客户端接收消息函数中添加了相应的反馈
else if (c == 'P') { ss >> c; if (c == 'R') { ss >> temp; if (temp == 1) MessageBox(NULL,"注册失败,账号已存在", "错误",MB_OK); } if (c == 'L') { ss >> temp; if (temp == 1) MessageBox(NULL, "登录失败,密码错误", "错误", MB_OK); else MessageBox(NULL, "登录失败,账号不存在", "错误", MB_OK); } }
实现了以下的提示功能
测试用账号为w,密码为e
首先测试登录功能,以下为密码输入错误的情况
然后是账号不存在
最后是在已存在账号的情况下输入重复账号注册