| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5784 人关注过本帖
标题:求数独游戏的源代码
只看楼主 加入收藏
gannimei
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-10-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
求数独游戏的源代码
老师布置的任务,要能做到调节难度的数独游戏,高手帮个忙谢谢!!
搜索更多相关主题的帖子: 源代码 游戏 
2010-10-14 15:01
帝国
Rank: 3Rank: 3
来 自:云南昆明
等 级:论坛游侠
帖 子:68
专家分:144
注 册:2010-10-11
收藏
得分:2 
如果是在程序设计过程中有何问题,我们可以帮你提供一些意见,但是如果你连一行代码都不会学,就要结果,那我觉得还是先去看看书在说吧,数独这样的休息不会太困难的,而在数独游戏中所谓的难度无非就是已知数的数量多少而已,谷歌个性主页中就有3个难度的数独游戏,你可以先去看看。这个程序最难的地方无非也就是做一个界面而已。
2010-10-14 15:31
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:2 
数独游戏是什么

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-14 20:21
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:2 
以下是引用帝国在2010-10-14 15:31:41的发言:

如果是在程序设计过程中有何问题,我们可以帮你提供一些意见,但是如果你连一行代码都不会学,就要结果,那我觉得还是先去看看书在说吧,数独这样的休息不会太困难的,而在数独游戏中所谓的难度无非就是已知数的数量多少而已,谷歌个性主页中就有3个难度的数独游戏,你可以先去看看。这个程序最难的地方无非也就是做一个界面而已。

这段话有几个错误:
数独的难度和已知数的数量没有绝对的关系
程序数独最难的地方并不是做界面,做界面是最容易的部分了

[ 本帖最后由 御坂美琴 于 2010-10-14 21:54 编辑 ]

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-14 21:18
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
以下是引用御坂美琴在2010-10-14 21:18:16的发言:

 
这段话有几个错误:
数独的难度和已知数的数量根本没有关系
程序数独最难的地方并不是做界面,做界面是最容易的部分了
版主一出 谁与争锋

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-14 21:20
帝国
Rank: 3Rank: 3
来 自:云南昆明
等 级:论坛游侠
帖 子:68
专家分:144
注 册:2010-10-11
收藏
得分:0 
以下是引用御坂美琴在2010-10-14 21:18:16的发言:


这段话有几个错误:
数独的难度和已知数的数量没有绝对的关系
程序数独最难的地方并不是做界面,做界面是最容易的部分了


确实,不可否认我的回答并不严谨,目前大多数的数独游戏都是9*9的,给出的数越多,填写起来也就越容易,数独的规则也非常的简单,在不考虑效率和资源占用量的情况下,我觉得最难的地方真的也就是界面的制作了。

虽然数独游戏在填写的时候很费劲,我也曾为了一个数独游戏连续4、5个小时盯着电脑研究,但是如果根据数独游戏的规则以程序来制作一个数独游戏,比填写内容要容易。

数独并不是一个非常复制的程序,其实数独程序并不需要过多考虑已知数的设置(当然,这是建立在至少有一种解法的基础上说的),就填写的人来说,其难度是以给出的已知数成正比的。

我也曾写过一个解数独游戏的程序,当然,并没有考虑效率和算法的问题,我写的程序更像是用穷举法完成的。当时做的时候花了一个多星期,总用时大概40多个工作时(不包括没有在电脑前的思考时间),现在回头来看还是走了很多的弯路,数学学的还是不好
2010-10-14 22:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:2 
我以前也写过解数独的程序,效率还行,1秒钟大约能解10000个数独左右。不过我本人解数独的能力有限,我那个程序显然不可能比我更会推理。

生成一个数独(我认为)显然比解一个难得多,速度一般也会慢一些。也有一些开源的数独项目,我当时看了一个叫 sodoku 的项目,主要是想研究一下生成算法。不过后来没太下心思,因为让它生成 10000 个数独耗了9分多钟的时间,而我的程序只用了 0.849 秒就解完了。可见生成还是挺费劲的~~


哦,另外我支持美琴的那几个观点。我写的那个程序根本就没有界面,而且至今我也不喜欢写带界面的东西,感觉有点华而不实。我现在只会用 JAVA 写点简单的界面,用 C 还得学一些库的用法,我目前还没有在这些方面上投过什么精力。


[ 本帖最后由 pangding 于 2010-10-14 23:24 编辑 ]
2010-10-14 23:20
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:2 
界面就是一坨屎, 界面怎么绘?还是得看绘制的方法,所以难的是 程序的逻辑,说的更细一点就是算法。
顺便说一句, 程序的逻辑与汇编之类的东西毛关系都没有。

