数独+GUI界面

1.基于第一次的数独作业添加额外的GUI界面

  a.生成任意数量的数独并能将数独在界面内依次显示,棋盘上总空格数大于30,小于60,每3*3小棋盘中挖空不少于2个。

  b.数独题目只有唯一一解

  c.用户可以在界面上通过编辑输入完成数独题目。

  d.用户完成数独题目后可以得到正确性反馈

  e.友好的使用说明。

2.其他要求与第一次作业相同

作业:应为自己对C++掌握不足,所以在此次作业中使用了其他的编程语言来实现。实验环境tomcat服务器、C++、html

应为在这次的作业中无法将所有的功能全部用C++语言来实现,所以界面使用Html来编写、用Ajax来读取txt文件里面的数据(因为存在跨域的问题就使用tomcat作为服务器)

C++的输出数组的txt文档命名方式也是用(0~n).txt来命名,方便ajax来取文档数据。

C++代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
int main()
{
    int a[9][9] = {
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0
    };
    int i,j,l;
    int n;
    int sudu(int i,int j,int a[9][9]);
    int find_next_empty(int a[9][9],int num, int *i, int *j);
    srand(time(0));

    printf("输入数独个数 
");
    //生成不重复的函数
    scanf("%d",&n);
    
    for(l=0;l<n;l++)
    {
        int a[9][9] = {
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,0
        };
        int time1=rand()%10;
        printf("请等待.... 
");
        Sleep(time1*100);
        for(j=0;j<9;j++)
        {
            int flag=1;
            int random=time1+rand()%10;
            for(i=0;i<9;i++)
            {
                if(random == a[0][i])
                {
                    flag=0;
                }
            }
            if(flag==1)
            {
                a[0][j]=random;
            }
        }

        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                //printf("%d ",a[i][j]);
            }
            //printf("
");
        }

        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                sudu(i,j,a);
                find_next_empty(a, 0, &i, &j);
            }
        }

        FILE *fpt;
        char s[100];
        sprintf(s,"%d",l);
        sprintf(s,"%s%s",s,".txt"); 
        fpt = fopen(s,"a+");//打开文档,写入

        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                fprintf(fpt,"%d|",a[i][j]);
                printf("%d ",a[i][j]);
            }
            //fprintf(fpt,"
");
            printf("
");
        }

        //fprintf(fpt,"--------
");
        printf("--------
");

        fclose(fpt);
    }
    

    return 0;
}
int sudu(int row,int col,int arr[9][9])
{
    int count=0;
    int flag=1;
    int i,j;
    int next_row,next_col;
    int find_next_empty(int a[9][9], int num, int *i, int *j);

    //获取下一个元素的行和列
    /*for(i=row;i<9;i++)
    {
        for(j=col;j<9;j++)
        {
            if(arr[i][j]==0)
            {
                nextRow=i;
                nextCol=j;
                break;
            }
        }    
    }*/
    tag:
    while(count<9)
    {
        count++;
        int i,j;
        //判断行重复
        for (j = 0; j < 9; j++) {
            if (arr[row][j] == count) {
                goto tag;
            }
        }        
        // 判断列重复
        for (i = 0; i < 9; i++) {
            if (arr[i][col] == count) {
                goto tag;
            }
        }        
        /* 判断3x3宫格重复*/
        int x = (row / 3) * 3;
        int y = (col / 3) * 3;
        for (i = x; i < x + 3; i++) {
            for (j = y; j < y + 3; j++)    {
                if (arr[i][j] == count) {
                    goto tag;
                }
            }
        }
        arr[row][col]=count;

        if (!find_next_empty(arr, row, &next_row, &next_col)) {
            return 1;
        }
        //否则继续填下一个未填充的格子
        if (!sudu(next_row, next_col,arr)) {
            arr[row][col] = 0;
            continue;
        } else {
            return 1;
        }
        return 0;
    }
    return 0;
}
// 寻找下一个未填充的单元
int find_next_empty(int arr[9][9], int startrow, int *row, int *col)
{
    int i, j;
    for (i = startrow; i < 9; i++) 
        for (j = 0; j < 9; j++) 
            if (arr[i][j] == 0) {
                *row = i;
                *col = j;
                return 1;
            }
    return 0;
}

Html代码

<!DOCTYPE html>
<!--
    30<棋盘总空格数<60,3x3棋盘中最少挖空数>=3  ==>每个3X3棋盘都挖空4个  30<4*9<60
