cmake_minimum_required(VERSION 3.26)
project(hrd)
set(CMAKE_CXX_STANDARD 17)
include_directories(./easyx/include)
link_directories(./easyx/lib64)
link_libraries(libeasyx.a)
add_executable(hrd0 hrd0.cpp)
target_link_libraries(hrd0 winmm) 使用Clion编译本程序时cmakelists里必须要加最后一行,不然音乐处理函数将无法正常编译。(应该是Clion编译器与VS编译器的区别)
#include<graphics.h> //图形库
#include<stdio.h> //标准输入输出库
#include <stdbool.h> //布尔类型库
#include <conio.h> //控制台输入输出库
#include <stdlib.h> //系统函数库
#include<time.h> //处理时间库
#include <mmsystem.h> //音乐处理库
#pragma comment(lib,"winmm.lib")//处理接口//以下是处理4*4棋盘的函数
/**
* 检测棋盘是否已经拼好
* @param pan 棋盘的二维数组
* @return true:已拼好;false:未拼好
*/
bool is_well4(int pan[][4]);
/**
* 检测上下左右操作是否合法
* @param row 空位即将出现的行
* @param col 空位即将出现的列
* @return 返回true为合法,false为不合法
*/
bool if_tran4(int row, int col);
/**
* 将棋盘对应位置换位
* @param row 空位即将出现的行
* @param col 空位即将出现的列
* @param row_n 空位现在所在行
* @param col_n 空位现在所在列
* @param pan 棋盘对应的二维数组
*/
void tran_pan4(int row, int col, int row_n, int col_n, int pan[][4]);
/**
* 画出棋盘
* @param n 数字
* @param x 行
* @param y 列
*/
void paint_shu4(int n, int x, int y);
/**
* 显示步数
* @param n 步数
*/
void paint_count4(int n);
/**
* 画线
*/
void paint_line4();
//以下是处理3*3棋盘的函数.效果基本同上
bool is_well3(int pan[][3]);
bool if_tran3(int row, int col);
void tran_pan3(int row, int col, int row_n, int col_n, int pan[][3]);
void paint_shu3(int n, int x, int y);
void paint_count3(int n);
void paint_line3();
//以下是处理5*5棋盘的函数.效果基本同上
bool is_well5(int pan[][5]);
bool if_tran5(int row, int col);
void tran_pan5(int row, int col, int row_n, int col_n, int pan[][5]);
void paint_shu5(int n, int x, int y);
void paint_count5(int n);
void paint_line5();
/**
* 随机打乱3*3棋盘,同时改变当时空格行与当时空格列
* @param puzzle 3*3棋盘
* @param empty_row 当前空格行指针
* @param empty_column 当前空格列指针
*/
void suiji_3(int puzzle[][3], int *empty_row, int *empty_column);
/**
* 随机打乱4*4棋盘,同时改变当时空格行与当时空格列
* @param puzzle 4*4棋盘
* @param empty_row 当前空格行指针
* @param empty_column 当前空格列指针
*/
void suiji_4(int puzzle[][4], int *empty_row, int *empty_column);
/**
* 随机打乱5*5棋盘,同时改变当时空格行与当时空格列
* @param puzzle 5*5棋盘
* @param empty_row 当前空格行指针
* @param empty_column 当前空格列指针
*/
void suiji_5(int puzzle[][5], int *empty_row, int *empty_column);函数具体内容请见源程序。
为了使各版块更区分清楚,我们的每一个页面都单独编写了一个函数
//绘制页面函数
void beginning(); //难度选择页面
void record(); //游戏记录页面
void choose3(); //3*3棋盘
void choose4(); //4*4棋盘
void choose5(); //5*5棋盘
void paintend_yes(); //游戏胜利页面
void paintend_no(); //游戏失败页面
void chushi(); //游戏初始页面//下面是播放背景音乐的函数
void BGM();
void BGM_buttom();
void BGM_win();
void BGM_lose();
//加载图片函数
void photo_zhuye();
void photo_youxi3();
void photo_youxi4();
void photo_youxi5();
void photo_youxi_win();
void photo_youxi_lose();
void photo_youxi_record();
//绘制按钮函数
void photo_zhuye_button();int fileinput()
{
FILE* p;
p = fopen("D:\\hrd\\record\\record.txt", "a+");
fprintf(p, "\n您的游戏成绩记录如下:\n");
for (int i = 0; i <= 9; i++) {
if (finalrecord[i].judge == 1) {
if(finalrecord[i].choice==3)
fprintf(p, "第%d局:难度3*3 您的步数为%d 用时%d秒 \n", finalrecord[i].n, finalrecord[i].count, finalrecord[i].timeused);
if (finalrecord[i].choice == 4)
fprintf(p, "第%d局:难度4*4 您的步数为%d 用时%d秒 \n", finalrecord[i].n, finalrecord[i].count, finalrecord[i].timeused);
if (finalrecord[i].choice == 5)
fprintf(p, "第%d局:难度5*5 您的步数为%d 用时%d秒 \n", finalrecord[i].n, finalrecord[i].count, finalrecord[i].timeused);
}
if (finalrecord[i].judge == 2) {
if (finalrecord[i].choice == 3)
fprintf(p, "第%d局:难度3*3 步数为%d (未成功) \n", finalrecord[i].n, finalrecord[i].count);
if (finalrecord[i].choice == 4)
fprintf(p, "第%d局:难度4*4 步数为%d (未成功) \n", finalrecord[i].n, finalrecord[i].count);
if (finalrecord[i].choice == 5)
fprintf(p, "第%d局:难度5*5 步数为%d (未成功) \n", finalrecord[i].n, finalrecord[i].count);
}
}
fclose(p);
return 0;
}//按钮位置确定
#define win_width 600
#define win_length 800
#define but_x 225
#define but_y0 270
#define but_y1 350
#define but_y2 430
#define but_wid 150
#define but_len 60
#define title_x1 175
#define title_y1 20
#define title_x2 425
#define title_y2 190
//存储结构
typedef struct finalrecord_grade {
int n;
int choice=0;
int count;
int timeused;
int judge = 0;
}DATA;
DATA finalrecord[10] = { };
//按钮
typedef struct q {
int x1, y1, width, length;
} BUTTON;
BUTTON begin = { but_x,but_y0,but_wid,but_len };
BUTTON records = { but_x,but_y1,but_wid,but_len };
BUTTON logout = { but_x,but_y2,but_wid,but_len };
BUTTON choose33 = { but_x,but_y0,but_wid,but_len };
BUTTON choose44 = { but_x,but_y1,but_wid,but_len };
BUTTON choose55 = { but_x,but_y2,but_wid,but_len };
RECT b = { but_x,but_y0,but_x + but_wid,but_y0 + but_len };
RECT r = { but_x,but_y1,but_x + but_wid,but_y1 + but_len };
RECT e = { but_x,but_y2,but_x + but_wid,but_y2 + but_len };
RECT t = { title_x1,title_y1,title_x2,title_y2 };