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

【机器学习】探索机器学习与人工智能:驱动未来创新的关键技术

探索机器学习与人工智能&#xff1a;驱动未来创新的关键技术 前言&#xff1a;人工智能的核心技术深度学习&#xff1a;自然语言处理&#xff08;NLP&#xff09;&#xff1a;计算机视觉&#xff1a; 机器学习与人工智能的驱动创新医疗健康领域金融行业智能制造与工业互联网智慧…...

React Refs 完整使用指南

React Refs 完整使用指南 1. Refs 基础用法 1.1 创建和访问 Refs // 类组件中使用 createRef class MyComponent extends React.Component {constructor(props) {super(props);this.myRef React.createRef();}componentDidMount() {// 访问 DOM 节点console.log(this.myRef…...

程控电阻箱应用中需要注意哪些安全事项?

程控电阻箱是一种用于精确控制电路中电流和电压的电子元件&#xff0c;广泛应用于电子实验、测试设备以及精密测量仪器中。在应用程控电阻箱时&#xff0c;为确保安全和设备的正常运行&#xff0c;需要注意以下几个安全事项&#xff1a; 1. 正确连接&#xff1a;确保电阻箱与电…...

C/C++基础知识复习(43)

1) 什么是运算符重载&#xff1f;如何在 C 中进行运算符重载&#xff1f; 运算符重载是指在 C 中为现有的运算符定义新的行为&#xff0c;使得它们能够用于用户定义的数据类型&#xff08;如类或结构体&#xff09;。通过运算符重载&#xff0c;可以让自定义类型像内置数据类型…...

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…...

VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Java开发环境搭建二、VScode下载及安装三、VSCode配置Java环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…...

PHP MySQL 插入多条数据

PHP MySQL 插入多条数据 在Web开发中&#xff0c;PHP和MySQL的组合是非常常见的。PHP是一种服务器端脚本语言&#xff0c;而MySQL是一种流行的数据库管理系统。在许多情况下&#xff0c;我们可能需要一次性向MySQL数据库插入多条数据。这可以通过几种不同的方法实现&#xff0…...

Oracle安装报错:将配置数据上载到资料档案库时出错

环境&#xff1a;联想服务器 windows2022安装Oracle11g 结论&#xff1a;禁用多余网卡先试试&#xff0c;谢谢。 以下是问题描述和处理过程&#xff1a; 网上处理方式: hosts文件添加如下&#xff1a; 关闭防火墙 暂时无法测试通过。 发现ping不是本地状态&#xff0c;而是…...

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能&#xff0c;JS中排序算法的使用详解&#xff08;附实际应用代码&#xff09; 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…...

Deformable DETR:Deformable Transformers for End-to-End Object Detection论文学习

1. 为什么提出了Deformable DETR&#xff1f; 因为DETR本身的计算量大&#xff0c;收敛速度慢。其次是小目标检测效果差。主要原因是Attention模块每次只关注一小部分采样点&#xff0c;导致需要很多轮数才能学习到真实需要关注的目标。 Deformable DETR注意力模块只关注一个…...