实践 : 简单扫雷游戏

简介: 实践 : 简单扫雷游戏

一、扫雷游戏分析


       1、游戏界面

                           

               初始界面                             排查雷界面                             排雷失败

     

 2.游戏分析


               < 1 >  棋盘设计

              扫雷游戏,我们需要在9*9(或者更多)的棋盘上去布置雷和排查雷,所布置的雷与排查雷的信息都需要进行记录,所以用两个二维数组来记录这些信息;如用mine数组来记录布置的雷的信息---‘0’代表不是雷,‘1’代表是雷;用show数组来记录所排查的雷的信息,刚开始,用‘*’来展示,由于会排查边缘是否为雷,并统计周围8个位置雷的信息,所以就把数组大小设置成11*11;

mine(雷)      

show(排查雷)    


               <2> 布置雷的信息

               布置雷其实就是生成一个或多个随机的坐标,将这些坐标的位置布置成雷,用代码实现就是将mine这个数组数组中生产随机坐标处的值改为‘1’;

              rand函数:这里就要用到随机生成数字rand函数

                                  rand函数头文件<stdlib.h>;

                                 rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。使用rand生成0--9的随机数:

int x;
x = rand() % 9;

                                  srand()用来设置rand()产生随机数时的随机数种子。为了让rand每次生成的随机数不相同,就需要用到srand,srand((unsigned int)time(NULL));

srand((unsigned int)time(NULL));
int x;
x = rand() % 9 ; 

                                  此时就会用到time函数,头文件<time.h>;

               布置雷的过程中还需注意:本次所生成的随机坐标处是不是‘1’,可以增加一处判断。

             

<3>排查雷的信息

               排查雷,即输入一个坐标,判断此处是不是雷;如果是,则游戏结束;如果不是,则游戏继续,并输出该坐标周围8个位置雷的个数。

               因为游戏需要重复输入,可以用while循环来编写代码

              判断:  首先,要判断输入的坐标合不合理,如果合理才继续进行(不合理则重新输入)

                            根据输入的坐标,判断mine数组中这个坐标处是不是‘1’,是‘1’则游戏结束;

                            如果不是‘1’,就要统计这个坐标周围8个位置雷的个数,这里写一个函数COUNT_Mine来实现;

              COUNT_Mine函数:

                               show数组是一个字符数组,这里就要用到字符‘0’转化为0:只需‘0’-0即可;

                               统计完成数目后在转换为字符存入数组show中,+‘0’即可;

                               统计坐标周围8个位置的雷的个数

                              根据图析,可以看出周围8个坐标的规律,因为‘1’代表雷,‘0’不是雷;所以,只用将周围8个位置的值相加,并减去8*‘0’即可。

                               (当然,也可以使用循环去解决,代码如下:)

    int i = 0;
  int sum = 0;
  for (i = -1; i <= 1; i++) {
    int j = 0;
    for (j = -1; j <= 1; j++) {
      sum += mine[i][j] - '0';
    }
  }


二、游戏代码实现

       1、game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
#define MINE 10
#define LINE 9  //行
#define ROW 9   //列
 
#define LINES LINE+2
#define ROWS ROW+2
 
//初始化
void csh(char arr[LINE][ROWS], int line, int row, char set);
 
//输出
void Printf(char arr[LINE][ROWS], int line, int row);
 
//布置雷
void set_Mine(char arr[LINES][ROWS], int line, int row);
 
//查找雷
void find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS] , int line, int row);

      2、game.c

#include "game.h"
 
//初始化
void csh(char arr[LINE][ROWS], int lines, int rows, char set) {
  int i = 0;
  for (i = 0; i < lines; i++) {
    int j = 0;
    for (j = 0; j < rows; j++) {
      arr[i][j] = set;
    }
  }
}
 
//输出
void Printf(char arr[LINE][ROWS], int line, int row) {
  int i = 0;
  printf("-----扫雷游戏-----\n");
  for (i = 0; i <=row; i++) {
    printf("%d ", i);
  }
  printf("\n");
  for (i = 1; i <= line; i++) {
    printf("%d ", i);
    int j = 0;
    for (j = 1; j <= row; j++) {
      printf("%c ", arr[i][j]);
    }
    printf("\n");
  }
}
 
//布置雷
void set_Mine(char arr[LINES][ROWS], int line, int row)
{
  int count = MINE;
  int x = 0;
  int y = 0;
  while (count) {
    x = rand() % line + 1;
    y = rand() % row + 1;
    if (arr[x][y] != '1') {
      arr[x][y] = '1';
      count--;
    }
  }
}
 
//查找雷
 
int COUNT(char mine[LINES][ROWS], int x, int y) {
  /*int i = 0;
  int sum = 0;
  for (i = -1; i <= 1; i++) {
    int j = 0;
    for (j = -1; j <= 1; j++) {
      sum += mine[i][j] - '0';
    }
  }
  return sum;*/
  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 + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
 
void find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS], int line, int row) { 
  int x, y;
  int times = 0;
  while (times<LINE*ROW - MINE) {
    printf("输入要查找的坐标\n");
    scanf("%d%d", &x, &y);
    if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
 
      if (mine[x][y] == '1') {
        printf("game over !\n 菜!就多练!!!\n");
        Printf(mine, LINE, ROW);
        break;
      }
      else {
        show[x][y] = COUNT(mine, x, y)+'0';
        times++;
        Printf(show, LINE, ROW);
      }
    }
    else {
      printf("输入错误,重新输入\n");
    }
  }
  if (times == LINE * ROW - MINE) {
    printf("恭喜 ,geme win!\n");
  }
}

       3、test.c

#include "game.h"
 
