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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建,如接警中心、视频会议、统一通信等基础施。 系统的实施将涉及到应急网络建、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建、固定和移动应急指挥通信系统建,以及应急队伍建,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值