• 一步一步实现扫雷游戏(C语言实现)(一)


    此项目相关博文链接

    一步一步实现扫雷游戏(C语言实现)(一)

    一步一步实现扫雷游戏(C语言实现)(二)

    一步一步实现扫雷游戏(C语言实现)(三)

    一步一步实现扫雷游戏(C语言实现)(四)

     


    预定义:
    #define MAX_X 100 //行坐标最大值
    #define MAX_Y 100 //纵坐标最大值
    全局数组:
    char map[MAX_X][MAX_Y];
    //为坐标数组,存储着地雷的分布
    int m,n;
    //为坐标的大小(选择等级时用的上)
    //注意:MAX_X,MAX_Y与m,n的不同之处

    算法函数接口:
    1.返回周围地雷个数的函数
    /****************************************************************************
    返回周围地雷个数的函数
    函数原型: int round_num_mines(int i,int j);
    参 数: int i, int j为当前的坐标
    返回值类型: int 返回该坐标处周围的地雷数
    返回值情况:(1)返回1-8代表周围有1-8个地雷;
    (2)返回0代表周围没有地雷;
    (3)返回*代表此坐标时地雷;
    *****************************************************************************
    */
    char round_num_mines(int i,int j)
    {
    int k =0;//记录周围地雷个数
    if (map[i][j] =='*')
    {
    return'*';
    }
    else
    {
    if (i ==0) //第0行
    {
    if (j ==0) //第0行第0列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    }
    elseif (j == n-1) //第0行第n-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    }
    else//第0行非第0列非第n-1列
    {
    if (map[i][j-1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    }
    }
    elseif (i == m-1) //第m-1行
    {
    if (j ==1) //第m-1行第0列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    }
    elseif (j == n-1) //第m-1行第n-1列
    {
    if (map[i-1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    else//第m-1行非第0列非第n-1列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    }
    else//非第0行也非第m-1行
    {
    if (j ==1) //非第0行第0列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    }
    elseif (j == n-1) //非第0行第n-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    else//非第0行非第0列非第m-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    }
    }
    return k;
    }
    2.鼠标左键(扫雷)的函数
    函数原型:
    void left_mouse(int i,int j);
    参数:

    int i, int j为当前的坐标

    返回值类型:
    void
    函数实现情况:(
    1)判断i,j;
    2)调用函数num_mines();
    3)判断函数num_mines()的返回值:
    1)返回1-8则在坐标点上画出1-8,此函数的功能完毕,return
    2)返回0则继续调用函数num_mines(),再递归调用函数left_mouse();
    3)返回‘*’说明踩到地雷,return, game over!
    3.右键(画出旗帜)的函数
    此函数的主要功能是限制此位置,规定该位置不会被显示出数字或‘
    *
    4.初始化地雷分布位置和个数
    /*******************************************************************
    函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
    函数原型:void set_mines(int num_mines)
    参数:(in)—— int num_mines
    ********************************************************************
    */
    void set_mines(int num_mines)
    {
    int num =0;
    while (num <= num_mines)
    {
    rand_mines(m, n);
    //如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
    num = fun_num_mines(m, n);//判断地雷个数
    }
    }
    //设置随机选取(i,j),设置a[i][j] = '*'
    void rand_mines(int m, int n)
    {
    int i,j;
    srand(time(
    0));
    //rand()%n 取(0,n-1)的随机数
    i = rand() % m;
    j
    = rand() % n;
    map[i][j]
    ='*';
    }
    //判断地雷个数
    int fun_num_mines(int m, int n)
    {
    int i,j, k =0;
    for (i =0; i < m; i++)
    {
    for (j =0; j < n; j++)
    {
    if (map[i][j] =='*')
    {
    k
    ++;
    }
    }
    }
    return k;
    }
    5.主函数
    负责选关(设置m,n的大小)、选关接口...............

    扫雷游戏程序文档
    预定义:
    #define MAX_X 100 //行坐标最大值
    #define MAX_Y 100 //纵坐标最大值
    全局数组:
    char map[MAX_X][MAX_Y];
    //为坐标数组,存储着地雷的分布
    int m,n;
    //为坐标的大小(选择等级时用的上)
    //注意:MAX_X,MAX_Y与m,n的不同之处

    算法函数接口:
    1.返回周围地雷个数的函数
    /****************************************************************************
    返回周围地雷个数的函数
    函数原型: int round_num_mines(int i,int j);
    参 数: int i, int j为当前的坐标
    返回值类型: int 返回该坐标处周围的地雷数
    返回值情况:(1)返回1-8代表周围有1-8个地雷;
    (2)返回0代表周围没有地雷;
    (3)返回*代表此坐标时地雷;
    *****************************************************************************
    */
    char round_num_mines(int i,int j)
    {
    int k =0;//记录周围地雷个数
    if (map[i][j] =='*')
    {
    return'*';
    }
    else
    {
    if (i ==0) //第0行
    {
    if (j ==0) //第0行第0列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    }
    elseif (j == n-1) //第0行第n-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    }
    else//第0行非第0列非第n-1列
    {
    if (map[i][j-1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    }
    }
    elseif (i == m-1) //第m-1行
    {
    if (j ==1) //第m-1行第0列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    }
    elseif (j == n-1) //第m-1行第n-1列
    {
    if (map[i-1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    else//第m-1行非第0列非第n-1列
    {
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    }
    else//非第0行也非第m-1行
    {
    if (j ==1) //非第0行第0列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    }
    elseif (j == n-1) //非第0行第n-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    else//非第0行非第0列非第m-1列
    {
    if (map[i+1][j] =='*') k++;
    if (map[i+1][j-1] =='*') k++;
    if (map[i+1][j+1] =='*') k++;
    if (map[i][j+1] =='*') k++;
    if (map[i-1][j] =='*') k++;
    if (map[i-1][j+1] =='*') k++;
    if (map[i][j-1] =='*') k++;
    if (map[i-1][j-1] =='*') k++;
    }
    }
    }
    return k;
    }
    2.鼠标左键(扫雷)的函数
    函数原型:
    void left_mouse(char a[max_x][max_y],int i,int j, int m, int n);
    参数:
    char a[max_x][max_y]为坐标数组,存储着地雷的分布
    int i, int j为当前的坐标
    int m,int n为坐标的大小(选择等级时用的上)
    返回值类型:
    void
    函数实现情况:(
    1)判断i,j;
    2)调用函数num_mines();
    3)判断函数num_mines()的返回值:
    1)返回1-8则在坐标点上画出1-8,此函数的功能完毕,return
    2)返回0则继续调用函数num_mines(),再递归调用函数left_mouse();
    3)返回‘*’说明踩到地雷,return, game over!
    3.右键(画出旗帜)的函数
    此函数的主要功能是限制此位置,规定该位置不会被显示出数字或‘
    *
    4.初始化地雷分布位置和个数
    /*******************************************************************
    函数功能:根据设置的地雷个数和分布地图(map,数组)给出分布好了地雷的数组
    函数原型:void set_mines(nt m, int n, int num_mines)
    参数:(in)—— int num_mines
    ********************************************************************
    */
    void set_minesint num_mines)
    {
    int num =0;
    while (num <= num_mines)
    {
    rand_mines(m, n);
    //如果出现相同的情况呢?,没事,再循环几次,直到有了足够的地雷为止
    num = fun_num_mines(m, n);//判断地雷个数
    }
    }
    //设置随机选取(i,j),设置a[i][j] = '*'
    void rand_mines(int m, int n)
    {
    int i,j;
    srand(time(
    0));
    //rand()%n 取(0,n-1)的随机数
    i = rand() % m;
    j
    = rand() % n;
    map[i][j]
    ='*';
    }
    //判断地雷个数
    int fun_num_mines(int m, int n)
    {
    int i,j, k =0;
    for (i =0; i < m; i++)
    {
    for (j =0; j < n; j++)
    {
    if (map[i][j] =='*')
    {
    k
    ++;
    }
    }
    }
    return k;
    }
    5.主函数
    负责选关(设置m,n的大小)、选关接口...............

    游戏程序还没有完全写完,现在写完的只能在字符模式下运行,界面代码还在进行中...

    源代码下载地址:http://u.115.com/file/f0618e7853

    作者:涵曦www.hanxi.cc
    出处:hanxi.cnblogs.com
    GitHub:github.com/hanxi
    Email:im.hanxi@gmail.com
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    《 Skynet 游戏服务器开发实战》

  • 相关阅读:
    HTMLPARSER.NET 参考资料
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
    处理Selection对象和Range对象——Word VBA中重要的两个对象
    C# word开发
    c# 解析JSON的几种办法
    NameValueCollection详解
    解析jquery获取父窗口的元素
    Window_Open详解
    Implementing Remote Validation in MVC
  • 原文地址:https://www.cnblogs.com/hanxi/p/1997182.html
Copyright © 2020-2023  润新知