mysy配置C++
C++好久都不用了,今天看看配置下玩玩。目的是想连接mysql和开发一个小游戏,deepseek配合着找资料方便多了。msys不知道什么时候配置的了,里面的C环境也安装了,正好拿来练练,想不到还挺顺利,连接了mysql和开发了贪吃蛇,都是及其基础的,只是好久不用这个语言了。记录一下,如果以后遇到,不用费太多时间配置了。
开发工具:eclipse-cpp-2025-06-R-win32-x86_64.zip 官网下载
msys2:管理软件包,配置C++开发环境 官网下载 https://www.msys2.org/
C环境:D:\msys64\mingw64,通过msys管理,命令搜索即可查询
配置mysql驱动:msys中执行
msys目前默认包版本:mingw-w64-x86_64-libmariadbclient-3.4.7-1,执行连接数据库总是报错ssl support ,查询相关资料,降级3.3,先删除原有,如果不报错不需要降级
删除3.4.7版本
pacman -R mingw-w64-x86_64-libmariadbclient
checking dependencies...
Packages (1) mingw-w64-x86_64-libmariadbclient-3.4.7-1
Total Removed Size: 3.55 MiB
:: Do you want to remove these packages? [Y/n] Y
:: Processing package changes...
(1/1) removing mingw-w64-x86_64-libmariadbclient [###############################] 100%
手工下载后放到目录下,(msys的仓库)安装https://repo.msys2.org/mingw/mingw64/
目录:D:\msys64\home\用户下


pacman -U mingw-w64-x86_64-libmariadbclient-3.3.8-2-any.pkg.tar.zst
安装
为了连接mysql:eclipse配置项目properties

mariadb
ws2_32
crypt32
secur32
bcrypt
schannel
zstd
z
curl
shlwapi


1、一个为了C++链接mysql数据库
//============================================================================
// Name : mysql.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================#include <mariadb/mysql.h>
#include <iostream>
#include <string>int main() {// 初始化连接MYSQL* conn = mysql_init(nullptr);if (!conn) {std::cerr << "Error initializing MariaDB connection: " << mysql_error(conn) << std::endl;return 1;}// 可选:配置 SSL(如果服务器要求)// mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, "1");// mysql_options(conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, "0");// 连接数据库if (!mysql_real_connect(conn, "IP", "User", "password","database", 3306, nullptr, 0)) {std::cerr << "Connection failed: " << mysql_error(conn) << std::endl;mysql_close(conn);return 1;}std::cout << "Connected to MariaDB server. Client version: " << mysql_get_client_info() << std::endl;// 执行 SQL 查询(示例:查询表中数据)const char* query = "sql"; // 替换为你的表名if (mysql_query(conn, query)) {std::cerr << "Query failed: " << mysql_error(conn) << std::endl;mysql_close(conn);return 1;}// 获取结果集MYSQL_RES* result = mysql_store_result(conn);if (!result) {std::cerr << "No result set or error: " << mysql_error(conn) << std::endl;mysql_close(conn);return 1;}// 获取列数并打印表头int num_fields = mysql_num_fields(result);MYSQL_FIELD* fields = mysql_fetch_fields(result);for (int i = 0; i < num_fields; i++) {std::cout << fields[i].name << "\t";}std::cout << std::endl;// 遍历每一行数据MYSQL_ROW row;while ((row = mysql_fetch_row(result))) {for (int i = 0; i < num_fields; i++) {std::cout << (row[i] ? row[i] : "NULL") << "\t";}std::cout << std::endl;}// 释放资源mysql_free_result(result);mysql_close(conn);std::cout << "Query executed successfully." << std::endl;return 0;
}
2、C++开发一个贪吃蛇
这个要用到图形界面:
eclipse配置项目properties
user32
gdi32

