新葡京轮盘官网:【C语言】扫雷小游戏详解

本文来源:http://www.144758.com/www_hao123_com/

申博亚洲娱乐官网直营,紧接着的第二天,10月16日上证指数的6124点成为中国股市的最高点。”影片调用中华传统元素的手段,虽稚嫩,却可谓电影国学风的新试炼。  人民网北京12月6日电(罗知之)为防范打击电信诈骗,中国人民银行9月出台了《关于加强支付结算管理防范电信网络新型违法犯罪有关事项的通知》,自12月1日起实施。于是他将目光对准了“刺绣工艺”,邀请到JillianTamaki以及RachellSumpter两位艺术家合作设计推出了企鹅手绣经典系列。

”有闻记者之家创始人阳淼表示,其实除了刷量,行业内的其他现象同样值得关注,比如由于自媒体缺少传统媒体的审核把关环节,发表一些虚假、恶性攻击稿子的门槛很低,导致社会对自媒体行业产生了很多负面认知,这个应该对自媒体来讲是比较大的行业挑战。都说兴趣要从小培养,有没有一种可能让孩子们在很小的时候就接触到编程并爱上它呢?在中国会不会出现下一个马克扎克伯格呢?  高科技玩具公司Wowwee给出了我们答案,Wowwee专门为孩子打造了一款用表情符编程的小机器人——Coji,其特点是通过App将编程的概念用趣味十足的互动游戏方式教给孩子,旨在让孩子从小就接触并爱上编程,多面启发孩子的能力。其仕途起步于国家物价领导小组办公室,此后12年内历任国务院物价委员会办公室副处长、国家物价局农产品价格司综合处副处长、国家计委市场与价格调控司价格计划规划处副处长、综合处处长。  要鉴别司机是否全职的身份,通过注册资料、接单记录等数据其实也不难。

  多点触控测试上,TCL950支持10点同时触控,对于游戏爱好者来说,多点触控操控更佳。”2015年至今,爱奇艺已推出《蜀山战纪》《太阳的后裔》《余罪》《灭罪师》《老九门》等数十部精品VIP会员大剧。行情12月07日(中关村在线江苏行情)ThinkPadE460(20ETA00DCD)商用办公笔记本,采用Intel酷睿i56200U处理器,以及AMDRadeonR5M330独立显卡,支持蓝牙功能,预装Windows10操作系统...行情12月07日(中关村在线江苏行情)新款ThinkPadE450-73CD,在维持稳健的经典外观同时,内部进行了革新。”上述高通内部人士称。

在编写扫雷小游戏之前,第一,我们应该列出我们想要实现的扫雷小游戏的功能:
1.显示选中的坐标周围的雷的个数。
2.保证第一次选中的坐标不是雷。
3.选中的坐标周围8个格子中没有雷,则展开。

第二,我们应该明白我们需要两个棋盘来实现扫雷游戏:一个棋盘用来展示给玩家,初始界面全为“ * ” (未翻开的格子),这个页面就是我们常见的扫雷页面。另一个棋盘用来给编写者看,棋盘内只有字符‘1’和字符‘0’ 。‘1’代表雷,‘0’代表非雷。使用字符‘1’‘0’来代表雷和非雷有利于我们下一步计算坐标周围雷的个数。

1.初始化棋盘

nitboard(show_board, ROWS, COLS,'*');    /‘*’代表未翻开的坐标
 Initboard(mine_board, ROWS, COLS, '0');  /‘0’代表非雷
  void Initboard(char board[ROWS][COLS], int row, int col, char set)
{
 memset(board, set, row*col * sizeof(board[0][0]));
}

2.打印棋盘

void DisPlayboard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 printf("  ");
 for (i = 1; i <= row; i++)    /打印行
 {
  printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  printf("%d ", i);     /打印列
  for (j = 1; j <= col; j++)
  {
   printf("%c ", board[i][j]);
  }
  printf("\n");
 }
 printf("\n");
}

3.在棋盘中埋入雷。(因为每一次重新开始游戏雷的位置不能重复,所以选择用随机数来埋雷)

