iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言怎么实现数独游戏
  • 492
分享到

C语言怎么实现数独游戏

2023-06-29 16:06:46 492人浏览 八月长安
摘要

本文小编为大家详细介绍“C语言怎么实现数独游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现数独游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目标写一个数独游戏,有以下功能:能随机产生题目并给

本文小编为大家详细介绍“C语言怎么实现数独游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现数独游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

目标

写一个数独游戏,有以下功能:

能随机产生题目并给出答案。

求解输入的题目并输出答案。

实现说明

参照百度百科等资料可以知道求解数独的主要算法是:1.通过行、列和宫格确定可填数字。2.所有可行数字逐一填入得到结果。本程序求解数独部分也采用这样的算法。而生成题目的算法是:

随机产生一个长度为9的一维数组,元素是随机产生的1到9的不同数字。
比如为root = [1, 4, 3, 5, 6 ,7, 8 ,9, 2].

先获得一个填满的九宫格accord。
2、假如九宫格accord的第一行为[6, 4, 5, 7, 3, 9, 8, 1, 2], 则可获得的九宫格squa的第一行第一列元素这样产生:看accord对应元素为6,则看root中6后一位的数为7,则所求数字为7。以此类推。
3、根据难度随机去除一定数量的空格则得到了随机产生的数独题目。

下面介绍本程序的主要难点和创新点:

解数独的递归法。首先要定义一个检查函数judge用于判断某个数字在某个位置是否合适,进而根据找到的递归头即至最后一个位置后,分是否为0两种情况,否则,继续递归。

随机产生1到9之间的数。由于编译器自带函数rand会出现元素不变的确点,所以使用系统时间为种子,并引入全局变量index,使得时间差加大,避免固定不变。

定义各种函数简化程序。本程序定义了fprintf用于打印九宫格,定义reRank来获取元素在数组中位置等,简化了程序。

结果

下面是分别选择1(产生题目)和2(计算数独)后的结果图:

C语言怎么实现数独游戏

C语言怎么实现数独游戏

代码:

语言: C

