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

C语言扫雷游戏教学(有图形界面)(提供源码+实验报告)(计时+排行榜+难度选择+登录注册+背景音乐)(涉及easyX库)

前言:

本篇文章篇幅较长,请根据自己的需求在目录上跳转对应内容哦!源码及实验报告的获取在文章的后面哦!本人代码水平不佳,希望本文章和项目能带给大家帮助!

目录

前言:

一.成果预览:

二.前期准备:

(1)编译器的下载安装

(2)easyX库的下载

三:功能实现

1.test.cpp

2.game.h

3.game.cpp

(1)全局变量

(2)账户界面

(3)注册

(4)登录

(5)图片加载

(6)图形界面按钮设计

(7)游戏菜单

(8)游戏规则

(9)游戏难度菜单

(10)初级难度

(11)中级难度

(12)困难难度

(13)扫雷面板初始化

(14)扫雷面板打印

(15)设置地雷

(16)地雷个数

(17)加密扫雷面板

(18)解密并打印扫雷面板

(19)排除地雷以及重新或退出游戏

(20)判定选中格是否为雷区

(21)胜利界面

(22)失败界面

(23)排行榜写入

(24)排行榜读取

(25)结束游戏

四.下载源码后如何个性化配置及启动运行项目

1.个性化配置

2.启动运行项目

五.源码及实验报告获取

1.实验报告获取

​编辑 2.源码获取


一.成果预览:

下面放一些扫雷游戏的最终成果图片:

二.前期准备:

(1)编译器的下载安装

        首先请各位最好统一编程工具,我是使用VS2022来完成这一个扫雷游戏的制作的,所以接下来的教学都是以VS2022进行的!如果你使用Dec、小熊猫或者其他编译器 ,可能会有不方便的地方。但是如果你不想换编译器那么也不强求,自己用的习惯就好!

下面是VS编译器的下载安装使用教学:https://www.bilibili.com/video/BV11R4y1s7jz/?spm_id_from=333.337.search-card.all.click

大家可以先去下载安装VS2022编译器

(2)easyX库的下载

        本次扫雷游戏是图形界面版的,我们如果想要完成图形界面版的扫雷,那么必须下载easyX库。下载地址如下,请先自行下载!

https://easyx.cn/

下载完成后记得安装到VS2022编译器上 

注意在VS内创建的项目必须是.cpp后缀的项目,否则easyX无法正常使用!!!

三:功能实现

这一部分就主要教学扫雷游戏的做法!

代码分为三个模块,分别为test.cpp,game.cpp,test.cpp

这三个模块分别有什么作用呢:

test.cpp: 这部分为代码的主程序,程序从这里开始执行

game.h:这部分为代码函数的声明,在代码中我们用到的函数都需要在这里声明

game.cpp:这部分为代码函数的具体实现内容,在代码中我们的函数操作在这里执行

这三个部分构成了一个完整的扫雷项目,这样做的好处就是能够更有逻辑性的管理我们的项目和代码!

下面我将各部分的代码展示给各位:

1.test.cpp

#define _CRT_SECURE_NO_WARNINGS 1
# include "game.h"
int main()
{mciSendString("open ./卡农.mp3", NULL, 0, NULL);  mciSendString("play ./卡农.mp3 repeat", NULL, 0, NULL);srand((unsigned int)time(NULL));user();mciSendString("stop ./卡农.mp3", NULL, 0, NULL);return 0;
}

