文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言扫雷游戏的简单实现

2024-04-02 19:55

关注

今天来用c语言做一个扫雷功能的简单实现,首先创建一个test.c来用于在写代码的途中测试扫雷代码,game.h来存放实现扫雷函数需要用到的头文件,game.c来存放最终的成品。

首先用函数打印一个菜单,让玩家选择进行游玩扫雷游戏或者退出,考虑到玩家会输入1和2以外的数字,我们加上一个fefault,将菜单放入do-while循环中,while的结束条件为choose为0,玩家在结束一场游戏后可以重新走一边循环,保证用户在结束一把扫雷之后可以选择继续进行下一局或是退出游戏。


void menu()
{
 printf("**********\n");
 printf("**1.play**\n");
 printf("**0.quit**\n");
 printf("**********\n");
}
 
void test()
{
 int choose;
 do
 {
  menu();
  printf("请进行你的选择");
  scanf("%d", &choose);
  switch (choose)
  {
  case 1:
   printf("游戏开始\n");
   break;
  case 2:
   printf("游戏退出\n");
  default:
   printf("选择错误,请重新选择\n");
  }
 } while (choose);
}

在case1中加入game()函数来进行扫雷游戏的实现。扫雷有雷的布置和雷的扫,首先来实现雷的布置,用二维数组实现一个9x9的棋盘,通过建立两个棋盘来实现信息的交互,一个棋盘hid放雷的布置情况,还有一个棋盘show来将信息呈现给玩家。因为show棋盘需要将用户扫过区域周围八个格子雷的数量写出来,如果定义一个【9】【9】的数组就会发生越界,因此两个数组都定位为11x11,为了方便写,宏定义col=9 row=9 COL=col+2 ROW=row+2。初始化show数组全为*,hid数组全为0


void SetBoard(char board[ROW][COL], int r, int c, char set)
{
 for (int i = 0; i < r; i++)
 {
  for (int j = 0; j < c; j++)
  {
   board[i][j] = set;
  }
 }
}
 
void ShowBoard(char board[ROW][COL],int r,int c)
{
 for (int a = 0; a <= r; a++)
 {
  printf("%d ", a);
 }
 printf("\n");
 for (int i = 1; i <= r; i++)
 {
  printf("%d ", i);
  for (int j = 1; j <= c; j++)
  {
   printf("%c ", board[i][j]);
  }
  printf("\n");
  
 }
}

接下来实现雷的随机插入,随机生成两个一到九的整数下x,y,添加一个count计数器,如果当前hid[x][y]为字符0 则hid[x][y]为字符0,count计数器加一


srand((unsigned int)time(NULL));
 
void SetBoob(char hid[ROW][COL],int rw,int c)
{
 int count = 0;
 for (int i = 0; count <= 9; i++)
 {
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (hid[x][y] == '0')
  {
   hid[x][y] = '1';
   count = count + 1;
  }
 }
}

这样雷就布置好了,接下来是玩家排雷的过程。

用while(1)做一个一直重复的循环,玩家输入行和列x,y,程序将hid[x][y]与字符‘1'对比,若踩雷则跳出循环显示游戏结束并打印hid棋盘让玩家看到雷的位置,若没踩雷show[x][y]变成周围八个格子的地雷个数并打印show棋盘。因为玩家可能输入1~9之外的数,因此要用if函数限制x,y的大小。

统计hid【x】【y】周围的雷的个数可以通过将周围的字符全部相加再减去八个字符0来实现


void CountBoob(char hid[ROW][COL], int x, int y)
{
 int count;
 count = hid[x - 1][y - 1] + hid[x][y - 1] + hid[x + 1][y - 1] + hid[x - 1][y] + hid[x + 1][y] + hid[x - 1][y + 1] + hid[x][y + 1] + hid[x + 1][y + 1] - 8 * '0';
 return count;
}
void FindBoob(char hid[ROW][COL], char show[ROW][COL], int r, int c)
{
 int x, y;
 while (1)
 {
  printf("请输入行和列");
  scanf("%d %d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   if (hid[x][y] == '1')
   {
    printf("游戏结束\n");
    ShowBoard(hid, row, col);
    break;
   }
   else
   {
    int n = CountBoob(hid, x, y);
    show[x][y] = n+'0';
    ShowBoard(show, row, col);
   }
  }
  else
  {
   printf("输入错误坐标请重新输入");
  }
 }
}

后期我在扫雷过程中加入了一个计数器count,每扫一个无雷区域则count加一当count等于71时打印游戏胜利并展示hid棋盘跳出循环。

将所有的函数放入头文件,.c程序如下


#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "game.h"
 
int main()
{
 int choose;
 srand((unsigned int)time(NULL));
 do
 {
  menu();
  printf("请进行你的选择");
  scanf("%d", &choose);
  switch (choose)
  {
  case 1:
   printf("游戏开始\n");
   game();
   break;
  case 0:
   printf("游戏退出\n");
   break;
  default:
   printf("选择错误,请重新选择\n");
  }
 } while (choose);
}

扫雷是如若周围没有雷,可以实现棋盘的展开,这个因为时间问题只能进行后期补充。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