扫雷

来源:互联网 发布:电脑桌面工作提醒软件 编辑:程序博客网 时间:2024/06/10 09:36

这个游戏代码我分为三个模块1.头文件2.游戏函数3.测试函数

头文件

#ifndef _GAME_H__
#define _GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define easy 10
#define row 9
#define col 9
#define rows row+2
#define cols col+2
void menu();
void game();
void test();
void init(char arr[rows][cols], int x, int y, char set);
void print(char arr[rows][cols], int x, int y);
void setmine(char arr[rows][cols], int x, int y);
void found(char arr[rows][cols], char arr2[rows][cols], int i,int j);
int mycount(char arr[rows][cols],int x,int y);
#endif //_GAME_H__

游戏模块

#include"game.h"
void menu()
{
 printf("***********************************\n");
 printf("******1.play            0.exit*****\n");
 printf("***********************************\n");
}
void game()
{
 char mine[rows][cols] = { 0 };
 char show[rows][cols] = { 0 };
 init(mine, rows, cols, '0');
 init(show, rows, cols, '*');
 //设置雷
 setmine(mine, row, col);
 print(mine, row, col);
 print(show, row, col);
 //排查雷
 found(mine, show, row, col);
}
void test()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
  menu();
  printf("请选择:");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   break;
  default:
   printf("选择错误,请重新选择!\n");
   break;
  }
 } while (input);
}
void init(char arr[rows][cols], int x, int y, char set)
{
 int i = 0, j = 0;
 for (i = 0; i < x; i++)
 {
  for (j = 0; j < y; j++)
  {
   arr[i][j] = set;
  }
 }
}
void print(char arr[rows][cols], int x, int y)
{
 int i = 0, j = 0;
 for (i = 0; i <= y; i++)
 {
  printf("%d ", i);
  if (i == y)
   printf("\n");
 }
 for (i = 1; i <=x; i++)
 {
  printf("%d ", i);
  for (j = 1; j <=y; j++)
  {
   printf("%c ", arr[i][j]);
  }
  printf("\n");
 }
 printf("\n");
}
void setmine(char arr[rows][cols], int x, int y)
{
 int count = easy;
 while (count)
 {
  int i = rand() % 9 + 1;
  int j = rand() % 9 + 1;
  if (arr[i][j] == '0')
  {
   arr[i][j] = '1';
   count--;
  }
    
 }
}
void found(char arr[rows][cols], char arr1[rows][cols], int x, int y)//arr是mine的二维数组,arr1是show的二维数组
{
 int i= 0, j = 0;
 int jisu = 0;
 while (jisu<(row*col-easy))
 {
  printf("请输入要排查的坐标:");
  scanf("%d%d",&j,&i );
  if (i>= 1 && i <= row&&j>= 1 && j < col)
  {
   if (arr[i][j] == 1)
   {
    printf("很遗憾,游戏结束\n");
    print(arr, row, col);
    break;
   }
   else
   {
    //统计x,y周围有几个雷
    int count = mycount(arr,i,j);
    arr1[i][j] = count+'0';
    print(arr1, row, col);
    jisu++;
   }
   if (jisu == (row*col - easy))
   {
    printf("排雷成功\n");
    print(arr, row, col);
   }
  }
  else
  {
   printf("重新输入");
  }
 }
}
int mycount(char arr[rows][cols], int x, int y)
{
 int count = 0;
 count = arr[x - 1][y] + arr[x - 1][y - 1] + arr[x][y - 1] +
  arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] + arr[x][y + 1] + arr[x - 1][y + 1] - 8 * '0';
  return count;
}
测试模块
#include"game.h"
int main()
{
 test();
 return 0;
}
这个游戏难点在于设计游戏的思路,应该创建两个二维数组,一个用来存放雷的值,一个用来显示给玩家拍雷的情况两个二位数组设置的时候应该加2,这样计算边上的雷和棋盘里面雷的计算方法一致
游戏思路:先初始化两个数组,然后打印棋盘(打印显示给玩家的二维数组),然后布置雷(布置在存放雷的数组中)
还有排查类,输入一个坐标,如果输入的坐标存放的是雷,游戏结束,如果存放雷的数组中这个坐标周围有雷,把值返回给打印给玩家的棋盘,直到把所有的雷拍完后,游戏结束
下面是游戏的测试