当前位置: 首页 > 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;支持视频和音频的编…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...