1.扫雷游戏——————C初学者的简单版本
实现: ①难度选择,不同的雷数的计算方法产生不同的难度;
②第一次踩到雷不会跳出;
③如果坐标周围没有雷的时候,扩展坐标。
源代码:
game.h
//*Copyright(c) 2018,葵司
//*All rights reserved.
//*
//*文件名称:排雷游戏
//*
//*当前版本:1.1
//*作者:葵司
//*完成日期:2018年4月23日
//*
//*取代版本:1.0
//*作者:葵司
//*
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum OPTION
{
PLAY = 1,
EXIT = 2
};
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
extern int nume ;//置0和不置0有区别
extern int Spacenumber;
void interface();
int Choose(int a);
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void PrintBoard(char board[ROWS][COLS], int rows, int cols);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
int GetMineCount(char mine[ROWS][COLS], int x, int y);
void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y);
#endif//_GAME_H_
game.c
#include "game.h"
int nume;//全局变量定义
int Spacenumber;//全局变量定义
//初始化数组
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
//打印数组
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= row; j++)
{
printf("%-2d ", j);
}
printf("\n");
for (i = 0; i < row; i++)
{
printf("%-2d", i+1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
//设置炸弹
void SetMine(char board[ROWS][COLS])
{
int count =nume;
int x = 0;
int y = 0;
while (count)
{
x = rand() % ROW + 1;
y = rand() % COL + 1;
if ('0' == board[x][y])
{
board[x][y] = '1';//有雷的地方设置为字符1
count--;
}
}
}
//返回玩家输入坐标周围的雷数
static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int minecount = 0;
if (mine[x - 1][y] == '1')
minecount++;
if (mine[x - 1][y + 1] == '1')
minecount++;
if (mine[x - 1][y + 1] == '1')
minecount++;
if (mine[x][y + 1] == '1')
minecount++;
if (mine[x + 1][y + 1] == '1')
minecount++;
if (mine[x + 1][y] == '1')
minecount++;
if (mine[x + 1][y - 1] == '1')
minecount++;
if (mine[x][y - 1] == '1')
minecount++;
if (mine[x - 1][y - 1] == '1')
minecount++;
return minecount;
}
//利用函数递归调用实现的扩展函数
void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
{
if (0 == GetMineCount(mine, x, y))
{
show[x][y] = ' ';
Spacenumber++;
if (show[x][y - 1] == '*')
{
expand(mine, show, row, col, x, (y - 1));
}
if (show[x][y + 1] == '*')
{
expand(mine,show, row, col, x, (y + 1));
}
if (show[x - 1][y] == '*')
{
expand(mine, show, row, col, (x - 1), y);
}
if (show[x + 1][y] == '*')
{
expand(mine, show, row, col, (x + 1), y);
}
}
else
{
show[x][y] = GetMineCount(mine, x, y) + '0';
}
}
//找雷函数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int sum = 0;
int count = 0;
int ret = 0;
while (row*col-sum>nume)
{
printf("请输入您的坐标:");
scanf("%d%d", &x, &y);
printf("\n");
count++;
while (1 == (x >= 1 && x <= row && y >= 1 && y <= col))
{
sum++;
x--;
y--;
if ('1' == mine[x][y])
{
if (1 == count)//判断是否第一次就踩到雷了
{
printf("炸了!再给你一次机会!\n");
printf("\n");
break;
}
else
{
printf("恭喜你中奖了,你踩到雷了!GAME OVER!\n");
printf("\n");
return 0;
}
}
else
{
expand(mine, show, row, col, x, y);
PrintBoard(show, ROW, COL);
break;
}
if (0 == (x >= 1 && x <= row && y >= 1 && y <= col))
{
printf("输入非法!请重新输入!\n");
printf("\n");
}
}
}
if (row*col-sum == nume)
{
printf("恭喜你,扫雷成功!\n");
printf("\n");
}
}
find.c
#include "game.h"
int nume;//全局变量定义
int Spacenumber;//全局变量定义
//菜单函数
void MENU()
{
printf(" ##### \n");
printf(" ###### ###### \n");
printf(" ####### 1.PLAY ####### \n");
printf(" ####### 2.EXIT ####### \n");
printf(" ###### ###### \n");
printf(" ##### \n");
}
//选择界面
void interface()
{
printf("*********************************************************************\n");
printf("******************** 1.菜鸟 *************************************\n");
printf("******************** 2.高手 *************************************\n");
printf("******************** 3.老鸟 *************************************\n");
printf("*********************************************************************\n");
printf("\n");
}
//难度选择,返回不同的雷的数目
int Choose(int a)
{
switch (a)
{
case 1:
return ROW;
case 2:
return ROW + ROW / 2;
case 3:
return ROW * 2 ;
default:
{
printf("输入错误,请重新输入!");
break;
}
}
}
//游戏函数
void game()
{
char mine[ROWS][COLS] = { '0' };
char show[ROWS][COLS] = { '0' };
InitBoard(mine, ROW, COL, '0');//布雷的函数初始化为‘0’
InitBoard(show, ROWS, COLS, '*');//显示的函数初始化为‘0’
//PrintBoard(mine, ROW, COL);
PrintBoard(show, ROW, COL);
SetMine(mine,ROW,COL);//生成随机位置的雷
//PrintBoard(mine, ROW, COL);
FindMine(mine, show, ROW, COL);//找雷函数
}
//执行函数
void TEST()
{
srand((unsigned)time(NULL));
int input = 0;
int i = 0;
do
{
MENU();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
{
interface();
printf("请选择难度");
scanf("%d", &i);
nume= Choose(i);//全局变量赋予其雷的数目
game();
break;
}
case 2:
printf("您将退出游戏!\n");
break;
default:
printf("您输错了,请再输入!\n");
break;
}
} while (input);
}
//主函数
int main()
{
TEST();
system("pause");
return 0;
}
注:代码在VS2013上已运行,无误。
已知bug:(我也想改,但不会,所以会继续以优化-_+)
①:当游戏是 9*9 时,如果我把雷数设置成80个时,编译成功,但运行会出现问题
②..............
发现的问题:
①:全局变量在头文件中初始化为0和不为0效果不一样,待解决,
②............