2.game.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <string.h>
#include <graphics.h>
#include <conio.h>
#include <Ctype.h>
#include <mmsystem.h>//包含多媒体接口
#pragma comment(lib,"winmm.lib")//处理接口
#define SIZE 35//登录注册页面
void user();//登录
void login();//注册
void enroll();//游戏菜单函数声明
void meau();//游戏规则函数声明
void rule();//游戏难度函数声明
void difficult_meau();//游戏主程序函数声明
void game_easy();
void game_middle();
void game_terrible();//初始化
void Intboard(int arr[32][24],int x, int y);//打印面板
void Printboard(int arr[32][24],IMAGE img[12],int x, int y);//设置地雷
void Setboom(int arr[32][24], int arr1[32][24],int x, int y, int boom_num);//寻找地雷
int Findboom(int arr[32][24],int x,int y);//图形界面按钮文字打印设计
void button(int x, int y, int w, int h, TCHAR* text);//加载图片
void img_load(IMAGE img[15]);//地雷数量
void boom_arround(int arr[32][24],int x,int y);//加密
void password(int arr[32][24], int x, int y);//判定
int judgeboom(int arr[32][24], int i, int j);//直接退出
void ending();//解密打印
void word(int arr[32][24], int arr1[32][24],int x,int y);//胜利判定
void judge_boom_win(int count,int arr[32][24],IMAGE img[12], int x, int y);//失败判定
void judge_boom_def(int count, int arr[32][24], IMAGE img[12], int x, int y);//排行榜写入
void write_rank(int x,int y);//排行榜读取
void read_rank();

3.game.cpp

(1)全局变量

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//全局变量
FILE* fd;
FILE* fp;
FILE* fq;
FILE* fr;
char name_login[20] = { 0 };struct rank
{char name[30];int time;
};struct user
{char name[30];char password[30];
};
struct user read;
struct user write;
clock_t Start_time;
clock_t End_time;
int time_rank;
char str[100];

(2)账户界面

//账户界面
void user()
{IMAGE image1;initgraph(2560, 1440);setorigin(0, 0);loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);TCHAR s[50] = "1.登录";TCHAR s1[50] = "2.注册";TCHAR s2[50] = "3.退出游戏";button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);ExMessage msg;while (1){if ((peekmessage(&msg, EM_MOUSE))){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 300 && msg.y <= 300 + 50){login();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 400 && msg.y <= 400 + 50){enroll();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 500 && msg.y <= 500 + 50){ending();break;}}}}
}

(3)注册

void enroll()
{int number = 0;closegraph();fd = fopen("user.txt", "r+");fseek(fd, 0, SEEK_END);InputBox(write.name, 50, "请输入账号", "注册",0,0);InputBox(write.password, 50, "请输入密码", "注册",0,0);number = fwrite(write.name, sizeof(write.name), 1, fd); if (number == 0){MessageBox(0, "账户用户名注册失败,请重试", "Caption", MB_OK);}number = fwrite(write.password, sizeof(write.password), 1, fd); if (number == 0){MessageBox(0, "账户密码注册失败,请重试", "Caption", MB_OK);}fclose(fd);user();
}

(4)登录

//登录
void login()
{closegraph();int number = 0;char password[20] = {0};InputBox(name_login, 50, "请输入用户名", "登录",0,0);InputBox(password, 50, "请输入密码", "登录",0,0);fd = fopen("user.txt", "a+");fseek(fd, 0, SEEK_SET);while (1){number = fread(read.name, sizeof(read.name), 1, fd);if (number == 0){MessageBox(0, "用户名或密码错误,请重试", "error", MB_OK);user();break;}number = fread(read.password, sizeof(read.password), 1, fd);if (number == 0){MessageBox(0, "用户名或密码错误,请重试", "error", MB_OK);user();break;}if (strcmp(name_login, read.name) == 0 && strcmp(password, read.password) == 0){MessageBox(0, "登录成功", "Welcome", MB_OK);fclose(fd);meau();break;}}fclose(fd);
}

(5)图片加载

void img_load(IMAGE img[15])
{loadimage(&img[0], "./boom_picture/0.jpg", 35, 35);loadimage(&img[1], "./boom_picture/1.jpg", 35, 35);loadimage(&img[2], "./boom_picture/2.jpg", 35, 35);loadimage(&img[3], "./boom_picture/3.jpg", 35, 35);loadimage(&img[4], "./boom_picture/4.jpg", 35, 35);loadimage(&img[5], "./boom_picture/5.jpg", 35, 35);loadimage(&img[6], "./boom_picture/6.jpg", 35, 35);loadimage(&img[7], "./boom_picture/7.jpg", 35, 35);loadimage(&img[8], "./boom_picture/8.jpg", 35, 35);loadimage(&img[9], "./boom_picture/9.jpg", 35, 35);loadimage(&img[10], "./boom_picture/10.jpg", 35, 35);loadimage(&img[11], "./boom_picture/flag.jpg", 35, 35);loadimage(&img[12], "./boom_picture/black.jpg", 140, 35);
}

