Slimer软工课设日报-2016年7月4日

今天主要解决了登录界面的提示问题

原先在登录界面输入账号密码后,点击注册(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

首先测试登录功能,以下为密码输入错误的情况

然后是账号不存在

 最后是在已存在账号的情况下输入重复账号注册

原文地址:https://www.cnblogs.com/hesoyamlyf/p/5640564.html