//============================================================================
// Name : snackGame.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================#define UNICODE
#define _UNICODE
#include <windows.h>
#include <vector>
#include <string>
#include <ctime>
#include <iostream>// 全局游戏状态变量
bool g_gameRunning = true; // 游戏运行状态
bool g_hasShownDialog = false; // 弹窗标记// 游戏区域和格子大小
const int GRID_SIZE = 20;
const int GRID_WIDTH = 30;
const int GRID_HEIGHT = 20;
const int WINDOW_WIDTH = GRID_WIDTH * GRID_SIZE;
const int WINDOW_HEIGHT = GRID_HEIGHT * GRID_SIZE;// 方向枚举
enum Direction { UP, DOWN, LEFT, RIGHT };// 蛇和食物
struct SnakeSegment {int x, y;
};
std::vector<SnakeSegment> snake;
Direction snakeDirection = RIGHT;
int foodX, foodY;
int score = 0;// 生成随机位置
int random(int min, int max) {return min + rand() % (max - min);
}// 生成新食物
void spawnFood() {bool onSnake;do {onSnake = false;foodX = random(0, GRID_WIDTH);foodY = random(0, GRID_HEIGHT);for (const auto& segment : snake) {if (segment.x == foodX && segment.y == foodY) {onSnake = true;break;}}} while (onSnake);
}// 初始化游戏
void initGame() {snake.clear();snake.push_back({5, 5}); // 重置蛇头位置snakeDirection = RIGHT; // 重置方向score = 0; // 重置分数spawnFood(); // 生成新食物g_gameRunning = true; // 关键:恢复游戏运行状态g_hasShownDialog = false; // 重置弹窗标记
}// 绘制游戏
void drawGame(HDC hdc) {RECT rect;GetClientRect(GetActiveWindow(), &rect);FillRect(hdc, &rect, (HBRUSH)COLOR_WINDOW);// 绘制蛇for (const auto& segment : snake) {int left = segment.x * GRID_SIZE;int top = segment.y * GRID_SIZE;Rectangle(hdc, left, top, left + GRID_SIZE, top + GRID_SIZE);}// 绘制食物Ellipse(hdc, foodX * GRID_SIZE, foodY * GRID_SIZE,(foodX + 1) * GRID_SIZE, (foodY + 1) * GRID_SIZE);// 修改为宽字符显示分数std::wstring scoreText = L"Score: " + std::to_wstring(score);TextOutW(hdc, 10, 10, scoreText.c_str(), scoreText.length());
}// 更新游戏状态
bool updateGame() {// 移动蛇SnakeSegment newHead = snake.front();switch (snakeDirection) {case UP: newHead.y--; break;case DOWN: newHead.y++; break;case LEFT: newHead.x--; break;case RIGHT: newHead.x++; break;}// 检测撞墙if (newHead.x < 0 || newHead.x >= GRID_WIDTH ||newHead.y < 0 || newHead.y >= GRID_HEIGHT) {return false; // 游戏结束}// 检测撞自身for (const auto& segment : snake) {if (segment.x == newHead.x && segment.y == newHead.y) {return false;}}// 移动蛇身snake.insert(snake.begin(), newHead);// 检测吃食物if (newHead.x == foodX && newHead.y == foodY) {score += 10;spawnFood();} else {snake.pop_back(); // 没吃到食物则移除尾部}return true; // 游戏继续
}// 窗口过程
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HDC hdcBuffer;static HBITMAP hbmBuffer;switch (uMsg) {case WM_CREATE:srand(static_cast<unsigned>(time(nullptr)));initGame();break;case WM_PAINT: {PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);drawGame(hdc);EndPaint(hWnd, &ps);break;}case WM_KEYDOWN:switch (wParam ) {case VK_UP: if (snakeDirection != DOWN) snakeDirection = UP; break;case VK_DOWN: if (snakeDirection != UP) snakeDirection = DOWN; break;case VK_LEFT: if (snakeDirection != RIGHT) snakeDirection = LEFT; break;case VK_RIGHT: if (snakeDirection != LEFT) snakeDirection = RIGHT; break;case 'R':initGame();g_hasShownDialog = false; // 重置弹窗标记InvalidateRect(hWnd, nullptr, TRUE); // 强制立即重绘SetTimer(hWnd, 1, 200, nullptr);// 重新启动定时器break; // 按R键重新开始}break;case WM_TIMER: // 定时器更新游戏if (g_gameRunning) {g_gameRunning = updateGame(); // 更新游戏状态InvalidateRect(hWnd, nullptr, FALSE); // 强制重绘}// 游戏结束时弹窗(仅一次)if (!g_gameRunning && !g_hasShownDialog) {KillTimer(hWnd, 1); // 先停止定时器MessageBoxW(hWnd, L"Game Over! Press R to restart.", L"Snake", MB_OK);g_hasShownDialog = true;}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, uMsg, wParam, lParam);}return 0;
}// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {// 注册窗口类(使用WNDCLASSW或通用WNDCLASS+TEXT)WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.lpszClassName = TEXT("SnakeGame");wc.hbrBackground = (HBRUSH)COLOR_WINDOW;RegisterClass(&wc);// 创建窗口(使用CreateWindowExW或通用CreateWindowEx+TEXT)HWND hWnd = CreateWindowEx(0,TEXT("SnakeGame"),TEXT("Snake Game (Windows API)"),WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH + 16,WINDOW_HEIGHT + 39,nullptr,nullptr,hInstance,nullptr);ShowWindow(hWnd, nCmdShow);// 设置定时器(每200毫秒更新一次)SetTimer(hWnd, 1, 200, nullptr);// 消息循环MSG msg;while (GetMessage(&msg, nullptr, 0, 0)) {std::wcout << L"第....................行" << std::endl;TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}