(6)图形界面按钮设计

//图形界面按钮文字打印设计
void button(int x, int y, int w, int h, TCHAR* text)
{setbkmode(TRANSPARENT);setfillcolor(GREEN);fillroundrect(x, y, x + w, y + h, 10, 10);settextstyle(30, 0, "黑体");int tx = x + (w - textwidth(text)) / 2;int ty = y + (h - textheight(text)) / 2;outtextxy(tx, ty, text);
}

(7)游戏菜单

//游戏菜单
void meau()
{closegraph();IMAGE image1;initgraph(2560, 1440);setorigin(0, 0);loadimage(&image1, "./boom_picture/background.jpg",1706,950);putimage(0, 0, &image1);TCHAR s[50] = "1.开始游戏";TCHAR s1[50] = "2.游戏规则";TCHAR s2[50] = "3.退出游戏";TCHAR s3[50] = "4.排行榜";button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);button(1100, 600, 170, 50, s3);ExMessage msg;while (1){if (peekmessage(&msg, EM_MOUSE)){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 300 && msg.y <= 300 + 50){difficult_meau();meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 400 && msg.y <= 400 + 50){rule();meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 600 && msg.y <= 600 + 50){read_rank();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 500 && msg.y <= 500 + 50){ending();}}}}
}

(8)游戏规则

//游戏规则
void rule()
{int number = 0;IMAGE image1;initgraph(1706, 1280);setorigin(0, 0);loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);TCHAR s[80] = "随便点开一个方格根据展开方格的数字去";TCHAR s1[80] = "推断其相邻九宫格内未展开方格下面是否是地雷";TCHAR s2[100] = "最终任务就是点开所有没有地雷的方格,以找出所有的地雷。";TCHAR s3[80] = "注意:如果不小心点到雷,那么游戏结束!";TCHAR s4[50] = "返回";button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);button(1100, 600, 170, 50, s3);button(1100, 700, 170, 50, s4);ExMessage msg;while (1){if (peekmessage(&msg, EM_MOUSE)){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 700 && msg.y <= 700 + 50){number = 1;closegraph();break;}}if (number == 1){break;}}}
}

(9)游戏难度菜单

//游戏难度菜单
void difficult_meau()
{int number = 0;IMAGE image1;initgraph(1706, 1280);setorigin(0, 0);loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);TCHAR s[50] = "1.初级";TCHAR s1[50] = "2.中级";TCHAR s2[50] = "3.高级";TCHAR s3[50] = "4.返回";button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);button(1100, 600, 170, 50, s3);ExMessage msg;while (1){if ((peekmessage(&msg, EM_MOUSE))){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 300 && msg.y <= 300 + 50){number = 1;game_easy();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 400 && msg.y <= 400 + 50){number = 1;game_middle();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 500 && msg.y <= 500 + 50){number = 1;game_terrible();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 600 && msg.y <= 600 + 50){number = 1;closegraph();meau();break;}}if (number == 1){break;}}}
}

(10)初级难度

