• 扫雷小游戏


      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 
      6 #define ROW 9
      7 #define COL 9
      8 #define MINE_COUNT 10
      9 
     10 int Menu()
     11 {
     12     printf("=======================
    ");
     13     printf("1.开始游戏
    ");
     14     printf("0.结束游戏
    ");
     15     printf("=======================
    ");
     16     int choice = 0;
     17     printf("请输入您的选择!
    ");
     18     scanf("%d", &choice);
     19     return choice;
     20 }
     21 
     22 void Init(char mine_map[ROW + 2][COL + 2],
     23     char show_map[ROW + 2][COL + 2])
     24 {
     25     //1.show_map都初始化成 * (表示没有翻开的位置)
     26     for (int row = 0;row < ROW + 2;++row)
     27     {
     28         for (int col = 0;col < COL + 2;++col)
     29         {
     30             show_map[row][col] = '*';
     31         }
     32     }
     33     //2.mine_map都初始化为'0'
     34     for (int row = 0;row < ROW + 2;++row)
     35     {
     36         for (int col = 0;col < COL + 2;++col)
     37         {
     38             mine_map[row][col] = '0';
     39         }
     40     }
     41     //除了上面的方法还可以:利用memset对一段连续的内存空间进行赋值
     42     //二维数组也是在一个连续的内存空间上
     43     //memset(mine_map, '0', (ROW + 2)*(COL + 2));
     44     //memset(show_map, '*', (ROW + 2)*(COL + 2));
     45 
     46     //3.对mine_map进行雷阵的布置
     47     int mine_count = MINE_COUNT;
     48     while (mine_count > 0)
     49     {
     50         //这个循环尝试进行布雷,每次布置成功一个则mine_count--
     51         //magice number
     52         int row = rand() % 9 + 1;
     53         int col = rand() % 9 + 1;
     54         if (mine_map[ROW][COL] == '1')
     55         {
     56             continue;
     57         }
     58         //当前位置可以用来设置地雷
     59         mine_map[row][col] = '1';
     60         --mine_count;
     61     }
     62     return;
     63 }
     64 
     65 void DisplayMap(char map[ROW + 2][COL + 2])
     66 {
     67     //先打印四个空格
     68     printf("    ");
     69     //打印列的坐标
     70     for (int i = 1;i <= COL;++i)
     71     {
     72         printf("%d ", i);
     73     }
     74     printf("
    ");
     75     //第一行打印完成
     76     //这里打印上边框
     77     for (int i = 1;i <= COL;++i)
     78     {
     79         printf("---");
     80     }
     81     printf("
    ");
     82     //打印棋盘的每一行,注意,每一行最前面的要带上行号
     83     for (int row = 1;row <= ROW;++row)
     84     {
     85         printf("  %d|", row);
     86         for (int col = 1;col <= COL;++col)
     87         {
     88             printf("%c ", map[row][col]);
     89         }
     90         printf("
    ");
     91     }
     92 }
     93 
     94 void UpdateShowMap(char mine_map[ROW + 2][COL + 2],
     95     char show_map[ROW + 2][COL + 2], int row, int col)
     96 {
     97     //每次翻开一个格子的时候,如果这个格子不是雷,就需要跟新show_map
     98     //把当前位置替换成一个数字(数字就表示了当前位置周围8个格子中有几个地雷)
     99     int mine_count =
    100         (mine_map[row - 1][col - 1] - '0')
    101         + (mine_map[row - 1][col] - '0')
    102         + (mine_map[row - 1][col + 1] - '0')
    103         + (mine_map[row][col - 1] - '0')
    104         + (mine_map[row][col + 1] - '0')
    105         + (mine_map[row + 1][col - 1] - '0')
    106         + (mine_map[row + 1][col] - '0')
    107         + (mine_map[row + 1][col + 1] - '0');
    108     //由于show_map中都是字符,需要把这个数字转换为字符
    109     show_map[row][col] = mine_count + '0';
    110 }
    111 
    112 void Game()
    113 {
    114     printf("'0'表示没有地雷,'1'表示有地雷
    ");
    115     //1.设定一个二维数组,作为表示地雷的地图,'0'表示没有地雷,'1'表示有地雷
    116     //  设定一个二维数组,作为给玩家看的地图,每个位置是否被翻开,如果翻开
    117     //在此处加了2表示加了一圈边框:
    118     char mine_map[ROW + 2][COL + 2];
    119     char show_map[ROW + 2][COL + 2];
    120     //2.对地图进行初始化(包含布置地雷的过程)
    121     Init(mine_map, show_map);
    122     int blank_not_mine_count = 0;//不是雷的个数
    123                                  //3.先打印一下初始地图
    124     DisplayMap(show_map);
    125     while (1)
    126     {
    127         //4.提示玩家输入一组坐标,并且对玩家输入进行合法性检查
    128         printf("请输入一组坐标(row col):");
    129         int row = 0;
    130         int col = 0;
    131         scanf("%d %d", &row, &col);
    132         //row,col的有效范围[1,row][1,col]地图上有边框
    133         if (row<1 || row>ROW || col<1 || col>COL)
    134         {
    135             printf("您输入的坐标非法,请重新输入:
    ");
    136             continue;
    137         }
    138         //5.提示玩家翻开的位置是否是地雷,如果是地图就游戏结束
    139         if (mine_map[row][col] == '1')
    140         {
    141             printf("您踩雷了,游戏结束!
    ");
    142             //玩家踩雷后,需要告诉玩家当前地图上都有哪些位置是地雷
    143             DisplayMap(mine_map);
    144             break;
    145         }
    146         //6.如果当前位置已经把最后一个不是雷的位置翻开了,游戏结束,玩家胜利
    147         ++blank_not_mine_count;
    148         if (blank_not_mine_count == ROW * COL - MINE_COUNT)
    149         {
    150             printf("扫雷成功!
    ");
    151             DisplayMap(mine_map);
    152             break;
    153         }
    154         //7.把这个位置翻开,并计算当前位置周围8个格子中包含几个雷
    155         UpdateShowMap(mine_map, show_map, row, col);
    156         DisplayMap(show_map);
    157         //回到3循环执行
    158 
    159     }
    160 
    161 }
    162 
    163 int main()
    164 {
    165     while (1)
    166     {
    167         int choice = Menu();
    168         if (choice == 1)
    169         {
    170             Game();
    171         }
    172         else
    173         {
    174             printf("Goodbye!
    ");
    175             break;
    176         }
    177     }
    178 
    179 
    180 
    181     return 0;
    182 }
  • 相关阅读:
    WPF编程系列
    使用ListBox控件来实现直方图控件(一)
    在WebBrowser控件中获取鼠标在网页上点击的位置
    使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果
    浮点数类型在计算机里面的表示方法
    点击asp:button按钮后,不刷新当前页面
    .NET ComponentArt 使用背景
    关于Microsoft ASP.NET 2.0 AJAX Extensions UpdatePanel 中使用 javascript 产生错误的问题
    基础平台数据导入(游标的使用)
    STUFF 函数的使用
  • 原文地址:https://www.cnblogs.com/cuckoo-/p/10357769.html
Copyright © 2020-2023  润新知