//期末实验报告-简单的数独计算器#include <stdio.h>#include <stdlib.h>#include <time.h> long index = 0;    //全局变量index是保证每次产生的随机元素随机性void main(){    void solve(int squa[9][9], int num);     void fprintf(int squa[9][9]);    int reRank(int root[9], int numb);    int myRand(int range);    int squa[9][9], accord[9][9]={   //定义用于生成数独的参照数组        {6, 4, 5, 7, 3, 9, 8, 1, 2},        {2, 1, 8, 6, 4, 5, 9, 7, 3},        {7, 3, 9, 2, 8, 1, 6, 4, 5},        {5, 9, 6, 3, 7, 4, 2, 8, 1},        {4, 8, 7, 5, 1, 2, 3, 6, 9},        {3, 2, 1, 8, 9, 6, 7, 5, 4},        {9, 5, 3, 4, 6, 7, 1, 2, 8},        {8, 7, 2, 1, 5, 3, 4, 9, 6},        {1, 6, 4, 9, 2, 8, 5, 3, 7}        };    int root[9], answ[9][9]; //定义用于生成数组的一维数组和临时数组    int i, j, k, p = 0;    int row;    int choose, rtemp, diff; //分别定义选择变量,难度    char result;    printf("———请选择*1*生成一个数独——*2*计算一个数独———\n");    scanf("%d", &choose);//**************选择1生成一个填好的数独****************************    //根据生成数独题目算法先存入一个数独    if(1 == choose)    { //产生范围为1-9的一维数组root      for(i = 0; i < 9; i++)      {          root[i] = myRand(9);      }      for(i = 0; i < 9; i++)      {            for(j = 0; j < i; j++)            {                if(root[i]==root[j]) //使root中元素各不相同                root[i] = myRand(9);            }      }      //随机产生完整九宫格      for(i=0;i<9;i++)      {         for(j=0;j<9;j++)         {            row = reRank(root,accord[i][j]);            squa[i][j] = root[(row+1)%9];         }      }      for (i = 0; i < 9; i++)      {         for (j = 0; j < 9; j++)         {            answ[i][j] = squa[i][j];         }      }      //根据不同难度需求处理数组      printf("————请选择难度等级:1(低级)--2(中级)--3(高级)————\n");      scanf("%d", &diff);      if(diff==1)               //难度为低级时有30个空格      {            for(k=0; k<20;)//; k++)            {                 i = myRand(9)-1;                 j = myRand(9)-1;                 if(squa[i][j] != 0)                 {                  squa[i][j] = 0;                  k++;                 }                    }      }      else if(diff==2)          //难度为中级时有50个空格      {              for(k=0; k<30;)            {                 i = myRand(9)-1;                 j = myRand(9)-1;                 if(squa[i][j] != 0)                 {                  squa[i][j] = 0;                  k++;                 }                    }      }      else if(diff==3)            //难度为中级时有70个空格      {            for(k=0; k<60;)            {                 i = myRand(9)-1;                 j = myRand(9)-1;                 if(squa[i][j] != 0)                 {                  squa[i][j] = 0;                  k++;                 }                    }      }      printf("************题目如下(0表示空格)****************\n");      fprintf(squa);      printf("——————Enter键显示答案——————");      fflush(stdin);           //除去缓存影响      scanf("%c", &result);      if(result == 10)          fprintf(answ);    }//**************选择2输入并计算一个数独****************************     else    {      //*******输入题目***********************************      printf("*********请输入题目(空缺以0代替)**********");      printf("\n******||1*2*3*4*5*6*7*8*9\n");      for (i = 0; i < 9; i++)      {         printf("******%d:", i + 1);         for (j = 0; j < 9; j++)         {            scanf("%d", &squa[i][j]);         }      }      solve(squa, 0);    //调用函数计算结果    }} //定义函数可以产生随机产生1-9的数int myRand(int range) {    srand((unsigned)time( NULL ) + index);    index++;     return rand()%range + 1;     }//定义函数可以在root中根据元素找位置int reRank(int root[9], int numb){        int i;     for(i = 0; i < 9; i++)    {        if(root[i] == numb)        return i;    }}//解决的第一步:判断空缺处可填数字的judge函数int judge(int squa[9][9], int m, int n, int posb){    int num, gridi, gridj;                  int gi = m / 3 * 3, gj = n / 3 * 3;   //计算元素的宫格位置    for (num = 0; num < 9; num++)         //根据行元素判断    {        if (squa[m][num] == posb)            return 0;    }    for (num = 0; num < 9; num++)          //根据列元素判断    {        if (squa[num][n] == posb)            return 0;    }    //根据宫格元素判断    for (gridi = gi; gridi < gi + 3; gridi++)    {        for (gridj = gj; gridj < gj + 3; gridj++)        {            if (squa[gridi][gridj] == posb)                return 0;        }    }    return 1;}//定义递归函数solve求得一种结果void solve(int squa[9][9], int num){       void fprintf(int squa[9][9]);    int posb;    int i, j, value;    int magic[9][9];//定义临时数组    int sm,sn;    sm=num/9;      //计算元素行数    sn=num%9;      //计算元素列数    //将squa中元素赋给magic    for (i = 0; i < 9; i++)    {        for (j = 0; j < 9; j++)        {            magic[i][j] = squa[i][j];        }    }    //判断位置处元素非0    if (magic[sm][sn] != 0)      {        if (sm == 8 && sn == 8) //递归头        {            printf("————————参考结果————————\n");            fprintf(magic);        }        else        {            solve(magic, num+1);        }    }    else //判断位置处元素为0    {        for (posb = 1; posb <= 9; posb++)        {   //根据判断函数返回值决定是否赋值            value = judge(magic, sm, sn, posb);            if (value)            {                magic[sm][sn] = posb;                if (sm == 8 && sn == 8) //递归头                {                    printf("————————参考结果————————\n");                    fprintf(magic);                    }                else                {                    solve(magic, num+1);                }                magic[sm][sn] = 0;            }        }    }}//打印数组结果函数fprintf的定义void fprintf(int squa[9][9]){   int i,j;  for (i = 0; i < 9; i++)        {                for (j = 0; j < 9; j++)                {                        printf("%d ", squa[i][j]);                    if ((j == 2) || (j == 5)) //换列时加空格                    printf(" ");                }                printf("\n");                if ((i == 2) || (i == 5))     //换行时加换行符                {                    printf("\n");                }        }            }

读到这里,这篇“C语言怎么实现数独游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言怎么实现数独游戏