void game_easy()
{int tran = 1;int arr[11][24];IMAGE img[15];img_load(img);int x = 11;int y = 11;IMAGE image1;initgraph((x-1) * SIZE, (y+5) * SIZE);TCHAR s1[50] = "重新开始";TCHAR s2[50] = "返回";TCHAR s3[50] = "用时:";button(35, 400, 115, 50, s1);button(190, 400, 115, 50, s2);button(65, 500, 110, 50, s3);int boom_num = 10;int arr1[11][24];int count = (x - 1) * (y - 1) - boom_num;Intboard(arr1, x, y);Setboom(arr1,arr, x, y, boom_num);Start_time = clock();while (1){End_time = clock();time_rank = (int)((End_time - Start_time) / CLOCKS_PER_SEC);settextstyle(30, 0, "宋体");setcolor(WHITE);sprintf_s(str, " %d s", time_rank);outtextxy(185, 510, str);//Sleep(1);int change = 0;Printboard(arr1, img, x, y);change = Findboom(arr1,x, y);if (change == 6){count--;tran--;}judge_boom_win(count, arr, img, x, y);if (change == 12){if (tran == 1){Intboard(arr1, x, y);Setboom(arr1,arr, x, y, boom_num);}else{judge_boom_def(count, arr, img, x, y);}}}
}

(11)中级难度

//中级难度
void game_middle()
{int tran = 1;int arr[32][24];IMAGE img[15];img_load(img);int x = 18;int y = 18;IMAGE image1;initgraph((x-1) * SIZE, (y+3) * SIZE);TCHAR s1[50] = "重新开始";TCHAR s2[50] = "返回";TCHAR s3[50] = "用时:";button(35, 630, 115, 50, s1);button(190, 630, 115, 50, s2);button(355, 630, 90, 50, s3);int boom_num = 40;int arr1[18][24];int count = (x - 1) * (y - 1) - boom_num;Intboard(arr1, x, y);Setboom(arr1,arr,x, y, boom_num);Start_time = clock();while (1){End_time = clock();time_rank = (int)((End_time - Start_time) / CLOCKS_PER_SEC);settextstyle(30, 0, "宋体");setcolor(WHITE);sprintf_s(str, " %d s", time_rank);outtextxy(455, 640, str);//Sleep(1);int change = 0;Printboard(arr1, img, x, y);change = Findboom(arr1,  x, y);if (change == 6){count--;tran--;}judge_boom_win(count, arr, img, x, y);if (change == 12){if (tran == 1){Intboard(arr1, x, y);Setboom(arr1,arr, x, y, boom_num);}else{judge_boom_def(count, arr, img, x, y);}}}
}

(12)困难难度

//困难难度
void game_terrible()
{int tran = 1;int arr[32][24];IMAGE img[15];img_load(img);int x = 24;int y = 24;IMAGE image1;initgraph((x+5) * SIZE, (y-1) * SIZE);TCHAR s1[50] = "重新开始";TCHAR s2[50] = "返回";TCHAR s3[50] = "用时:";button(840, 35, 115, 50, s1);button(840, 125, 115, 50, s2);button(840, 215, 90, 50, s3);int boom_num = 70;int arr1[24][24];int count = (x - 1) * (y - 1) - boom_num;Intboard(arr1, x, y);Setboom(arr1, arr,x, y, boom_num);Start_time = clock();while (1){End_time = clock();time_rank = (int)((End_time - Start_time) / CLOCKS_PER_SEC);settextstyle(30, 0, "宋体");setcolor(WHITE);sprintf_s(str, " %d s", time_rank);outtextxy(840, 310, str);//	Sleep(1);int change = 0;Printboard(arr1, img, x, y);change = Findboom(arr1,x, y);if (change == 6){count--;tran--;}judge_boom_win(count, arr, img, x, y);if (change == 12){//如果第一次踩到雷,那么直接重开一局if (tran == 1){Intboard(arr1, x, y);Setboom(arr1,arr,x, y, boom_num);}//反之如果不是在第一次踩到雷,那么游戏结束else{judge_boom_def(count, arr, img, x, y);}}}
}

(13)扫雷面板初始化

//初始化
void Intboard(int arr[32][24],int x, int y)
{int i = 0;int j = 0;for (i = 0; i < x; i++){for (j = 0; j < y; j++){arr[i][j] = 0;}}
}

(14)扫雷面板打印

//打印扫雷面板
void Printboard(int arr[32][24],IMAGE img[12],int x, int y)
{int i = 0;int j = 0;for (i = 0; i < x; i++){for (j = 0; j < y; j++){if (arr[i][j] == -1){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);}else if (arr[i][j] >= 0 && arr[i][j] <= 8){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[arr[i][j]]);}else if (arr[i][j] >= 19 && arr[i][j] <= 28){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);}else if (arr[i][j] > 30){putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);}}}if (x == 11 && y == 11){putimage(185, 510, &img[12]);}if (x == 18 && y == 18){putimage(455, 640, &img[12]);}if (x == 24 && y == 24){putimage(840, 310, &img[12]);}
}

(15)设置地雷