void test() {
  printf("*****************************\n");
  printf("***********1. 开始***********\n");
  printf("***********0. 结束***********\n");
  printf("*****************************\n");
  printf("---请选择---\n");
  int a;
  char mine[LINES][ROWS] = { '0' };
  char show[LINES][ROWS] = { '*' };
  srand((unsigned int)time(NULL));
  do {
    scanf("%d", &a);
    switch (a) {
    case 1:
      //初始化
      csh(mine, LINES, ROWS, '0');
      csh(show, LINES, ROWS, '*');
      //输出
      //Printf(mine, LINE, ROW);
      Printf(show, LINE, ROW);
 
      //随机生成雷
      set_Mine(mine, LINE, ROW);
      //Printf(mine, LINE, ROW);
 
 
      //查找雷
      find_Mine(mine, show, LINE, ROW);
      break;
    case 0:
      printf("game over");
      break;
    default:
      printf("输入错误 重新输入\n");
      break;
    }
  } while (a);
}
 
int main() {
  test();
  return 0;
}


三、扫雷游戏进阶

      扩展:选择挑战难度9*9/20*20等;

                 如果排查位置周围不是雷,显示一片区域;

       等等

相关文章
|
4月前
|
资源调度 监控 测试技术
《SaaS多租户实战指南:从灰度发布到故障容错的全链路架构设计》
本文聚焦企业级团队协作SaaS应用的多租户架构迭代实践,针对租户规模差异大、资源冲突、定制化与标准化矛盾等核心痛点展开。初期简易多租户模式因资源共享导致故障后,作者重构架构:采用“独立数据库+共享数据库+租户标识”的混合隔离方案,解决数据隔离与成本平衡问题;搭建基于租户画像的弹性资源调度体系,通过预测式调度与实时调整提升资源利用率;以“核心标准化+定制插件化”架构,缩短定制需求响应时间;构建分层灰度发布与故障容错机制,将版本故障发生率大幅降低。最终总结出SaaS多租户架构需“以租户为中心”,在隔离、共享、定制间找到精细化平衡点的核心经验。
369 6
|
2月前
|
NoSQL 算法 Linux
OpenOCD下载安装保姆级教程(附安装包,非常详细)
OpenOCD是一款开源片上调试工具,支持JTAG/SWD接口,提供GDB Server、TCL脚本自动化等功能,可实现断点调试、Flash烧录、FPGA编程等,广泛应用于嵌入式开发与量产测试,被誉为“穷人的Lauterbach”。跨平台且免费,配置灵活但稍复杂,是嵌入式工程师的高效调试利器。
|
7月前
|
安全 API 数据安全/隐私保护
低代码革命:API无代码集成如何让企业“3天上线一个生态”?
在数字化转型浪潮中,API成为释放数据价值、提升企业效率的核心。本文详解API架构设计、安全实践与跨平台集成,为CTO提供效率提升指南,涵盖微服务、安全认证、协议选择、低代码集成及未来趋势,助力企业构建敏捷、安全、高效的数字生态。
|
存储 运维 Oracle
国产数据库:目前最火的五款国产数据介绍
随着互联网的高速发展,目前数据的存储越来越多,传统的数据库逐渐不能满足人们对海量数据、高效查询的需求,国产的数据库如雨后春笋一样,一个个冒了出来来解决我们高速科技发展的数据库瓶颈,今天就给大家聊一聊目前最火的五款国产数据库,大家一起来交流一下。
国产数据库:目前最火的五款国产数据介绍
|
5月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
299 2
|
7月前
|
存储 安全 算法
RAW格式硬盘打不开?这样做让它恢复如初
当硬盘或U盘突然显示为RAW格式,无法打开并提示“需格式化”时,切勿立即格式化或运行chkdsk,这可能导致数据永久丢失。RAW格式是系统无法识别文件系统的状态,常见原因包括分区损坏、病毒、坏道或异常关机。正确做法是先用专业工具恢复数据,通过智能加载或深度扫描找回文件。数据恢复后,再对硬盘进行格式化修复。本文详解操作步骤与注意事项,助你安全恢复数据、修复磁盘。
|
8月前
|
缓存 监控 负载均衡
电商API性能优化全方位策略剖析
电商API性能优化对提升用户体验与业务效率至关重要。本文从八个方面探讨优化策略:1) 数据库优化,如索引设计、查询语句精简及冷热数据分离;2) 缓存策略,利用本地与分布式缓存减少数据库压力;3) 异步处理,通过任务队列提高响应速度;4) 负载均衡,分散高并发请求;5) 代码优化,改进算法与重构低效代码;6) 接口设计优化,标准化与模块化设计;7) 安全措施,强化数据加密与身份验证;8) 持续监控与优化,确保长期稳定运行。综合应用这些策略可显著提升电商API性能与用户体验。
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
智能导诊系统的技术体系组成
智能导诊系统基于SpringBoot、Redis、MyBatis Plus、MySQL和RocketMQ等技术架构开发,具备自主版权,适合二次开发。系统融合AI大模型、自然语言处理(NLP)、知识图谱、多模态交互等先进技术,通过症状推理与科室匹配,实现精准导诊。用户可通过点击3D人体模型或描述症状,快速获得可能疾病方向及推荐科室,支持语音识别、医学影像分析等功能。同时,系统采用联邦学习、同态加密等技术保障数据安全,符合隐私保护法规。适用于医院智慧医疗场景,提升患者就诊效率与体验。
587 0
|
10月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
435 0
|
数据挖掘
深入解析ERP系统的人力资源管理模块
深入解析ERP系统的人力资源管理模块
612 1

热门文章

最新文章