本文链接: https://www.lsjlt.com/news/325591.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言怎么实现数独游戏
    本文小编为大家详细介绍“C语言怎么实现数独游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现数独游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目标写一个数独游戏,有以下功能:能随机产生题目并给...
    99+
    2023-06-29
  • C语言实现数独游戏
    本文实例为大家分享了C语言实现数独游戏的具体代码,供大家参考,具体内容如下 目标 写一个数独游戏,有以下功能: 1:能随机产生题目并给出答案。 2:求解输入的题目并输出答案。 实现说...
    99+
    2024-04-02
  • C语言实现数独小游戏
    本文实例为大家分享了C语言实现数独小游戏的具体代码,供大家参考,具体内容如下 输入包含9x9的已知数字,空位用0补齐,中间用空格隔开。(输入数独题目确保正确)输出为输入数独题目的解。...
    99+
    2024-04-02
  • c语言怎么实现猜数字小游戏
    本篇内容介绍了“c语言怎么实现猜数字小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言      &...
    99+
    2023-06-30
  • C语言数组怎么实现扫雷游戏
    本篇内容主要讲解“C语言数组怎么实现扫雷游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言数组怎么实现扫雷游戏”吧!1、扫雷是什么?百度百科:《扫雷》是一款大众类的益智小游戏,于1992年...
    99+
    2023-06-30
  • 怎么用C语言实现2048游戏
    本篇内容主要讲解“怎么用C语言实现2048游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现2048游戏”吧!本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,...
    99+
    2023-06-20
  • C语言怎么实现飞机游戏
    这篇“C语言怎么实现飞机游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么实现飞机游戏”文章吧。scanf 控制飞...
    99+
    2023-06-30
  • C语言数组实现扫雷游戏
    本文实例为大家分享了C语言数组实现扫雷游戏的具体代码,供大家参考,具体内容如下 游戏界面展示: 一开始菜单界面: 选择 0 退出程序: 选择 1 开始游戏: 输入要排查雷的坐标...
    99+
    2024-04-02
  • C语言实现猜数字小游戏
    利用C语言代码实现猜数字小游戏: #include <stdlib.h> #include <stdio.h> #include <time.h&g...
    99+
    2024-04-02
  • C语言版扫雷游戏怎么实现
    这篇文章主要介绍C语言版扫雷游戏怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用c语言做一个扫雷功能的简单实现,首先创建一个test.c来用于在写代码的途中测试扫雷代码,game.h来存放实现扫雷函数需要用到...
    99+
    2023-06-25
  • C语言怎么实现打砖块游戏
    这篇文章主要介绍“C语言怎么实现打砖块游戏”,在日常操作中,相信很多人在C语言怎么实现打砖块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现打砖块游戏”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-30
  • C语言怎么实现扫雷小游戏
    本篇内容介绍了“C语言怎么实现扫雷小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供...
    99+
    2023-06-20
  • C语言怎么实现三子棋游戏
    这篇文章主要讲解了“C语言怎么实现三子棋游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么实现三子棋游戏”吧!很多人从小都玩过三子棋,相信很多人都对这个游戏的实现有所疑问。那么今天...
    99+
    2023-06-20
  • C语言怎么实现井字棋游戏
    今天就跟大家聊聊有关C语言怎么实现井字棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。井字棋游戏要求在3乘3棋盘上,每行都相同或者每列都相同再或者对角线相同,则胜出.因此我们可以...
    99+
    2023-06-25
  • C语言实现空战游戏
    本文实例为大家分享了C语言实现空战游戏的具体代码,供大家参考,具体内容如下 一、项目描述和成果展示 项目描述:   在以往的程序中进行了改进。例如:   可以发射...
    99+
    2024-04-02
  • 用C语言实现2048游戏
    本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,具体内容如下 我遇到的几个问题: 问题1:如何显示? system("clear");//清屏 每次发生变化就清屏...
    99+
    2024-04-02
  • 怎么使用C语言数组实现扫雷游戏
    本篇内容主要讲解“怎么使用C语言数组实现扫雷游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用C语言数组实现扫雷游戏”吧!游戏界面展示:一开始菜单界面:选择 0 退出程序:选择 1 开始...
    99+
    2023-07-02
  • c语言猜数字1到100游戏怎么实现
    以下是一个实现C语言猜数字1到100游戏的示例代码:```c#include #include #include int main(...
    99+
    2023-08-15
    c语言
  • C语言怎样实现扫雷游戏
    这篇文章主要介绍了C语言怎样实现扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述扫雷是一款大众类的益智小游戏。游戏目标是根据点击格子出现的数字找出所有非雷格子,同时...
    99+
    2023-06-15
  • C语言实现简单猜数字游戏
    前言 对于c语言初学者来说用c语言实现猜数字游戏是基本的问题,本篇文章会细致的讲解如何用代码来实现猜数字游戏。希望读者在阅读本篇博客前学习玩分支与循环和最基本的c语言语法知识。 提示...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作