//设置地雷
void Setboom(int arr[32][24],int arr1[32][24],int x, int y, int boom_num)
{while (boom_num){int i = (rand() % (x - 2)) + 1;int j = (rand() % (y - 2)) + 1;if (arr[i][j] == 0){arr[i][j] = -1;boom_arround(arr, i, j);boom_num--;}}word(arr1, arr, x, y);password(arr, x, y);
}

(16)地雷个数

//地雷个数
void boom_arround(int arr[32][24], int x, int y)
{int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (i != x || j != y){arr[i][j] = arr[i][j] + 1;}}}
}

(17)加密扫雷面板

//加密
void password(int arr[32][24], int x, int y)
{int i = 0;int j = 0;for (i = 0; i < x; i++){for (j = 0; j < y; j++){arr[i][j] = arr[i][j] + 20;}}
}

(18)解密并打印扫雷面板

//解密打印
void word(int arr[32][24], int arr1[32][24], int x, int y)
{int i = 0;int j = 0;for (i = 0; i < x; i++){for (j = 0; j < y; j++){arr[i][j] = arr1[i][j];}}
}

(19)排除地雷以及重新或退出游戏

//排除地雷以及重新游戏退出游戏
int Findboom(int arr[32][24],int x,int y)
{int change = 0;if (MouseHit()){MOUSEMSG msg = GetMouseMsg();int i = (msg.x) / SIZE + 1;int j = (msg.y) / SIZE + 1;int m = arr[i][j];switch (msg.uMsg){case WM_LBUTTONDOWN:if (x == 11 && y == 11){if (msg.x >= 35 && msg.x <= 35 + 115 && msg.y >= 400 && msg.y <= 400 + 50){difficult_meau();break;}if (msg.x >= 190 && msg.x <= 190 + 115 && msg.y >= 400 && msg.y <= 400 + 50){meau();}}if (x == 18 && y == 18){if (msg.x >= 35 && msg.x <= 35 + 115 && msg.y >= 630 && msg.y <= 630 + 50){difficult_meau();break;}if (msg.x >= 190 && msg.x <= 190 + 115 && msg.y >= 630 && msg.y <= 630 + 50){meau();}}if (x == 24 && y == 24){if (msg.x >= 840 && msg.x <= 840 + 115 && msg.y >= 35 && msg.y <= 35 + 50){difficult_meau();break;}if (msg.x >= 840 && msg.x <= 840 + 115 && msg.y >= 125 && msg.y <= 125 + 50){meau();}}if (m >= 19 && m <= 48){arr[i][j] = arr[i][j] - 20;change = 1;}break;case WM_RBUTTONDOWN:if (m >= 19 && m <= 28){arr[i][j] = arr[i][j] + 20;change = 1;}break;}if (change == 1){change = judgeboom(arr,i, j);return change;}}}

(20)判定选中格是否为雷区

//判定
int judgeboom(int arr[32][24],int i,int j)
{if (arr[i][j] >= 0 && arr[i][j] <= 9){return 6;}if (arr[i][j] == -1){return 12;}
}

(21)胜利界面

//胜利界面
void judge_boom_win(int count,int arr[32][24],IMAGE img[12],int x,int y)
{if (count == 0){closegraph();IMAGE imge;initgraph(x * SIZE, y * SIZE);Printboard(arr, img, x, y);initgraph(1706, 1280);setorigin(0, 0);IMAGE image1;loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);TCHAR s[80] = "游戏胜利!";TCHAR s1[50] = "再来一局";TCHAR s2[50] = "返回";TCHAR s3[50] = "用时:";TCHAR s4[30] = "排行榜";TCHAR s5[30];button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);button(1100, 600, 170, 50, s3);button(1100, 700, 170, 50, s4);sprintf_s(s5, " %d s", time_rank);button(1300, 600, 170, 50, s5);write_rank(x,y);ExMessage msg;while (1){if (peekmessage(&msg, EM_MOUSE)){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 400 && msg.y <= 400 + 50){difficult_meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 500 && msg.y <= 500 + 50){meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 600 && msg.y <= 600 + 50){closegraph();Printboard(arr,img,x,y);break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 700 && msg.y <= 700 + 50){read_rank();break;}}}}}
}