[ 本帖最后由 BlueGuy 于 2010-10-15 08:45 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-10-15 08:43
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用帝国在2010-10-14 22:11:52的发言:



确实,不可否认我的回答并不严谨,目前大多数的数独游戏都是9*9的,给出的数越多,填写起来也就越容易,数独的规则也非常的简单,在不考虑效率和资源占用量的情况下,我觉得最难的地方真的也就是界面的制作了。

虽然数独游戏在填写的时候很费劲,我也曾为了一个数独游戏连续4、5个小时盯着电脑研究,但是如果根据数独游戏的规则以程序来制作一个数独游戏,比填写内容要容易。

数独并不是一个非常复制的程序,其实数独程序并不需要过多考虑已知数的设置(当然,这是建立在至少有一种解法的基础上说的),就填写的人来说,其难度是以给出的已知数成正比的。

我也曾写过一个解数独游戏的程序,当然,并没有考虑效率和算法的问题,我写的程序更像是用穷举法完成的。当时做的时候花了一个多星期,总用时大概40多个工作时(不包括没有在电脑前的思考时间),现在回头来看还是走了很多的弯路,数学学的还是不好

那你写一个能生成数独题目的试试看,注意是生成,不是求解,并且生成各级不同难度(这里的难度是指人类进行推理的困难程度)

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-15 10:09
瓦药墙
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:218
专家分:556
注 册:2009-9-16
收藏
得分:2 
程序代码:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

typedef struct
{
    int x;     //存放数组的横坐标
    int y;     //存入数组的纵坐标
} ElemType;

static ElemType list[81];   //定义一个表空间
int len = -1;               //len记录表的大小


void        AddListElem (ElemType);
int            GetListElem (ElemType *, int);
void        ShowMe (int [][9]);
int            AddCount (int [][9]);
int            CheckLine (int [][9], int, int);
int            CheckRow (int [][9], int, int);
int            CheckPalace (int [][9], int, int, int);

int GetListElem (ElemType *e, int i)
{//取得元素
    if (i < 0)
    {
        return 0;
    }
    *e = list[i];
    return 1;
}

void AddListElem (ElemType e)
{//把数独原本为空的坐标存入表中
    len++;
    list[len] = e;
}

int CheckPalace (int arr[][9], int line, int row, int count)
{//检查小宫
    int i, j;
    int a, b;
    i = line / 3 * 3;
    j = row / 3 * 3;    //i,j为一个小宫的起始横纵下标
    for (a = i; a < i + 3; ++a)
    {
        for (b = j; b < j + 3; ++b)
        {
            if (arr[a][b] == count)
            {
                return 1;
            }
        }
    }
    return 0;
}

int CheckRow (int arr[][9], int row, int count)
{//检查列
    int i;
    for (i = 0; i < 9; ++i)
    {
        if (arr[i][row] == count)
        {
            return 1;
        }
    }
    return 0;
}

int CheckLine (int arr[][9], int line, int count)
{//检查行
    int j;
    for (j = 0; j < 9; ++j)
    {
        if (arr[line][j] == count)
        {
            return 1;
        }
    }
    return 0;
}

int AddCount (int arr[][9])
{//添加数
    int i, j, k;
    int count;
    ElemType e;

    k = -1;
    for (i = 0; i < 9; ++i)
    {
        for (j = 0; j < 9; )
        {
            count = 1;
            if (!arr[i][j])
            {
                k++;
                while ( ( CheckLine (arr, i, count) || CheckRow (arr, j, count)
                    || CheckPalace (arr, i, j, count) ) && count <= 9 )
                {
                    count ++;
                }
                if (count > 9)
                {
                    do
                    {
                        arr[i][j] = 0;
                       
                        if ( GetListElem (&e, k - 1) )
                        {
                            k--;
                            i = e.x;
                            j = e.y;
                       
                        }
                        else
                        {
                            return 0;
                        }
                        count = arr[i][j] + 1;
                        while ( ( CheckLine (arr, i, count) || CheckRow (arr, j, count)
                                || CheckPalace (arr, i, j, count) ) && count <= 9 )
                        {
                            count++;
                        }
                    }while (count > 9);
                    arr[i][j] = count;
                }
                else
                {
                    arr[i][j] = count;
                    j++;
                }
            }
            else
            {
               
                j++;
            }
        }
    }
    return 1;
}

void ShowMe (int arr[][9])
{//显示数独
    int i, j;
    for (i = 0; i < 9; ++i)
    {
        if ( (i+1) % 3 == 1 )
        {
            printf ("  ------------------------\n");
        }
        for (j = 0; j < 9; ++j)
        {
            if ( (j + 1) % 3 == 1 )
            {
                printf ("%2c", '|');
            }
            printf ("%2d", arr[i][j]);   
        }
        printf ("%2c\n", '|');
    }
    printf ("  ------------------------\n");
}

int main (void)
{
    int i, j;
    ElemType e;
    int arr[9][9];
    memset ( arr, 0, 81 * sizeof (int) );


    //输入一个数独谱,填0到9,0表示空位,然后把空位坐标保存起来
   
    printf ("请输入一个9*9数独谱,0表示空位\n");
    for (i = 0; i < 9; ++i)
    {
        for (j = 0; j < 9; ++j)
        {
            scanf ("%d", &arr[i][j]);
            if ( !arr[i][j] )
            {
                e.x = i;
                e.y = j;
                AddListElem (e);
            }
        }
    }

    if ( AddCount (arr) )
    {
        ShowMe (arr);
    }
    else
    {
        printf ("该数独无解\n");
    }
    system ("pause");
   
    return 0;
}

不巧前阵子我写了个求解数独的,很菜,想了好久才写出来,没考虑太多,只考虑结果对不对,写得很勉强,莫笑
2010-10-16 00:22
快速回复:求数独游戏的源代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019799 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved