说明:
1、扫雷小游戏,可以让大家更好的掌握对C语言的学习
2、让我们更加牢记使用变量(int 、char)和二维数组,函数声明和使用,加深影响
3、掌握C语言的分支结构(if - else 和switch语句)和循环结构(while 和for()的使用)
代码实现:
头文件:game.h
#ifndef _WINMINE_H
#define _WINMINE_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 //定义界面长宽
#define COL 9 //...............
#define ROWS ROW+2
#define COLS COL+2
#define EASYCOUNT 10 //定义雷的个数, 即游戏难度,也可以运用再测试,、
//初始化扫雷棋盘
void InitBoard(char board[ROWS][COLS],int rows, int cols,char set);
void DispalyBoard(char board[ROWS][COLS],int row, int col);
void SetMine(char mine[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int ros,int col);
#endif
主代码:game.c
#include <stdio.h>
#include "../include/winmine.h"
#define _CRT_SECURE_NO_WARNINGS 1
//数组初始化,设计展示界面
void InitBoard(char bord[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++)
{
bord[i][j] = set;// 可以更改为各种字符
}
}
}
//打印数组函数
void DispalyBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i = 0;i <= row;i++)
{
printf("%-2d",i);
}
printf("\n");
for(i = 1;i <= row;i++)
{
printf("%d",i);
for(j = 1;j <= col;j++)
{
printf("%2c",board[i][j]);
}
printf("\n");
}
}
//布置雷的函数
void SetMine(char mine[ROWS][COLS],int row,int col)
{
int count = EASYCOUNT; //难度
while(count)
{
int x = rand() % row + 1;
int y = rand() %col + 1;
if(mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
//返回值:在玩家输入坐标是,给坐标有没有雷,如果没有返回周围一圈的雷数
int GetmineCount(char mine[ROWS][COLS],int x,int y)
{
return (mine[x-1][y] + mine[x - 1][y-1] + mine[x][y - 1] \
+ mine[x + 1][y - 1] + mine[x + 1][y] + mine[x][y + 1] \
+ mine[x + 1][y + 1] + mine[x - 1][y + 1] - 8 *'0');
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int win = 0;
while(win - row*col-EASYCOUNT)
{
printf("请输入要排查的坐标:\n");
scanf("%d%d",&x,&y);
if(x >= 1 && x <= row && y >= 1 && y <= col)
{
if(mine[x][y] == '1')
{
printf("很不幸,你被打死了\n");
DispalyBoard(mine,row,col);
break;
}
else
{
int count = GetmineCount(mine,x,y);
show[x][y] = count + '0';
DispalyBoard(show, row,col);
win++;
}
if(win == row*col - EASYCOUNT)
{
printf("恭喜你已经通关了!!!!\n");
DispalyBoard(mine,row,col);
}
}
else
{
printf("请你注意输入范围,请重新输入:\n");
}
}
}
主函数:main.c
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include "../include/winmine.h"
//void menu()
menu()
{
printf("*******************\n");
printf("1--------------play\n");
printf("*******************\n");
printf("2---------------out\n");
printf("-1-------------exit\n");
printf("*******************\n");
printf("请输入选项\n");
}
//void game()
game()
{
//雷的信息存储
//1.布置好雷的信息
char mine[ROWS][COLS] = {0};
//2.排查出雷的信息
char show[ROWS][COLS] = {0};
//初始化
// InitBoard(mine,ROWS,COLS,'0');
// InitBoard(show,ROWS,COLS,'*');
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印棋盘:
DispalyBoard(mine,ROWS,COLS);
DispalyBoard(mine,ROWS,COLS);
//布置雷的位置
SetMine(mine,ROW,COL);
//打印布置好的雷
DispalyBoard(mine,ROW,COL);
//DispalyBoard(mine,show,ROW,COL);
FindMine(mine,show,ROW,COL);
}
//void test()
test()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("请根据菜单选择:>\n");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 2:
printf("退出游戏:>\n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
|