当前位置: 首页 > ai >正文

【五子棋在线对战】三.数据管理模块实现

数据管理模块实现

  • 1.数据库表的设计
  • 2.数据管理模块的封装和实现
    • 2.1 user_table() && ~user_table()
    • 2.2 insert() 注册时新增用户
    • 2.3 login() 登录验证,并返回详细的用户信息
    • 2.4 通过用户名获取用户信息 && 通过用户id获取用户信息
    • 2.5 win() && lose()

项目链接: 五子棋项目

1.数据库表的设计

在数据库表的成员变量中,除了id,用户名,密码之外,还有一些是是针对于游戏中的设计

  1. id
  2. username
  3. password
  4. score:分数
  5. total_count:总场数
  6. win_count:赢的场数
create database if not exists gobang;
use gobang;
create table if not exists user(id int primary key auto_increment,username varchar(32) not null,password varchar(32) not null,score int,total_count int,win_count int 
);

2.数据管理模块的封装和实现

实现一个mysql客户端来访问服务器进行数据的操作,为了项目的可拓展性,针对管理的每一张表都去设计一个类,我们这里是针对用户的数据所以设计的就是user类
在这里插入图片描述
这里的函数实现要搭配着上一篇文章实现的使用工具类中的mysql_util这个类。

2.1 user_table() && ~user_table()

user_table的初始化就是mysql_create()要传入的参数也是mysql_create这个函数所需要的参数,析构函数就直接调用mysql_destroy即可。

2.2 insert() 注册时新增用户

这里就是简单的使用sql语句即可,要对用户和密码不全的情况进行判断

     bool insert(Json::Value &user){
#define INSERT_USER "insert user values(null, '%s', '%s', 1000, 0, 0);"//密码用户不全if (user["password"].isNull() || user["username"].isNull()){DLOG("INPUT PASSWORD OR USERNAME");return false;}char sql[4096] = {0};// sprintf(void *buf, char *format, ...)sprintf(sql, INSERT_USER, user["username"].asCString(), user["password"].asCString());bool ret = mysql_util::mysql_exec(_mysql, sql);if (ret == false){DLOG("insert user info failed!!\n");return false;}return true;}

2.3 login() 登录验证,并返回详细的用户信息

mysql链接共享,所以在多个线程同时执行sql语句时会导致竞争,所以需要加锁保护,这里有一个新的写法在加锁的地方用括号括起来,这样就变成了一个区间,区间结束之后锁会自动释放。

          {std::unique_lock<std::mutex> lock(_mutex);bool ret = mysql_util::mysql_exec(_mysql, sql);if (ret == false){DLOG("user login failed!!\n");return false;}// 要么有数据,要么没有数据,就算有数据也只能有一条数据res = mysql_store_result(_mysql);if (res == NULL){DLOG("have no login user info!!");return false;}}

2.4 通过用户名获取用户信息 && 通过用户id获取用户信息

这两个的函数几乎一模一样,就是在sql查询语句中的查询条件不同

     bool select_by_name(const std::string &name, Json::Value &user){
#define USER_BY_NAME "select id, score, total_count, win_count from user where username='%s';"char sql[4096] = {0};sprintf(sql, USER_BY_NAME, name.c_str());MYSQL_RES *res = NULL;{std::unique_lock<std::mutex> lock(_mutex);bool ret = mysql_util::mysql_exec(_mysql, sql);if (ret == false){DLOG("get user by name failed!!\n");return false;}// 要么有数据,要么没有数据,就算有数据也只能有一条数据res = mysql_store_result(_mysql);if (res == NULL){DLOG("have no user info!!");return false;}}int row_num = mysql_num_rows(res);if (row_num != 1){DLOG("the user information queried is not unique!!");return false;}MYSQL_ROW row = mysql_fetch_row(res);user["id"] = (Json::UInt64)std::stol(row[0]);user["username"] = name;user["score"] = (Json::UInt64)std::stol(row[1]);user["total_count"] = std::stoi(row[2]);user["win_count"] = std::stoi(row[3]);mysql_free_result(res);return true;}

2.5 win() && lose()

这也类似,一个是加分一个是减分

  1. 胜利时天梯分数增加30分,战斗场次增加1,胜利场次增加1
  2. 失败时天梯分数减少30,战斗场次增加1,其他不变
     bool win(uint64_t id){
#define USER_WIN "update user set score=score+30, total_count=total_count+1, win_count=win_count+1 where id=%ld;"char sql[4096] = {0};sprintf(sql, USER_WIN, id);bool ret = mysql_util::mysql_exec(_mysql, sql);if (ret == false){DLOG("update win user info failed!!\n");return false;}return true;}
http://www.xdnf.cn/news/12702.html

相关文章:

  • 数据类型 -- 布尔
  • unity ngui button按钮点击时部分区域响应,部分区域不响应
  • JAVA 对象 详解
  • arduino Nano+asrpro2.0制作桌面宠物
  • 码蹄杯真题分享
  • 会计 - 合并4 - 或有对价的会计处理
  • 计算机组成原理:计算机发展历程
  • 标识符命名规则
  • Linux操作系统故障应急场景及对应排查方法
  • VBA进度条ProgressForm1
  • 7.2.2_折半查找
  • 字符串字典序最大后缀问题详解
  • 总结html标签之button标签
  • 日志收集工具-Filebeat
  • 《汇编语言》第16章 直接定址表
  • 100. 2017年蓝桥杯省赛 - 九宫幻方(困难)- 暴力搜索
  • 数据库学习(二)——MySQL语句
  • 基于python的酒水零食商城系统
  • 数论总结,(模版与题解)
  • 【Overleaf Latex模板】厦门大学课程论文Overleaf Latex模板 中文版
  • 1.认识Spring
  • 如何区分 “通信网络安全防护” 与 “信息安全” 的考核重点?
  • 在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法
  • 摩尔信使MThings V0.8.0更新要点
  • 楼宇自控通过智慧节能管理,为建筑碳中和按下加速键
  • 《经济学原理》第9版第5章弹性及其应用
  • Mybatis-Plus的Iservice接口
  • 基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
  • pygame开发的坦克大战
  • 【HTTP三个基础问题】