-->
<html>
<head>
<meta charset="UTF-8" />
<link href="styles/style.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="script/jquery.min.js"></script> 
<script type="text/javascript" src="script/EdTable.js"></script> 
<script>
    $(document).ready(function(){
        EdTable.initBindGridEvent();
    });
    var num=0;
    window.onload=function()
    {
        var xhr =new XMLHttpRequest()
        xhr.open("GET", num+".txt", true);//注意路径问题读取data.txt文件的内容。
        xhr.send(null);
        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4) {
            if (xhr.status == 200||xhr.status==0) {//请求本地txt文件时状态码是0。
                //alert(xhr.responseText);
                for(var i=0;i<81;i++)
                {
                    var result = xhr.responseText.split("|"); 
                }
                for(var j=0;j<81;j++)
                {
                    //console.log(result[j]);
                }
                
                //创建完整表格
                var row1=9;//获取属性值
                var col1=9;//获取属性值
                var div1=document.getElementById("div1");
                var tab="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='wanzheng' style='float:right;display:none'>";
                //循环行
                var flag=0;
                for(var i=0;i<row1;i++)
                {
                    tab+="<tr>";
                    //循环列
                    for(var j=0;j<col1;j++)
                    {
                        tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        flag=flag+1;
                    }
                    tab+="</tr>";
                }
                tab+="</table>";
                
                //缺失数组
                tab+="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='queshi' style='float:left'>";
                //循环行
                var flag=0;
                for(var i=0;i<row1;i++)
                {
                    tab+="<tr>";
                    //循环列
                    for(var j=0;j<col1;j++)
                    {
                        //写死 每个3X3棋盘都挖空4个
                        if(flag =='0' || flag == '1' || flag == '10' || flag == '19')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='21' || flag == '13' || flag == '4' || flag == '5')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='7' || flag == '8' || flag == '15' || flag == '25')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='27' || flag == '37' || flag == '29' || flag == '38')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='39' || flag == '40' || flag == '41' || flag == '48')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='33' || flag == '42' || flag == '51' || flag == '43')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='54' || flag == '64' || flag == '74' || flag == '72')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='66' || flag == '67' || flag == '68' || flag == '75')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='60' || flag == '61' || flag == '62' || flag == '69')
                        {
                            result[flag]=" ";
                        }
                        if(result[flag]==" ")
                        {
                            tab+="<td style='background-color:yellow'><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        }
                        else
                        {
                            tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        }
                        flag=flag+1;
                    }
                    tab+="</tr>";
                }
                tab+="</table>";
                div1.innerHTML=tab;                                                                        
            } else {
              alert(xhr.status);
            }
          }
        }
    }
    function getTdValue()
    {
        var table = document.getElementById("queshi"); //获得整个表格对象
        var table1=document.getElementById("wanzheng");
        for (var i = 0; i < 9; i++) {
            //表格的第i行,第2列
            for (var j = 0; j < 9; j++) {
                var value1=table.rows[i].cells[j].innerText;
                var value2=table1.rows[i].cells[j].innerText;
                if(value1 != value2)
                {
                    table.rows[i].cells[j].style.backgroundColor="red";
                }
            }
        }
    }
    function show()
    {
        document.getElementById("wanzheng").style.display="";
    }
    function creatshudu()
    {
        num=num+1;
        var xhr =new XMLHttpRequest()
        xhr.open("GET", num+".txt", true);//注意路径问题读取data.txt文件的内容。
        xhr.send(null);
        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4) {
            if (xhr.status == 200||xhr.status==0) {//请求本地txt文件时状态码是0。
                //alert(xhr.responseText);
                for(var i=0;i<81;i++)
                {
                    var result = xhr.responseText.split("|"); 
                }
                for(var j=0;j<81;j++)
                {
                    //console.log(result[j]);
                }
                
                //创建完整表格
                var row1=9;//获取属性值
                var col1=9;//获取属性值
                var div1=document.getElementById("div1");
                var tab="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='wanzheng' style='float:right;display:none'>";
                //循环行
                var flag=0;
                for(var i=0;i<row1;i++)
                {
                    tab+="<tr>";
                    //循环列
                    for(var j=0;j<col1;j++)
                    {
                        tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        flag=flag+1;
                    }
                    tab+="</tr>";
                }
                tab+="</table>";
                
                //缺失数组
                tab+="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='queshi' style='float:left'>";
                //循环行
                var flag=0;
                for(var i=0;i<row1;i++)
                {
                    tab+="<tr>";
                    //循环列
                    for(var j=0;j<col1;j++)
                    {
                        //写死 每个3X3棋盘都挖空4个
                        if(flag =='0' || flag == '1' || flag == '10' || flag == '19')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='21' || flag == '13' || flag == '4' || flag == '5')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='7' || flag == '8' || flag == '15' || flag == '25')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='27' || flag == '37' || flag == '29' || flag == '38')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='39' || flag == '40' || flag == '41' || flag == '48')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='33' || flag == '42' || flag == '51' || flag == '43')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='54' || flag == '64' || flag == '74' || flag == '72')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='66' || flag == '67' || flag == '68' || flag == '75')
                        {
                            result[flag]=" ";
                        }
                        if(flag =='60' || flag == '61' || flag == '62' || flag == '69')
                        {
                            result[flag]=" ";
                        }
                        if(result[flag]==" ")
                        {
                            tab+="<td style='background-color:yellow'><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        }
                        else
                        {
                            tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>";
                        }
                        flag=flag+1;
                    }
                    tab+="</tr>";
                }
                tab+="</table>";
                div1.innerHTML=tab;                                                                        
            } else {
              alert(xhr.status);
            }
          }
        }
    }
</script>
<title>file upload</title>
<style>
    .editableTable {
        width: 546px;
        height: 500px;
        22: ;
        padding: 10px;
        background-color: #DDEEF6;
        border: 1px solid #DDEEF6;
        -webkit-border-radius: 6px;
        -moz-border-radius: 6px;
    }
</style>
</head>
<body>
    <input type="button" id="table" value="结果分析" onclick="getTdValue()">
    <input type="button" id="table" value="查看正确答案" onclick="show()">
    <input type="button" id="table" value="下一个数独" onclick="creatshudu()">
    <div id="div1">
    <div id="div2">
    </div>
</body>
</html>

GUI界面

心得:在本次作业中主要面对的有C++随机数,因为数组的产生需要随机两次,因为很难实现所以还是依旧随机一次。ajax读取txt文档时的数独数组之间的分离,第一次尝试将所有的数组都输出到一个文件里面,但是在ajax取得数据是发现很难拆分,因为当取得所有数据是需要切两下(1、多个数独数组分成单个的数独数组保存,之后单个的数独数组拆分,所以后面弄得有点混乱,代码量有点大,就干脆将C++输出的数独数组单个放在不同的txt文件中)

原文地址:https://www.cnblogs.com/godbee/p/9795856.html