ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用C语言做一个小游戏——扫雷

2022-02-05 16:58:17  阅读:194  来源: 互联网

标签:arr ROWS int COLS C语言 char 小游戏 扫雷 printf


扫雷这个小游戏大家都知道,这里讲解简单版本的扫雷,即点到一个位置显示出周围8个位置雷的数量。

首先思路:

1.

因为需要对雷进行显示,布置两个棋盘。一个棋盘用来布置雷的信息,另一个棋盘用来展示给用户看来使游戏继续进行。用二维数组来存游戏的信息。

2.

这里以9*9的棋盘为例。

为了不越界,布置的棋盘要大一圈

那布置雷的大一圈,为了保持数组坐标同步,那就让排查雷的也大一圈,在其中9*9的内部操作。

3.

初始化mine和show数组,一个全‘0’,一个全‘*’。

初始化的时候,把初始化内容也通过函数参数带过去。

4.

打印棋盘,把show棋盘打印出来

11*11的数组,但是只显示中间的9*9

注意,打印棋盘行列标的时候多运行程序进行改进。

5.

布置雷,在打印前

布置雷,在9*9的棋盘里面 用rand函数来布置布置,count个雷

注:有雷的地方不再布置

6.排雷

点到雷 炸死

不是雷 创建个新函数看周围有几个雷打印出来

一开始用0和1来布置棋盘,目的是:ASCII码相减正好是1,方便统计

排查到一个显示一个(打印一次棋盘)

game.h游戏中用到的头文件及函数声明

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10
#define MIDDLE 20
#define DIFFICULT 30
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols);
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col);
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
       //创建
       char mine[ROWS][COLS] = { 0 };
       char show[ROWS][COLS] = { 0 };
       //初始化
       init_board(mine, ROWS, COLS, '0');
       init_board(show, ROWS, COLS,'*');
       //打印
       display_board(show, ROWS, COLS);
       //布置雷
       set_boom(mine, ROW, COL);
       //display_board(mine, ROWS, COLS);
       //排雷
       clear_boom(mine,show, ROW, COL);
}
void menu()
{
       printf("**************\n");
       printf("*** 1.play ***\n");
       printf("*** 0.exit ***\n");
       printf("**************\n");
}
void test()
{
       int input = 0;
       srand((unsigned int)time(NULL));
       do
       {
              menu();
              printf("请选择:");
              scanf("%d", &input);
              switch (input)
              {
              case 1:
                     printf("游戏开始!\n");
                     game();
                     break;
              case 0:
                     printf("退出游戏!\n");
                     break;
              default:
                     printf("选择错误,请重新选择:\n");
                     break;
              }
       } while (input);
}
int main()
{
       test();
       return 0;
}

game.c游戏的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化
void init_board(char arr[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++)
              {
                     arr[i][j] = set;
              }
       }
}
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols)
{
       int i = 0;
       int j = 0;
       for (i = 0; i < 10; i++)
       {
              printf("%d ", i);
       }
       printf("\n");
       for (i = 1; i < rows-1; i++)
       {
              printf("%d ", i );
              for (j = 1; j < cols-1; j++)
              {
                     printf("%c ", arr[i][j]);
              }
              printf("\n");
       }
}
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col)
{
       int x = 0;
       int y = 0;
       int count = EASY;
       while (count)
       {
              x = rand() % row + 1;
              y = rand() % col + 1;
              if (arr[x][y] == '0')
              {
                     arr[x][y] = '1';
                     count--;
              }
       }
}
//显示输入坐标周围雷的信息
int sround(char arr[ROWS][COLS], int x, int y)
{
       return arr[x - 1][y - 1]
              + arr[x - 1][y]
              + arr[x - 1][y + 1]
              + arr[x][y - 1]
              + arr[x][y + 1]
              + arr[x + 1][y - 1]
              + arr[x + 1][y]
              + arr[x + 1][y + 1] - 8 * '0';
}
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
       int x = 0;
       int y = 0;
       int pai = 0;
       while(pai<row*col-EASY)
       {
              printf("请输入要排查雷的坐标:");
              scanf("%d %d", &x, &y);
              if (x >= 1 && x <= row && y >= 1 && y <= col)
              {
                     if (mine[x][y] == '1')
                     {
                           //炸到了
                           printf("哈哈哈哈哈哈哈你被炸死了\n");
                           display_board(mine, ROWS, COLS);
                           break;
                     }
                     else
                     {
                           //没炸到,打印周围雷的个数
                           int ret = sround(mine, x, y);
                           show[x][y] = ret + '0';
                           //打印下排查后的棋盘
                           display_board(show, ROWS, COLS);
                           pai++;
                     }
              }
              else
              {
                     printf("坐标输入错误,请重新输入!\n");
              }
       }
       if (pai == row * col - EASY)
       {
              printf("恭喜您,扫雷成功!\n");
       }
}

标签:arr,ROWS,int,COLS,C语言,char,小游戏,扫雷,printf
来源: https://blog.csdn.net/WangLongxyd/article/details/122791394

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有