数独游戏-C语言实现

目标

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

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

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

实现说明

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

  1. 随机产生一个长度为9的一维数组,元素是随机产生的1到9的不同数字。

比如为root = [1, 4, 3, 5, 6 ,7, 8 ,9, 2].

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

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

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

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

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

结果

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

代码:

语言: 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的一维数组rootfor(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中元素赋给magicfor (i = 0; i < 9; i++){for (j = 0; j < 9; j++){magic[i][j] = squa[i][j];}}//判断位置处元素非0if (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语言实现相关推荐

  1. java数独流程图_九宫格数独游戏C语言解法

    最近几天深圳一直下雨,一个人闷在屋里很是无聊,偶然打开一个小游戏网站看到了我的最爱--九宫格数独游戏.共有1-5五个难度级别,像我这种资深玩家其他难度就不用考虑了,冲着难度5的题目就去了,结果做地汗流 ...

  2. c语言编程数独游戏,编程做数独游戏

    数独游戏非常好玩,可以训练玩家的逻辑推理能力.数独游戏的规则是: 1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 2.必须满足的条件:每一行 ...

  3. C语言学习 数独游戏

    摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. C语言学习 数独游戏 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 ...

  4. c语言实现数独游戏求解

    数独游戏,c语言 玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 输入包含9x9的已知数字,空位用0补齐,中间用空格隔开 ...

  5. C语言简单数独游戏终盘生成

    前言 这一篇文章介绍的是移动变换法,有详细的移动变化法的图文解析,在文末有完整的可用于查看移动变换法生成数独终盘过程的代码 实现思路 移动变换法这一方法是很简单的一种方法,实现起来也比较容易,但同时它 ...

  6. 数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯

    问题描述 你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重 ...

  7. python数独游戏源代码_使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...

  8. winform数独C#的数独游戏

    功能描述 winform数独C#的数独游戏 本程序基于.netframework使用C#语言开发,实现功能: 1.各个难度随机出题(New): 2.数独解题提示(Compute): 3.输入的合法性校 ...

  9. 安卓期末大作业——Android数独游戏

    功能描述: app实现了数独游戏基础功能,难度分为入门,初级和大师级,可设置背景音乐.背景颜色和字体大小等,适合新手学习.搭建方法请看教程菜单中的androidstudio项目搭建教程. 开发语言: ...

最新文章

  1. 机器学习算法的优点和缺点总结
  2. USEARCH11命令大全,200+命令中文简介,快速查找需要功能
  3. Docker的性能损耗:以基因组分析流程为例
  4. 【转】几种页面重定向代码总结
  5. 用c语言编程实现strcpy,用c语言.模拟实现strcpy,strcat,strcat,memcpy,memmove
  6. 我猜后台管理路径猜解
  7. 搭建项目_跟着团子学SAP PS:项目模版搭建
  8. 如何用UE(UltraEdit)删除重复行?--转
  9. 开源Linux 3.3内核首次融合Android代码
  10. always on sql 收缩日志_使用alwayson后如何收缩数据库日志的方法详解
  11. docker 容器中不支持中文的解决方法
  12. “此网站使用的安全性配置已过时,这可能会导致您的信息(例如密码、消息或信用卡卡号)”
  13. jedis默认切片实现及对应python版本实现
  14. matlab验证dtft移位性质,7.DTFT的Matlab实现.ppt
  15. Python分析与处理---利用Python进行学生成绩分析
  16. 中小型企业基于大数据技术的项目实践
  17. C#多进程文件读写的锁处理
  18. 文本自动生成研究进展与趋势
  19. AndroidHttpCapture---手机轻松抓包工具
  20. c++ 之 在VS中添加lib的4种方法

热门文章

  1. 计算机的管理软件有哪些,电脑里有很多文件,很乱但是都有用,有什么管理软件值得推荐?...
  2. Oracle导入英文日期格式数据出现问题的解决
  3. 情人节用python实现 跳动爱心代码 ,表白神器
  4. 在Java中构建响应式微服务系统——第三章 构建响应式微服务
  5. 网络安全工程师的简单介绍
  6. 项目敏捷管理模式有哪几种_敏捷团队中有效沟通的5种模式
  7. java手机壁纸_java-爬取手机高清壁纸
  8. HAL库版STM32双轮自平衡车(三) ———代码精讲
  9. gcc -m32报错的解决办法
  10. Ubuntu1804 使用mondorescue 进行系统备份iso制作