zoukankan      html  css  js  c++  java
  • 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

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

    然后是账号不存在

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

  • 相关阅读:
    编程里的数字游戏
    SqlServer2005Express下的事件探查器
    来玩玩这个
    把一个bitmap在内存中的数据块 搬到另一个bitmap中
    一些常用的sql
    C#图像处理
    来玩玩画直线
    关于未来的思考
    年末个人小结
    [转载]编写超级可读代码的15个最佳实践
  • 原文地址:https://www.cnblogs.com/hesoyamlyf/p/5640564.html
Copyright © 2011-2022 走看看