前言

这一篇文章介绍的是移动变换法,有详细的移动变化法的图文解析,在文末有完整的可用于查看移动变换法生成数独终盘过程的代码

实现思路

移动变换法这一方法是很简单的一种方法,实现起来也比较容易,但同时它也有弊端就是能够生成的数独终盘数量有限,而且有规律可循,只要掌握了对玩家而言就没有什么难度了!
这一方法的主要思路就是通过对一个生成的九宫格数进行行列变化,从而生成一个数独终盘,首先是生成一个1-9的随机序列,将这九个数依次填入一个九宫格,再将这九宫格填到一个大的九宫格里,再从这个填好的大九宫格中用一个小九宫格去截取,实现行列变化,生成一个完整的数独终盘

过程示意图

下面这张图片是将一个随机数列填到一个小九宫格中

下面这张图片是将刚刚填好的小九宫格填到大九宫格中

下面这张图片是从大九宫格中截取需要的数据,标黄的部分是要填到最终的数独终盘的第一宫中的数


下面这张图片中标黄的数是要填到最终的数独终盘的第二宫的数,相对于第一宫进行了行变换,就是将第一宫中的第一行的数填到第二宫的第三行,将第一宫中的第二行的数填到第二宫的第一行,将第一宫中的第三行的数填到第二宫的第二行。


下面这张图片中标黄的数是最终的数独终盘的第四宫的数,相对于第一宫进行了列变换,就是将第一宫中的第一列填到第四宫的第三列,将第一宫中的第二列填到第四宫的第一列,将第一宫中的第三列填到第四宫的第一列。


下面这张图片中标黄的数是要填到最终的数独终盘中第五宫中的数,相对于第一宫的数来说就是进行了一次列变换和一次行变换


下面这张图片就是经过移位变换之后生成的数独终盘

完整代码

本篇文章提供的代码的编译环境是visual studio 2019,需要运行下面代码时,打开visual studio 2019新建一个项目,新建一个源文件之后,只需要将代码复制到文件里运行就可以了,如果想要获取完整的数独游戏的代码可以私信我!如果想要了解其他实现数独终盘的方法可以到我的主页看我的另外一篇文章,是用暴力求解的方法生成数独终盘,那个方法与本文介绍的方法相比会稍微复杂一点!
如果觉得不错的话,可以点个赞吗,万分感谢!

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<time.h>
bool is_use[10];  //这一数组用于判断生成的随机数是否有重复的
int num[9];  //这一数组用于储存生成的随机数序列
int sudoku[81];  //这一数组用于储存最后生成的数独终盘
void randsudoku() { //产生随机序列(1-9)memset(is_use, false, sizeof(is_use));  //这一函数是用于将已经申请了空间的数组is_use中的值全部赋为falsefor (int i = 0; i < 9; i++) {srand(time(NULL));while (is_use[num[i]] || num[i] == 0) {  //这一语句用于判断生成的随机数是否是正确的,没有重复num[i] = rand() % 9 + 1;  //这一语句用于生成一个1-9的随机数}is_use[num[i]] = true;printf("%d\t", num[i]);}printf("\n");
}void print(int* answer) {//打印数独printf("┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓\n");for (int i = 0; i < 81; i++) {if (answer[i] == 0)printf("┃  ");elseprintf("┃ %d", answer[i]);if (i == 80) {printf("┃  ");printf("\n");printf("┗━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┛\n");}else if ((i + 1) % 9 == 0) {printf("┃  ");printf("\n");printf("┣━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");}}
}int* creat(int* num) {int tem[3][3], com[9][9] = {0}, a = 0;  //tem数组用于储存生成的小九宫格,com数组用于储存大的九宫格for (int i = 0; i < 3; i++) {  //这一嵌套for循环是用于将随机数列填到一个小九宫格中。for (int h = 0; h < 3; h++) {tem[i][h] = num[a];a++;}}printf("┏━━┳━━┳━━┓\n");for (int i = 0; i < 9; i++) {if (num[i] == 0)printf("┃  ");elseprintf("┃ %d", num[i]);if (i == 8) {printf("┃  ");printf("\n");printf("┗━━┻━━┻━━┛\n");}else if ((i + 1) % 3 == 0) {printf("┃  ");printf("\n");printf("┣━━╋━━╋━━┫\n");}}for (int i = 0; i < 3; i++) {  //这一嵌套for循环是用于将填好的小九宫格填到大的九宫格当中。for (int p = 0; p < 3; p++) {for (int h = 0; h < 3; h++) {com[3 * i + p][h] = tem[p][h];com[3 * i + p][h + 3] = tem[p][h];com[3 * i + p][h + 6] = tem[p][h];}}}for (int i = 0; i < 3; i++) {  //这一嵌套for循环是用于截取需要用于生成数独终盘的数。for (int p = 0; p < 3; p++) {for (int k = 0; k < 3; k++) {for (int l = 0; l < 3; l++) {sudoku[27 * i + 9 * k + 3 * p + l] = com[k + p][l + i];}}print(sudoku);}}return sudoku;
}
void main()
{randsudoku();creat(num);print(sudoku);
}