void GetBoom(char board[ROWS][COLS], int row, int col)   /埋雷
{
 int x = 0;
 int y = 0;
 int sum = 0;
 while(1)
 { 
  x = rand() % row +1;    /雷放在1-9的范围里
  y = rand() % col +1;
  if (1)
  {
   board[x][y] = '1';
   sum++;
   if (sum == M)     /埋入雷后跳出循环
   {
    break;
   }
  }
 }

4.确保第一次不踩到雷,如果第一次踩到雷,我们就将此位置改为非雷,然后将此处的雷移动到别处未放置雷的位置。(还要考虑一种特殊情况,即如果第一次落子就获得胜利的情况时后面函数就不用再执行了,所以此函数要改为有返回值的函数,这样在调用此函数时就可以判断是否为一次就获得胜利的情况)

int  Judge_first(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int m;
 int n;
 printf("请输入要排查的坐标:");
 scanf("%d%d", &x, &y);
 while (1)
 {
  if (mine_board[x][y] == '1')   /如果第一次踩雷,将此坐标改为非雷
  {
   mine_board[x][y] = '0';
   show_board[x][y] = ' ';
   while (1)
   {
    m = rand() % 9 + 1;
    n = rand() % 9 + 1;
    if (m != x && n != y && mine_board[m][n] != '1')
    {
     mine_board[m][n] = '1';
    }
    Open(mine_board, show_board, x, y);
    if (Full(show_board, ROW, COL) == 1)  /展开后判断是否一次获得胜利
    {
     printf("游戏胜利\n");
     DisPlayboard(mine_board, ROW, COL);
     return 2;         /一次获得胜利返回2 不再执行PlayerMove函数
     break;
    }
    DisPlayboard(show_board, row, col);
    break;
    }
   break;
  }
  else if (mine_board[x][y] == '0')
  {
   show_board[x][y] = ' ';
   Open(mine_board, show_board, x, y);
   if (Full(show_board, ROW, COL) == 1)
   {
    printf("游戏胜利\n");
    DisPlayboard(mine_board, ROW, COL);
    return 2;
    break;
   }
   DisPlayboard(show_board, row, col);
   break;
  }
 }
}

5.当坐标周围雷个数为0时,展示周围格子,再以X和Y周围八个坐标分别为中心展开,当坐标周围有雷时不再递归展开,并将雷的个数放在该坐标。

void Open(char mine_board[ROWS][COLS],char show_board[ROWS][COLS], int x, int y)
{
 int ret = 0;
 ret = Num(mine_board, x, y);
 if (ret == 0)   /当坐标周围雷个数为0时 打开周围格子 再以X和Y周围八个坐标为中心展开 重复即为递归展开
 {
   show_board[x][y] = ' '; 
   if (x - 1 > 0 && y - 1 > 0 && show_board[x - 1][y - 1] == '*')
   {
    Open(mine_board, show_board, x - 1, y - 1);
   }
   if (x - 1 > 0 && y > 0 && show_board[x - 1][y] == '*')
   {
    Open(mine_board, show_board, x - 1, y);
   }
   if (x - 1 > 0 && y + 1 <= COL && show_board[x - 1][y + 1] == '*')
   {
    Open(mine_board, show_board, x - 1, y + 1);
   }
   if (x > 0 && y + 1 <= COL && show_board[x][y + 1] == '*')
   {
    Open(mine_board, show_board, x, y + 1);
   }
   if (x + 1 < ROW && y + 1 <= COL && show_board[x + 1][y + 1] == '*')
   {
    Open(mine_board, show_board, x + 1, y + 1);
   }
   if (x + 1 <= ROW  && y > 0 && show_board[x + 1][y] == '*')
   {
    Open(mine_board, show_board, x + 1, y);
   }
   if (x + 1 <= ROW && y - 1 > 0 && show_board[x + 1][y - 1] == '*')
   {
    Open(mine_board, show_board, x + 1, y - 1);
   }
   if (x > 0 && y - 1 > 0 && show_board[x][y - 1] == '*')
   {
    Open(mine_board, show_board, x, y - 1);
   }
  }
   else if (ret != 0)
    show_board[x][y] = Num(mine_board, x, y) + 48;
}

6.计算坐标周围一圈中所含雷的个数。

int Num(char board[ROWS][COLS], int x, int y)
{
 int sum = 0;				/sum为坐标周围雷的个数
 sum = board[x - 1][y - 1]
  + board[x][y - 1] + board[x + 1][y - 1]
  + board[x + 1][y] + board[x + 1][y + 1]
  + board[x][y + 1] + board[x - 1][y + 1]
  + board[x - 1][y] - (8 * '0');
 return sum;
}

7.判断玩家是否排完所有雷。

int Full(char board[ROWS][COLS], int row, int col)  
{
 int i;
 int j;
 int sum = 0;			/sum为棋盘未翻开格子的个数
 for (i = 1; i <= row; i++)
 {
  for (j = 1; j <= col; j++)
  {
   if (board[i][j] == '*')
    sum++;
  }  
 }
  if (sum == M) 		/当未翻开的格子数为雷数时 返回1
   return 1;
}

8.玩家输入坐标扫雷。

void PlayerMove(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int ret = 0;
 while (1)
 {
  if (Full(show_board, ROW, COL) == 1)  /棋盘未翻开格子等于雷数时玩家胜利
   {
    printf("游戏胜利\n");
    DisPlayboard(mine_board, ROW, COL);
    break;
   }
  printf("请输入坐标:");
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   
    if (mine_board[x][y] == '1')		/玩家踩到雷,游戏结束
   {
    printf("游戏结束\n");
    DisPlayboard(mine_board, ROW, COL);
    break;
   }
   ret = Num(mine_board, x, y);
   if (ret == 0)      /周围没有雷时,展开周围格子
   {
    Open(mine_board, show_board, x, y);
    DisPlayboard(show_board, ROW, COL);
   }
   else if (ret != 0)     /周围有雷时打印雷的个数
   {
    show_board[x][y] = ret + 48;
    DisPlayboard(show_board, ROW, COL);
   }
  }
  else
   printf("输入错误,请重新输入");
 }
}

