之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏。
现在将全部代码分享出来和大家学习交流,当然代码中有着各种各样的问题和不足之处,望各位朋友批评指点。

以下是生成数独地图的核心算法,算法不是很好,也是之前参考过网上的一些思想:

package hlc.shudu.src;/** 数独的帮助类,里面提供数据所需的所有算法*/
public class ShuduHelper {//数独地图数组private static int[][] maps = new int[9][9];//每个小九宫格可放置位置的数private static int[] canPutSum = new int[9];//用来存储之前放置过的位置static int[] used = new int[9];//是否已经完成地图的生成static boolean isOk = true;/** 得到数独地图数组*/public static int[][] getMap() {//判断是否已经完成地图的生成,要是没有完成就重新生成。//从这里就可以看出算法还有待优化,如果回溯的好的话就一直可以通过回溯来重新生成,而这里是通过重新执行生成算法来重新生成。希望感兴趣的朋友可以去实现以下。do{isOk = true;initMaps();}while(!isOk);return maps;}/** 初始化maps*/private static void initMaps() {// 初始化地图数组中没有填入任何数字for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {maps[i][j] = -1;}}// 依次填入1~9for (int num = 1; num <= 9; num++) {for (int i = 0; i < 9; i++) {used[i] = -1;canPutSum[i] = -1;}// 遍历大九宫格中的每个小九宫格for (int i = 0; i < 9; i++) {if (canPutSum[i]==-1) {canPutSum[i] = getCanPutSum(i, num);}if (canPutSum[i]==1) {used[i] = -1;}if (canPutSum[i] == 0) {canPutSum[i] = -1;used[i] = -1;// 如果当前小九宫格中不能放入数字num,则回到前一个小九宫格if (i > 0) {// 将前一个九宫格中放num的位置清空if (used[i-1]!=-1) {//maps[(int) (Math.floor(used[i-1]/3)+Math.floor((i-1)/3)*3)][used[i-1]%3+((i-1)%3)*3]=-1;clearNum(i - 1, num);}// i回退一个,因为等会for循环灰给i加一,所以这里减2i -= 2;continue;} else {isOk = false;return;}} else {// 将num放入当前小九宫格中boolean flag = false;while (!flag) {int j = (int) (Math.random() * 9);// 当前小方格横坐标int ii = (i / 3) * 3 + j / 3;// 当前小方格纵坐标int jj = (i % 3) * 3 + j % 3;//System.out.println("num:"+num+"\tii:"+ii+"\tjj:"+jj);// 如果可以放置num则放置if (maps[ii][jj] == -1 && j!=used[i] && isCanPut(ii, jj, num)) {maps[ii][jj] = num;used[i] = j;canPutSum[i] -= 1;flag = true;}}}}}}/** 清空第i个小九宫格中的num*/private static void clearNum(int i, int num) {for (int j = 0; j < 9; j++) {// 当前小方格横坐标int ii = (i / 3) * 3 + j / 3;// 当前小方格纵坐标int jj = (i % 3) * 3 + j % 3;// 判断当前小方格是否可以放置if (maps[ii][jj] == num) {maps[ii][jj] = -1;}}}/** 得到当前小九宫格可以放入数字num的位置数目*/private static int getCanPutSum(int i, int num) {int sum = 0;// 遍历小九宫格for (int j = 0; j < 9; j++) {// 当前小方格横坐标int ii = (i / 3) * 3 + j / 3;// 当前小方格纵坐标int jj = i % 3 * 3 + j % 3;// 判断当前小方格是否可以放置if (maps[ii][jj] == -1 && isCanPut(ii, jj, num)) {++sum;}}return sum;}/** 指定横纵坐标点是否可以放置num*/private static boolean isCanPut(int ii, int jj, int num) {// 判断指定坐标点的同行或同列是否有相同数字,要是有则为falsefor (int i = 0; i < 9; i++) {if (maps[ii][i] == num) {return false;}if (maps[i][jj] == num) {return false;}}return true;}
}

完整程序包可在GitHub上下载:https://github.com/houlongchao/shudu.git