C语言简单数独游戏终盘生成相关推荐

  1. C语言学习 数独游戏

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

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

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

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

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

  4. 基于C++和QT实现的简单数独游戏软件

    资源下载地址:https://download.csdn.net/download/sheziqiong/85660211 一.实验题目与要求 本次实验主要内容是实现一个简单的数独软件,具体要求如下: ...

  5. c语言猜四位数游戏猜10次,C语言猜数字游戏--随机生成4个不相同的数字从小到大排序,用户开始游戏,如果用户猜对数字和数字对应的位置,界面回馈A,如果数字正确位置不正确,则回馈B...

    1.看程序运行截图吧!! 由于博主本人较笨,就不动画演示了,如果动画的话可能将是一个漫长的过程! 猜数字游戏.png 2.游戏题目 随机生成4个不相同的数字从小到大排序,用户开始游戏,如果用户猜对数字 ...

  6. c语言简单小游戏(模拟魔塔)

    比较渣的小游戏:::供像我一样的初学者学习或做着玩 下面是一些怪物说明   和操作说明: 1:怪物以及道具说明********************************************* ...

  7. java实现简单数独游戏

    本来打算晚上把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用,非洲人非了一天... 数独代码是在之前寒假受命写的,学了一个月java的成果,现在看来 ...

  8. Linux数独小游戏C语言,C语言实现数独游戏的求解

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

  9. c 语言写数独游戏,经典数独游戏+数独求解器—纯C语言实现

    [转]NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直 ...

最新文章

  1. mybatis =或这个=提示错误Tag name expecte问题解决
  2. mysql hypot_mysqli_stmt_prepare
  3. Eclipse调试常用技巧
  4. 差分进化算法_基于差分进化的水泥烧成系统动态优化算法
  5. Delphi 使用 Visual Studio Shell , 开源为期不远
  6. [转]easyui常用控件及样式收藏
  7. Chrome V8让你更懂JavaScript
  8. neo4j数据可视化_我如何使用neo4j可视化来自半结构化数据的连接
  9. You need to prove you’re evil cheap nike air max
  10. java设置cpu亲和性_cpu亲和性绑定
  11. 2019-11-14
  12. 【故障|监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe
  13. js判断浏览器是否为IE
  14. mixamo和ue小白人映射关系以及让mixamo绑定的人物在场景中运动的多种方法实践...
  15. 华为3108raid安linux,华为服务器 RAID卡配置 SR430 LSISAS3108(EFI/UEFI模式)
  16. 2020年7月中国编程语言排行榜
  17. 苹果屏蔽更新描述文件_苹果推送 iOS 13 首个公测版更新 | 附描述文件获取方法...
  18. HATEOAS 约束
  19. unity地面添加材质球_unity自带材质球
  20. OSChina 周五乱弹 —— 书生夜宿鬼宅

热门文章

  1. 搜索切换dump之MapReduce讲解
  2. proteus 02 555定时器脉冲电路
  3. Zynq-Linux移植学习笔记之32-SPI FLASH文件系统挂载
  4. SuperMap iDesktop .NET 10i制图技巧-----如何贴图
  5. ios create ml_什么是create ml框架
  6. python中font的用法_使用Python库判断字符是否在字体里
  7. mini2440基于motion的移动图像监控系统和基于SDL的远程监控
  8. 回收站被杀毒软件清理还能恢复文件吗
  9. ADSL上网密码破解记
  10. 无盘服务器虚拟盘内存不足,网吧技术 无盘虚拟内存正确设置分析