9.函数声明,宏定义,函数的定义实现,测试。
源文件:test.c /主要负责测试整个代码
头文件:game.h /包含函数各种声明,宏定义
源文件:game.c /包含各种函数的定义

test.c

#include"game.h"
void menu()
{
 printf("************************************\n");
 printf("************************************\n");
 printf("*******       1.play         *******\n");
 printf("*******       0.exit         *******\n");
 printf("************************************\n");
}

int game()
{
 char show_board[ROWS][COLS] = { 0 };
 char mine_board[ROWS][COLS] = { 0 };
/
 Initboard(show_board, ROWS, COLS,'*');    /初始化数组
 Initboard(mine_board, ROWS, COLS, '0');       
 printf("游戏开始\n");
 DisPlayboard(show_board, ROW, COL);  /打印玩家雷盘
/
 GetBoom(mine_board, ROW, COL);  /埋雷
 printf("\n\n\n");
 DisPlayboard(mine_board, ROW, COL);     /打印雷盘
/
 if (Judge_first(mine_board, show_board, ROW, COL) == 2)   /如果一次胜利,就不再执行PlayerMove函数
  return 2;
/ 
  PlayerMove(mine_board, show_board, ROW, COL);   
}

void test()
{
 int n;
 menu();
 do
 {
 printf("请输入选项按钮: ");
 scanf("%d", &n);
 switch (n)
 {
 case 1:
  game();
  break;
 case 0:
  printf("游戏退出\n");
  break;
 default:
  printf("输入错误,请重新输入\n");
  break;
 } 
 }while(1);
}
int main()
{
    srand((unsigned int)time(NULL));
 test();
}

game.c

#include"game.h"
void Initboard(char board[ROWS][COLS], int row, int col, char set)
{
 memset(board, set, row*col * sizeof(board[0][0]));
}
void DisPlayboard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 printf("  ");
 for (i = 1; i <= row; i++)    /打印行
 {
  printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  printf("%d ", i);     /打印列
  for (j = 1; j <= col; j++)
  {
   printf("%c ", board[i][j]);
  }
  printf("\n");
 }
 printf("\n");
}

void GetBoom(char board[ROWS][COLS], int row, int col)   /埋雷
{
 int x = 0;
 int y = 0;
 int sum = 0;
 while(1)
 { 
  x = rand() % row +1;    /雷放在1-9的范围里
  y = rand() % col +1;
  if (1)
  {
   board[x][y] = '1';
   sum++;
   if (sum == M)     /埋入所需的雷后跳出循环
   {
    break;
   }
  }
 }
}

int  Judge_first(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int m;
 int n;
 printf("请输入要排查的坐标:");
 scanf("%d%d", &x, &y);
 while (1)
 {
  if (mine_board[x][y] == '1')   /如果第一次踩雷,将此坐标改为非雷
  {
   mine_board[x][y] = '0';
   show_board[x][y] = ' ';
   while (1)
   {
    m = rand() % 9 + 1;
    n = rand() % 9 + 1;
    if (m != x && n != y && mine_board[m][n] != '1')
    {
     mine_board[m][n] = '1';
    }
    Open(mine_board, show_board, x, y);
    if (Full(show_board, ROW, COL) == 1)  /展开后判断是否一次获得胜利
    {
     printf("游戏胜利\n");
     DisPlayboard(mine_board, ROW, COL);
     return 2;         /一次获得胜利返回2 不再执行PlayerMove函数
     break;
    }
    DisPlayboard(show_board, row, col);
    break;
    }
   break;
  }
  else if (mine_board[x][y] == '0')
  {
   show_board[x][y] = ' ';
   Open(mine_board, show_board, x, y);
   if (Full(show_board, ROW, COL) == 1)
   {
    printf("游戏胜利\n");
    DisPlayboard(mine_board, ROW, COL);
    return 2;
    break;
   }
   DisPlayboard(show_board, row, col);
   break;
  }
 }
}