(22)失败界面

//失败界面
void judge_boom_def(int count, int arr[32][24], IMAGE img[12], int x, int y)
{int number = 0;initgraph(1706, 1280);setorigin(0, 0);IMAGE image1;loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);IMAGE image2;Printboard(arr, img, x, y);TCHAR s[80] = "你碰到了雷,游戏失败!";TCHAR s1[50] = "再来一局";TCHAR s2[50] = "返回";TCHAR s3[30] = "排行榜";button(1100, 300, 170, 50, s);button(1100, 400, 170, 50, s1);button(1100, 500, 170, 50, s2);button(1100, 600, 170, 50, s3);ExMessage msg;while (1){if (peekmessage(&msg, EM_MOUSE)){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 400 && msg.y <= 400 + 50){difficult_meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 500 && msg.y <= 500 + 50){meau();break;}if (msg.x >= 1100 && msg.x <= 1100 + 170 && msg.y >= 600 && msg.y <= 600 + 50){read_rank();break;}}}}
}

(23)排行榜写入

//排行榜写入
void write_rank(int x,int y)
{struct rank tmp;char ch[10] = "---------";if (x == 11 && y == 11){fp = fopen("rank.txt", "r+");fscanf(fp, "%s %d", &tmp.name, &tmp.time);if (time_rank < tmp.time){rewind(fp);fprintf(fp, "%s %d %s", name_login, time_rank, ch);}fclose(fp);}if (x == 18 && y == 18){fq = fopen("rank_middle.txt", "r+");fscanf(fq, "%s %d", &tmp.name, &tmp.time);if (time_rank < tmp.time){rewind(fq);fprintf(fq, "%s %d %s", name_login, time_rank, ch);}fclose(fq);}if (x == 24 && y == 24){fr = fopen("rank_terrible.txt", "r+");fscanf(fr, "%s %d", &tmp.name, &tmp.time);if (time_rank < tmp.time){rewind(fr);fprintf(fr, "%s %d %s", name_login, time_rank, ch);}fclose(fr);}
}

(24)排行榜读取

//排行榜读取
void read_rank()
{closegraph();IMAGE image1;initgraph(2560, 1440);setorigin(0, 0);loadimage(&image1, "./boom_picture/background.jpg", 1706, 950);putimage(0, 0, &image1);TCHAR s[30] = "游戏排行榜";TCHAR s1[30] = "初级TOP1:";TCHAR s2[30] = "中级TOP1:";TCHAR s3[30] = "高级TOP1:";TCHAR s4[30] = "用户名";TCHAR s5[30] = "用时";TCHAR s6[30];TCHAR s7[30];TCHAR s8[30];TCHAR s9[30];TCHAR s10[30];TCHAR s11[30];TCHAR s12[30] = "返回";button(1100, 50, 150, 50, s);button(600, 250, 150, 50, s1);button(600, 450, 150, 50, s2);button(600, 650, 150, 50, s3);button(850, 150, 150, 50, s4);button(1350, 150, 150, 50, s5);button(1100, 750, 150, 50, s12);struct rank tmp[4];fp = fopen("rank.txt", "r");fscanf(fp, "%s %d", &tmp[0].name, &tmp[0].time);fq = fopen("rank_middle.txt", "r");fscanf(fq, "%s %d", &tmp[1].name, &tmp[1].time);fr = fopen("rank_terrible.txt", "r");fscanf(fr, "%s %d", &tmp[2].name, &tmp[2].time);strcpy(s6, tmp[0].name);strcpy(s8, tmp[1].name);strcpy(s10, tmp[2].name);sprintf_s(s7, " %d s", tmp[0].time);sprintf_s(s9, " %d s", tmp[1].time);sprintf_s(s11, " %d s", tmp[2].time);button(850, 250, 150, 50, s6);button(1350, 250, 150, 50, s7);button(850, 450, 150, 50, s8);button(1350, 450, 150, 50, s9);button(850, 650, 150, 50, s10);button(1350, 650, 150, 50, s11);ExMessage msg;while (1){if (peekmessage(&msg, EM_MOUSE)){switch (msg.message){case WM_LBUTTONDOWN:if (msg.x >= 1100 && msg.x <= 1100 + 150 && msg.y >= 750 && msg.y <= 750 + 50){meau();break;}}}}fclose(fp);fclose(fq);fclose(fr);
}

