分享我的#C语言学习之路

家人们,这是我最近学的简单的扫雷游戏,这是一个工程里面的包含函数声明模块,游戏实现模块,测试模块,建议从主函数开始理解

#define _CRT_SECURE_NO_WARNINGS
//函数声明模块
//扫雷9行9列式;
#define R 9
#define C 9

//定义雷的个数
#define LC 10

//为了数顶点和最边上的雷的个数,所以设置11*11的棋盘,并且在第1和第11行及列的位置放置非雷;
//便于找雷的位置,包括放雷和排雷
#define RS R+2
#define CS C+2

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

//初始化声明
void beboard(char board[RS][CS],int rs,int cs,char set);

//打印棋盘
//传过来时rs的原因是(只要9*9的区域)
void dyboard(char board[RS][CS],int r,int c);

//布置雷
void setL(char board[RS][CS],int r,int c);

//排雷
void PL(char nshow[RS][RS],char show[RS][CS],int r,int c);

这里往上是game.h里面的代码;

#include "game.h"

//当set='0'时,11*11中全放'0';
//当set='*'时,11*11中全放'*';
void beboard(char board[RS][CS],int rs,int cs,char set)
{
    int i,j;
    for(i=0;i<rs;i++)
        for(j=0;j<cs;j++)
        {
           board[i][j]=set;
        }
}

//仅仅打印自己看时全部是字符'0';对应的ASCII码值为48;
//当打印玩家看到的就全部都是'*';对应的ASCII码值为42;
void dyboard(char board[RS][CS],int r,int c)
{
     int i=0;
     int j=0;
     //打印最上面一行的0到9
     for(i=0;i<=c;i++)
         printf("%d ",i);
     printf("\n");
     for(i=1;i<=R;i++)
        {   printf("%d ",i);
            for(j=1;j<=C;j++)
            {printf("%c ",board[i][j]);}
        printf("\n");
        }
  printf("\n");
}

//布置雷
void setL(char board[RS][CS],int r,int c)
{
    int count=LC;
    int x,y;
    while(count)
    {
     //随机生成合法坐标
     x=rand()% (r+1);//1到9
     y=rand()% (c+1);//1到9
     if(x>=1 && x<=9 && y>=1 &&y<=9)
     {
         {if(board[x][y]=='0')
          {
             board[x][y]='1';
             count--;
           }
         }
     }
     else 
         continue;//不满足if条件跳出这次循环,进入下次循环;
    }
}

//计算以x,y坐标为中心的雷的数目
int countL(char nshow[RS][CS],int x,int y)
{
    int count=0;
        count=nshow[x-1][y-1]+nshow[x-1][y]+nshow[x-1][y+1]
              +nshow[x][y-1]+nshow[x][y+1]+nshow[x+1][y-1]
              +nshow[x+1][y]+nshow[x+1][y+1]-8*'0';
    return count;
}
//排雷
void PL(char nshow[RS][RS],char show[RS][CS],int r,int c)
{
    int x,y,ret,win=0;
    while(win<R*C-LC)
    {printf("请输入要排的坐标:> ");
    scanf("%d%d",&x,&y);
    if(x>=1 && x<=9 && y>=1 &&y<=9)
    {
//坐标已合法,判断
        if(nshow[x][y]=='1')//是雷
            {
             printf("真不错,踩到雷了\n");
             dyboard(nshow,r,c);
             break;
             }
        //不是雷,求以此坐标为中心的周围八个坐标有多少个雷
        else
        { 
            ret=countL(nshow,x,y);
            //将整型ret转换为字符放入show中;
            show[x][y]=ret+'0';
            dyboard(show,r,c);
            win++;
        }
    }
    else
        printf("输入的坐标不合法,请重新输入坐标! * _ * \n");
    }
    if(win==R*C-LC)
    printf("哇哦,你扫雷成功啦,建议去买彩票哦,可能会中大奖\n");
    Sleep(2000);//延时2ms
    system("cls");//一局游戏玩玩清屏
}

这里到往上的红色字体截止,是游戏实现部分game.c;

下面是包括主函数代码部分test.c

#include "game.h"
//测试游戏;
//打印菜单
void game()
{
    char nshow[RS][CS]={0};
    char show[RS][CS]={0};
    printf("扫雷开始\n");
 //先布置棋盘
//初始化棋盘
    beboard(nshow,RS,CS,'0');//放'0';
    beboard(show,RS,CS,'*');//放'*';

//打印棋盘
    dyboard(nshow,R,C);//只要打印9*9的格子'0';实际上用户玩的时候这个是不打印的
    dyboard(show,R,C);//只要打印9*9的格子'*'
//布置雷
    setL(nshow,R,C);
    dyboard(nshow,R,C);//打印给自己看下雷区
//排雷
    PL(nshow,show,R,C);
}
void mune()
{
    printf("*****欢迎来到扫雷游戏*****\n");
    printf("**************************\n");
    printf("***** 1.play  0.exit *****\n");
    printf("**************************\n");
}
void xuanze()
{
    int input=0;
    srand((unsigned int)time (NULL));
    do
  {
    mune();
    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()
{
  xuanze();
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fighting787

一起加油,一起成功!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值