void PlayerMove(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int ret = 0;
 while (1)
 {
  if (Full(show_board, ROW, COL) == 1)  /棋盘下满玩家胜利
   {
    printf("游戏胜利\n");
    DisPlayboard(mine_board, ROW, COL);
    break;
   }
  printf("请输入坐标:");
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
   
    if (mine_board[x][y] == '1')
   {
    printf("游戏结束\n");
    DisPlayboard(mine_board, ROW, COL);
    break;
   }
   ret = Num(mine_board, x, y);
   if (ret == 0)      /周围没有雷时,展开周围格子
   {
    Open(mine_board, show_board, x, y);
    DisPlayboard(show_board, ROW, COL);
   }
   else if (ret != 0)     /周围有雷时打印雷的个数
   {
    show_board[x][y] = ret + 48;
    DisPlayboard(show_board, ROW, COL);
   }
  }
  else
   printf("输入错误,请重新输入");
 }
}

void Open(char mine_board[ROWS][COLS],char show_board[ROWS][COLS], int x, int y)
{
 int ret = 0;
 ret = Num(mine_board, x, y);
 if (ret == 0)   /当坐标周围雷个数为0时 打开周围格子 再以X和Y周围八个坐标为中心展开 重复即为递归展开
 {
   show_board[x][y] = ' '; 
   if (x - 1 > 0 && y - 1 > 0 && show_board[x - 1][y - 1] == '*')
   {
    Open(mine_board, show_board, x - 1, y - 1);
   }
   if (x - 1 > 0 && y > 0 && show_board[x - 1][y] == '*')
   {
    Open(mine_board, show_board, x - 1, y);
   }
   if (x - 1 > 0 && y + 1 <= COL && show_board[x - 1][y + 1] == '*')
   {
    Open(mine_board, show_board, x - 1, y + 1);
   }
   if (x > 0 && y + 1 <= COL && show_board[x][y + 1] == '*')
   {
    Open(mine_board, show_board, x, y + 1);
   }
   if (x + 1 < ROW && y + 1 <= COL && show_board[x + 1][y + 1] == '*')
   {
    Open(mine_board, show_board, x + 1, y + 1);
   }
   if (x + 1 <= ROW  && y > 0 && show_board[x + 1][y] == '*')
   {
    Open(mine_board, show_board, x + 1, y);
   }
   if (x + 1 <= ROW && y - 1 > 0 && show_board[x + 1][y - 1] == '*')
   {
    Open(mine_board, show_board, x + 1, y - 1);
   }
   if (x > 0 && y - 1 > 0 && show_board[x][y - 1] == '*')
   {
    Open(mine_board, show_board, x, y - 1);
   }
  }
   else if (ret != 0)
    show_board[x][y] = Num(mine_board, x, y) + 48;
}

int Num(char board[ROWS][COLS], int x, int y)
{
 int sum = 0;
 sum = board[x - 1][y - 1]
  + board[x][y - 1] + board[x + 1][y - 1]
  + board[x + 1][y] + board[x + 1][y + 1]
  + board[x][y + 1] + board[x - 1][y + 1]
  + board[x - 1][y] - (8 * '0');
 return sum;
}

int Full(char board[ROWS][COLS], int row, int col)
{
 int i;
 int j;
 int sum = 0;
 for (i = 1; i <= row; i++)
 {
  for (j = 1; j <= col; j++)
  {
   if (board[i][j] == '*')
    sum++;
  }  
 }
  if (sum == M)
   return 1;
}

game.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9
#define ROWS  ROW + 2
#define COLS  COL + 2
#define M 10		/所需雷的个数

void test();
int game();
void Initboard(char board[ROWS][COLS], int row, int col, int set);    /初始化数组
void DisPlayboard(char board[ROWS][COLS], int row, int col);   /打印雷盘
void GetBoom(char board[ROWS][COLS], int row, int col);     /安放炸弹
int  Judge_first(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);   /保证第一次不是雷
void PlayerMove(char mine_board[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);   /玩家排雷
void Open(char mine_board[ROWS][COLS],char show_board[ROWS][COLS], int x, int y);      /展开函数
int  Num(char mine_board[ROWS][COLS], int x, int y);     /计算坐标周围雷的数量
int Full(char board[ROWS][COLS], int row, int col);      /判断雷是否下满

已标记关键词 清除标记
相关推荐
??2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 申博亚洲娱乐官网直营
申博登录网址登入 申博在线 www.msc99.com 申博官网娱乐城登入 菲律宾太阳成娱乐管理网 申博娱乐手机登入
申博会员登入 申博代理开户登入 申博游戏登入 申博电子游戏手机能玩吗 申博免费开户官网登入 申博138游戏直营网
申博游戏手机怎么下载 菲律宾申博直营现金网 太阳城申博客户端下载 菲律宾申博娱乐城官网 申博登录网址登入 www.10086msc.com