(25)结束游戏

//直接结束
void ending(){closegraph();exit(5181);}

四.下载源码后如何个性化配置及启动运行项目

1.个性化配置

我们首先进入源码文件的这个目录下,大家可以看见项目所用的一些图片

 大家如果想更换这些图片,就将新的图片放入该文件夹中,随后改成原文件的对应名字即可!!

如果想更换背景音乐,那么进入这个目录下

随后在test.cpp中,更改自己新加入音乐的名字或地址即可 

2.启动运行项目

首先下载并打开VS

选择打开本地文件夹,随后选中源码文件中的game_mine.sln即可打开

 随后点击调试,在点击开始执行即可运行程序

五.源码及实验报告获取

1.实验报告获取

本实验报告为该项目配套文档,内容包括设计目的、设计内容与要求、设计思路、实验过程、结论与改进五大部分内容!!!本实验报告共计8700余字共23页文档内容。实验报告的内容图文并茂内含大量思维导图及流程图并且已排版到位!在实验报告中,项目的各个模块都有详细说明和介绍,是作者下足心血和功夫编写的配套实验报告!!!下面是配套实验报告的部分内容截图,想获取完整的实验报告文档原件,请加wx:zck2020090062获取!!!

 

 

 

 

 2.源码获取

话不多说,直接给大家分享出来源码,希望对大家有所帮助!需要实验报告的请加wx:zck2020090062获取!!!上面有配套实验报告的介绍和部分内容截图,需要的小伙伴记得加wx获取哦!!!

通过网盘分享的文件:game_mine
链接: https://pan.baidu.com/s/1wnEvZ1Cy8eHPBtvqjxR6oQ?pwd=qing 提取码: qing

相关文章:

C语言扫雷游戏教学(有图形界面)(提供源码+实验报告)(计时+排行榜+难度选择+登录注册+背景音乐)(涉及easyX库)

前言&#xff1a; 本篇文章篇幅较长&#xff0c;请根据自己的需求在目录上跳转对应内容哦&#xff01;源码及实验报告的获取在文章的后面哦&#xff01;本人代码水平不佳&#xff0c;希望本文章和项目能带给大家帮助&#xff01; 目录 前言&#xff1a; 一.成果预览&#x…...

第五节:GLM-4v-9b模型model加载源码解读(模型相关参数方法解读)

文章目录 前言一、GLM-4v-9b模型model加载源码解读1、GLM-4v-9b模型model加载主函数源码2、GLM-4v-9b模型model加载源码源码解读3、GLM-4v-9b自定义模型类源码解读 二、基于GLM-4v-9b模型获取模型输入参数等内容源码解读(from_pretrained-->huggingface)1、from_pretrained函…...

面试经验分享 | 北京渗透测试岗位

更多大厂面试经验的视频经验分享看主页 目录&#xff1a; 所面试的公司&#xff1a;安全大厂 所在城市&#xff1a;北京 面试职位&#xff1a;渗透测试工程师 面试方式&#xff1a;腾讯会议线上面试线下面试 面试过程&#xff1a; 面试官的问题&#xff1a; 1、说一下XSS有哪…...

unity Toggle制作滑动开关

