实时更新时间
文件存档
记录游戏时间来排名
#include "game.h"
//数据的操作
void CheckCapacity(Num* pc)
{
if (pc->size == pc->capacity)
{
Rank* tmp = (Rank*)realloc(pc->data, (pc->capacity * 2) * sizeof(Rank));
if (tmp != NULL)
{
pc->data = tmp;
}
else
{
perror("CheckCapacity::realloc");
exit(-1);
}
pc->capacity *= 2;
printf("增容成功\n");
}
}
void AddRank(Num* pc, double time)
{
assert(pc);
CheckCapacity(pc);
char name[20];
printf("请输入名字\n");
scanf("%s", pc->data[pc->size].name);
pc->data[pc->size].time = time;
pc->size++;
printf("上榜成功\n");
}
//读文件的数据
void LoadRank(Num* pc)
{
//打开文件
FILE* pf = fopen("rank.dat", "rb");
if (pf == NULL)
{
perror("LoadRank::fopen");
return 1;
}
//读文件
Rank tmp = { 0 };
while (fread(&tmp, sizeof(Rank), 1, pf))
{
CheckCapacity(pc);
pc->data[pc->size] = tmp;
pc->size++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//文件初始化
void InitRank(Num* pc)
{
assert(pc);
pc->capacity = 3;
pc->size = 0;
pc->data = (Rank*)malloc(pc->capacity * sizeof(Rank));
if (pc->data == NULL)
{
perror("InitRank;;malloc");
return;
}
memset(pc->data, 0, sizeof(Rank) * pc->capacity);
//加载信息
LoadRank(pc);
}
//保存数据到文件
void SaveRank(const Num* pc)
{
FILE* pf = fopen("rank.dat", "wb");
if (pf == NULL)
{
perror("SaveRank::open");
return 1;
}
int i = 0;
for (i = 0; i < pc->size; i++)
{
fwrite(pc->data + i, sizeof(Rank), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
//销毁文件,释放内存;
void RankDestory(Num* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->size = 0;
printf("销毁成功\n");
}
//排序
void SortRank(Num* pc)
{
int i = 0;
int j = 0;
Rank tmp;
for (i = 0; i < pc->size - 1; i++)
{
for (j = 0; j < pc->size - 1 - i; j++)
{
if (pc->data[j].time > pc->data[j + 1].time)
{
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
}
void FinRank(const Num* pc)
{
printf("是否需要查找您的成绩\n");
printf("1. 查找\n");
printf("0. 不需要\n");
int wheather = 0;
int i = 0;
int k = 0; //判断是否找到
char name[20];
scanf("%d", &wheather);
if (wheather == 1)
{
printf("请输入你的名字\n");
scanf("%s", name);
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp(name, pc->data[i].name))
{
printf("%s的最好排名是:\n", name);
printf(" 排名--名字----时间\n");
printf("%5d\t%-5s\t%-20lf\n", i + 1, pc->data[i].name, pc->data[i].time);
k = 1;
break;
}
}
if (k == 0)
{
printf("%s暂时没有排名\n", name);
}
}
printf("退出查找\n");
}
void PrintfRank(const Num* pc)//打印
{
system("cls");
assert(pc);
SortRank(pc);
int i = 0;
//判断是否为空
if (pc->size == 0)
{
printf("暂无排名\n");
return;
}
printf(" 排名--名字----时间\n");
for (i = 0; i < pc->size; i++)
{
printf("%5d\t%-10s\t%-10.2lf秒\n", i + 1, pc->data[i].name, pc->data[i].time);
}
//查找我的排名
FinRank(pc);
}
//游戏
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("-------------------------\n");
printf(" ");
for (int i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] != '1')
{
board[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int ret = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == '1')
{
ret++;
}
}
}
return ret;
}
void OpenOwn(char show[ROWS][COLS], char mine[ROWS][COLS],
int row, int col, int x, int y, int state[][COLS])
{
if (state[x][y] == 0)
{
state[x][y] = 1;
int count = GetMineCount(mine, x, y);
show[x][y] = '0' + count;
}
}
//展开
void OpenNeighbor(char show[ROWS][COLS], char mine[ROWS][COLS],
int row, int col, int x, int y, int state[][COLS])
{
if (state[x][y] == 0)
{
state[x][y] = 1;
int count1 = GetMineCount(mine, x, y);
show[x][y] = '0' + count1;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
if (state[i][j] == 0)
{
int count = GetMineCount(mine, i, j);
if (count != 0)
OpenOwn(show, mine, row, col, i, j, state);
else
OpenNeighbor(show, mine, row, col, i, j, state);
}
}
}
}
}
else
{
return;
}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, Num* pc)
{
int x, y;
double start, end, cost;
int wheather;
start = clock();
int win = 0;
int state[ROWS][COLS] = { 0 };
//一共有COL*ROW个格子,当我们排了COL*ROW-EASY_COUNT个格子的时候,扫雷就成功了
while (win < COL * ROW - EASY_COUNT)
{
//char whethermark[10] = { 0 };
int whethermark = 0;
//DisplayBoard(mine, ROW, COL); ///test
printf("请输入扫雷的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (mine[x][y] == '1')
{
printf("很不幸,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
if (count != 0)
{
win += 1;
OpenOwn(show, mine, ROW, COL, x, y, state);
system("cls");
DisplayBoard(show, ROW, COL);
//Sleep(2000);
}
else
{
OpenNeighbor(show, mine, row, col, x, y, state);
int nums = 0;
for (int i = 1; i <= ROW; i++)
{
for (int j = 1; j <= COL; j++)
{
if (state[i][j] == 1)
{
nums++;
}
}
}
win = nums;
system("cls");
DisplayBoard(show, ROW, COL);
//Sleep(2000);
}
while (1)
{
end = clock();
printf("已用时 %2.lf秒\n", (end - start) / 1000);
printf("是否要标记雷?\n");
printf("1.标记 \n");
printf("任意建继续\n");
scanf("%d", &whethermark);
if (whethermark == 1)
{
Mark(show, ROW, COL);
}
else
{
break;
}
}
}
}
else
{
printf("输入错误请重新输入\n");
}
}
if (win == COL * ROW - EASY_COUNT )// 当雷是八十个时出现bug
{
system("cls");
end = clock(); //记录时间
printf("恭喜你扫雷成功!\n");
DisplayBoard(mine, ROW, COL);
printf("您一共用时 %2.lf秒\n", (end - start) / 1000);
//记录排名
printf("是否记录成绩到排名\n");
printf("1. 金榜高悬姓子真,分明折得一枝春\n");
printf("2. 事了拂衣去,深藏功与名\n");
scanf("%d", &wheather);
if (wheather == 1)
{
system("cls");
printf("开始添加\n");
AddRank(pc, (end - start) / 1000.0);
PrintfRank(pc);
}
printf("再来一把?\n");
}
}
void Mark(char show[ROWS][COLS], int row, int col)
{
int x, y;
again:
printf("请输入要标记为雷的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
system("cls");
printf("标记成功\n");
show[x][y] = '#';
DisplayBoard(show, ROW, COL);
return;
}
else
{
printf("输入错误 请重新输入\n");
goto again;
}
}