数独游戏java版(一)--核心算法相关推荐

  1. 仙剑java_xianjian 仙剑游戏JAVA版源码,早期练习保存的资料 Develop 244万源代码下载- www.pudn.com...

    文件名称: xianjian下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 636 KB 上传时间: 2015-10-06 下载次数: 0 提 供 者: 黄 详 ...

  2. 拼图java源码_拼图游戏Java版源代码JAVA游戏源码下载

    Java版的拼图游戏,玩家能够自己更换图片,只需你把它分成块,另外它是以成绩=1000-时间(秒)-移动步数*10来决意你是否输了,按F1键起头游戏,Y健预览图片. 拼图游戏Java版源代码 (1 f ...

  3. 数独游戏-安卓版源代码和分析。

    1.在创建的项目中,主要有以下类,其中, Game.java 是数独游戏的算法: keydialog:主要控制数据九宫格的显示和操作 MainActivity:主要加载主页面,代码只需改动一个setc ...

  4. 9 9简单的数独游戏python,python实现数独游戏 java简单实现数独游戏

    使用python和java实现数独游戏,有比较才有收获哦. 1.Python版 #--coding:utf-8-- import random import itertools from copy i ...

  5. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  6. java插入排序实现,经典(Java版)排序算法的分析及实现之一直接插入排序

    预备知识 排序算法从功能上是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列.从内存空间使用简单上看分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序,适合不太大的元素序列 ...

  7. 魔塔小游戏Java版项目

    这是一款童年游戏4399网站上的魔塔仿制版,回忆童年,入手开发项目,全方面的代码解析 更多项目: 1.飞机大战Java版(Java+JavaSwing+多线程结构) 2.Java之马里奥游戏 3.大鱼 ...

  8. java写枪战游戏,Java版星球大战游戏(横向射击)

    Java版星球大战游戏(横向射击) 准备逐步整理一下手中的第三方Java游戏代码,将能用的部分融入到LGame里去,没有能用部分的就直接删掉. 但无论程式难易如何,也是原作者一番心血,不应将它们弃如敝 ...

  9. Visual C++实现黑白棋游戏实战三:核心算法设计与实现(附源码和资源 可用于大作业)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 在前面的博客中已经讲解了黑白棋游戏的菜单和各种对话框的实现,下面将对黑白棋游戏的核心算法的设计和实现进行讲解 一.棋盘窗口类的设计 黑白棋的棋盘窗口 ...

最新文章

  1. Tensorflow【实战Google深度学习框架】TFLearn大宝剑
  2. getbean方法找不到bean_和平精英:一直找不到敌人?5个方法,让你彻底摆脱“瞎子”...
  3. 单片机流星灯_51单片机拖尾灯实现
  4. 《WinForm开发系列之高级篇》Item2 TCP异步传输
  5. uniq 去除重复命令使用方法介绍
  6. 凭什么,Netty能成为最流行的NIO框架?
  7. bgsave配置与工作流程
  8. html如何开发影音播放器app,js HTML5多媒体影音播放
  9. 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
  10. 团队协作软件之confluence和jira的配套使用
  11. 基于Vue.js模拟酒店预订移动App
  12. 有些段子,外行人根本看不懂,只有程序员看了会狂笑不止
  13. 什么是大小端?怎样判断?
  14. HackBGRT(一):修改window系统启动logo动画
  15. java支付宝当面付接口_【图文】支付宝当面付配置教程
  16. Web应用怎样获取Access Token?
  17. python,时间的四种格式
  18. docker 容器压缩工具docker_squash , 非常好用!!!!!!!!!
  19. 简易数据看板--直播订单统计分析
  20. java手机ua_通过UA判断手机的类型

热门文章

  1. Batch Normalization 的实战使用
  2. 【阿旭机器学习实战】【33】中文文本分类之情感分析--朴素贝叶斯、KNN、逻辑回归
  3. Word2vec 原理解析
  4. 谈谈TL431与AZ431代换通用问题(个人经验)
  5. 苹果Mac:关于FCPX插件位置以及如何删除插件
  6. 5.1 如何创建和了解多线程
  7. Intel史上最能超频的10款CPU
  8. android 5寸屏分辨率是多少,索尼Z5的屏幕尺寸是多少?索尼Z5的分辨率是多少?...
  9. 简易的canvas画板
  10. 敏捷开发,SIT测试