先上效果图 重点是这个Graphic要清空,不然显示不能直接切换,会消失 using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class SwitchToggle : MonoBehaviour {public RectTransform handleRect;public float duration 0.5f;private Vector2 handlePos;To…...

全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式

目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…...

【unity】【游戏开发】Unity项目一运行就蓝屏报Watch Dog Timeout

【背景】 由于是蓝屏所以没法截屏&#xff0c;总之今天遇到了一开Unity&#xff0c;过一阵就蓝屏的情况&#xff0c;报Watch Dog Timeout。 【分析】 通过任务管理器查看&#xff0c;发现Unity占用率100%&#xff0c;再观察Unity内部&#xff0c;每次右下角出现一个Global I…...

【macos java反编译工具Java Decompiler】

mac上能用的反编译工具 https://java-decompiler.github.io/...

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

脑肿瘤检测数据集,对9900张原始图片进行YOLO,COCO,VOC格式的标注

脑肿瘤检测数据集&#xff0c;对9900张原始图片进行YOLO&#xff0c;COCO&#xff0c;VOC格式的标注 数据集分割 训练组 70&#xff05; 6930图片 有效集 20&#xff05; 1980图片 测试集 10&#xff05; 990图片 预处理 静态裁剪&#xff1a; 24-82&…...

Adversarial Machine Learning(对抗机器学习)

之前把机器学习&#xff08;Machine Learning&#xff09;的安全问题简单记录了一下&#xff0c;这里有深入研究了一些具体的概念&#xff0c;这里记录一下方便以后查阅。 Adversarial Machine Learning&#xff08;对抗机器学习&#xff09; Adversarial Examples 相关内容Eva…...

每日十题八股-2024年12月23日

1.MySQL如何避免重复插入数据&#xff1f; 2.CHAR 和 VARCHAR有什么区别&#xff1f; 3.Text数据类型可以无限大吗&#xff1f; 4.说一下外键约束 5.MySQL的关键字in和exist 6.mysql中的一些基本函数&#xff0c;你知道哪些&#xff1f; 7.SQL查询语句的执行顺序是怎么样的&…...

Android Studio新建项目在源码中编译

新建空白项目 用AS新建默认空项目&#xff0c;代码目录如下&#xff1a; MyApplication$ tree -L 4 . ├── Android.bp // bp编译脚本 ├── Android.mk.bak // mk编译脚本 ├── app // 下面目录结构是AS新建工程目录 │ ├── build.gradle │ ├── pro…...

ubuntu使用ffmpeg+ZLMediaKit搭建rtsp推流环境

最方便的方式&#xff0c;ubuntu上安装vlc播放器&#xff0c;通过vlc来推流&#xff0c;在网上有很多教程。这里采用ffmpegZLMediaKit 必备条件&#xff1a; 1、安装ffmpeg 2、安装ZLMediaKit 一、安装ffmpeg sudo apt update sudo apt install ffmpeg 二、安装ZLMediaKit…...

vue中的css深度选择器v-deep 配合!important

当 <style> 标签有 scoped 属性时&#xff0c;它的 CSS 只作用于当前组件中的元素&#xff0c;父组件的样式将不会渗透到子组件。 如果你希望 scoped 样式中的一个选择器能够作用得“更深”&#xff0c;例如影响子组件&#xff0c;你可以使用深度选择器。 ::v-deep { } 举…...

Python读写JSON文件

import jsondef writeJSONFile(self):with open(g_updateFilePath, "w" encodingutf-8) as fiel:json.dump(dictData, fiel, indent4, ensure_asciiFalse)fiel.close()def readJsonToDict(file):with open(file, r, encodingutf-8) as f: # 确保文件以 UTF-8 编码打…...

重温设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…...

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…...

linux蓝牙模块和手机配对

在 Linux 系统下&#xff0c;将蓝牙模块与手机配对和连接通常涉及以下几个步骤。以下是详细的步骤和命令&#xff0c;帮助你实现蓝牙模块与手机的配对和连接。 1. 确认蓝牙服务已启动 首先&#xff0c;确保蓝牙服务已在 Linux 系统上运行。 systemctl status bluetooth如果服…...

dockerfile文档编写(1):基础命令

目录 Modelscope-agentARGFROMWORKDIRCOPYRUNENVCMD run_loopy Modelscope-agent ARG BASE_IMAGEregistry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.12.0FROM $BASE_IMAGEWORKDIR /home/workspaceCOPY . /hom…...

在 Go 中利用 ffmpeg 进行视频和音频处理

在 Go 中利用 ffmpeg 进行视频和音频处理 ffmpegutil 包概述主要功能介绍1. 视频格式转换2. 提取音频3. 获取视频信息4. 创建视频缩略图5. 提取随机帧无线程版本&#xff1a;多线程版本&#xff1a; 总结 ffmpeg 是一款功能强大的多媒体处理工具&#xff0c;支持视频和音频的编…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...