当前位置:首页 » 编程语言 » c语言数独游戏的项目要求
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言数独游戏的项目要求

发布时间: 2022-06-01 04:38:12

‘壹’ 如何c语言编写数独游戏

当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^

‘贰’ 求大神赐我C语言编写“解数独”的思路咯喂

玩过数独都知道数独做起来本来就很复杂,特别是到了最后还要猜数,验证
你还在入门阶段就尝试这么复杂的问题真的很有挑战精神呢
机解数独的步骤:
建立一个数组
1:确定唯一数(没有集合做的很麻烦呢,不过笨办法还有有的,不详写),有些格子的数是唯一的,如果有唯一数,跳到第二步;
如果没有,则跳得到第三步;
2:将唯一数代入数组,跳到第一步;
3:做一个循环判定,如果是空位,确定数字的可能的情况(不详写),在做一个选择判断,
情况1:选择一个数字,跳到第一步;
情况2:选择第二个数字,跳到第一步;
........
分太少了,楼主好好努力吧

‘叁’ 数独的规则(要求)是什么

每行每列中1-9数字都只能出现一次
将9*9的区域划分成9个3*3的区域 每个区域中1-9只能出现一次

‘肆’ 用c语言写一个简易数独的思路。要代码

#include<stdio.h>
intnum[9][9],xy[9][9];
intcheck(intx,inty){
inti,m,n;
for(i=0;i<9;i++)
if((xy[x][y]==xy[i][y]&&i!=x)||(xy[x][y]==xy[x][i]&&i!=y))
return0;
for(i=0,m=x/3*3,n=y/3*3;i<9;i++)
if(xy[x][y]==xy[m+i/3][n+i%3]&&m+i/3!=x&&n+i%3!=y)
return0;
return1;
}
voidsearch(intx,inty){
if(x==9)
for(x=0;x<9;x++){
for(y=0;y<9;y++)
printf("%d",xy[x][y]);
printf(" ");
}
elseif(num[x][y])
search(x+(y+1)/9,(y+1)%9);
else
for(xy[x][y]=1;xy[x][y]<=9;xy[x][y]++)
if(check(x,y))
search(x+(y+1)/9,(y+1)%9);
return;
}
intmain(){
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++){
scanf("%d",&num[i][j]);
xy[i][j]=num[i][j];
}
search(0,0);
return0;
}

输入为9行9列整数,已知的整数填写对应的数字,尚待计算的未知数字填写0。

该代码的思路很简单,就是从第一行第一列开始依次填入数字,检查是否是在同一行、同一列、同一宫有没有填入重复数字,如果没有就继续填入下一个数字,如果有就返回。

虽然效率稍低,但原理简单、表述直白、易于理解,更有效率的代码是使用十字链表完成,如有兴趣可继续深入

‘伍’ 求用C语言编一个解九宫格数独的程序

前两天刚写完,还没优化,已运行通过了.
晕,一维的好麻烦,这个也是碰巧前两天刚写好的,你看着自己修改下
#include
<stdio.h>
typedef
struct
{
int
line;
int
row;
int
num;
}Node;
int
main()
{
/*
int
a[9][9]={
{4,0,3,6,0,0,0,0,0},
{0,0,0,0,0,1,0,2,4},
{0,1,0,0,4,0,5,0,0},
{0,0,0,9,0,4,0,6,0},
{3,0,2,0,0,0,4,0,9},
{0,7,4,1,0,3,0,0,0},
{0,0,1,0,9,0,0,4,0},
{2,4,0,3,0,0,0,0,0},
{0,0,0,4,0,8,2,0,7}};
*/
int
a[9][9]={
{0,0,0,8,0,0,0,6,0},
{8,7,0,0,0,0,0,0,0},
{2,9,0,0,4,1,0,0,5},
{0,0,5,7,0,0,0,0,9},
{0,2,0,0,0,0,0,1,0},
{9,0,0,0,0,4,3,0,0},
{7,0,0,6,1,0,0,9,8},
{0,0,0,0,0,0,0,5,2},
{0,6,0,0,0,9,0,0,0}};
/*
int
a[9][9]={
{0,2,0,0,6,0,0,0,0},
{0,9,0,4,0,5,1,3,0},
{0,0,8,7,0,0,0,0,5},
{6,0,0,3,0,0,4,0,0},
{0,0,0,9,0,6,0,0,0},
{0,0,7,0,0,1,0,0,3},
{4,0,0,0,0,7,3,0,0},
{0,8,5,2,0,4,0,7,0},
{0,0,0,0,9,0,0,1,0}};
*/
/*
int
a[9][9]={
{0,0,3,0,2,0,0,0,6},
{0,0,2,0,9,0,0,0,4},
{7,0,0,8,0,0,2,0,3},
{0,8,0,0,7,0,5,0,0},
{0,7,0,1,0,6,0,3,0},
{0,0,0,2,0,0,0,9,0},
{4,0,6,0,0,8,0,0,5},
{6,0,0,0,4,0,3,0,0},
{9,0,0,0,1,0,7,0,0}};
*/
int
i,j,n,en,flag,y,k=0,x,qu,p,q;
Node
b[70];
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(!a[i][j])
{
b[k].line=i;
b[k].row=j;
b[k].num=0;
k+=1;
}
}
}
en=k;
/*从b[0]开始试,若b[k].num>9,则k-1,否则k+1*/
for(k=0;k<en;)
{
++b[k].num;
i=b[k].line;
j=b[k].row;
a[i][j]=b[k].num;
n=0;
while(n<9&&b[k].num<=9)
{
if(n==i)
{
for(y=0;y<9;y++)
{
if(y==j)
continue;
if(a[n][y]==a[i][j])
flag=1;
}
}
else
if(n==j)
{
for(y=0;y<9;y++)
{
if(y==i)
continue;
if(a[y][n]==a[i][j])
flag=1;
}
}
/*判断同一块中有没有相同值*/
qu=3*(i/3)+j/3;
switch(qu)
{
case
0:x=0;
y=0;
break;
case
1:x=0;
y=3;
break;
case
2:x=0;
y=6;
break;
case
3:x=3;
y=0;
break;
case
4:x=3;
y=3;
break;
case
5:x=3;
y=6;
break;
case
6:x=6;
y=0;
break;
case
7:x=6;
y=3;
break;
default
:x=6;
y=6;
break;
}
p=x;
q=y;
for(;x<p+3;x++)
{
for(;y<q+3;y++)
{
if(x==i&&y==j)
continue;
if(a[x][y]==a[i][j])
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
{
a[i][j]=++b[k].num;
flag=0;
n=0;
continue;
}
n++;
}
if(b[k].num>9)
{
a[i][j]=b[k].num=0;
k--;
if(k<0)
{
printf("error!\r\n");
return
-1;
}
}
else
k++;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\r\n");
}
return
1;
}

‘陆’ 怎么用C语言写数独程序

C 语言数独解题程式原始码动机 要如何写个能解数独的程式呢? 随着数独的风行,程式设计的老师常常以此为题,要求学生写个解题的程式。 自数独乐园开张以来,要求提供原始码的要求就不曾断过。 帮还是不帮好呢?帮了,好像在作弊,不帮又好像敝帚自珍,所以干脆公开算了! 当然也有些人并不是为了写作业,而是为了研究数独,才提出此要求。这时如果能有个范例,提供一个初步的架构, 接下去的工作就简单多了。 程式不使用任何技巧,完全採试误法,有人会说:这样做需要很长时间的试误吧!程式的执行可以给你解答。 请编辑后,在命令列中将单列格式数独放在参数中,只要有解,一定可获得解答;如果是多重解,只解出一解就会停止。 例: sudoku 00480705203 C 语言原始码 #include < stdio.h > #include < stdlib.h > int sudoku[81] ; // 数独题目阵列 int tempNum[81] ; // 上一次填数位置 int tempSp= 0 ; // 上一次填数位置指标 int startH[81] ; // 列位置的起点 int startV[81] ; // 行位置的起点 int startB[81] ; // 九宫格位置的起点 int addH[9] ; // 列位置的加值 int addV[9] ; // 行位置的加值 int addB[9] ; // 九宫格位置的加值 int main(int argc, char *argv[]) { int j ; if(argc>1) for(j=0; j<81; j++) sudoku[j]= argv[1][j]-'0' ; else exit(0) ; printf( "------------------\n"); printSudoku(sudoku) ; init() ; // 参数设定 tryAns() ; // 测试求解 printf( "------------------\n"); printSudoku(sudoku) ; printf( "------------------\n"); } int init() { // 参数设定(设定这些参数之后,无论检查行、列、九宫格都方便多了) int i ; for(i=0; i<81; i++) { startH[i]= i/9* 9 ; // 列位置的起点 startV[i]= i% 9 ; // 行位置的起点 startB[i]= ((i/9)/3)*27+ ((i%9)/3)*3 ; // 九宫格位置的起点 } for(i=0; i<9; i++) { addH[i]= i ; // 列位置的加值 addV[i]= i*9 ; // 行位置的加值 addB[i]= (i/3)*9+ (i%3) ; // 九宫格位置的加值 } } int printSudoku(int *prn) { // 印出数独题目(阵列内容) int i ; for(i=0; i<81; i++) { printf( "%2d", prn[i]); if(i%9==8) printf("\n"); } } int tryAns() { // 测试求解 int sp=getNextBlank(-1) ; // 取得第一个空白的位置开始填入数字 do { sudoku[sp]++ ; // 将本位置数字加 1 if(sudoku[sp]>9) { // 如果本位置的数字已大于 9 时则回到上一个位置继续测试 sudoku[sp]= 0 ; sp= pop() ; } else { if(check(sp)==0) { // 如果同行、列、九宫格都没有相同的数字,则到下一个空白处继续 push(sp) ; // 当然,如果发现有相同的数字时,就需把原位置的数字加 1(所以本处什么都不做) sp= getNextBlank(sp) ; } } } while(sp>=0 && sp<81) ; } int getNextBlank(int sp) { // 取得下一个空白的位置 do { sp++ ; } while(sp<81 && sudoku[sp]>0) ; return(sp) ; } int check(int sp) { // 检查同行、列、九宫格有没有相同的数字,若有传回 1 int fg= 0 ; if(!fg) fg= check1(sp, startH[sp], addH) ; // 检查同列有没有相同的数字 if(!fg) fg= check1(sp, startV[sp], addV) ; // 检查同行有没有相同的数字 if(!fg) fg= check1(sp, startB[sp], addB) ; // 检查同九宫格有没有相同的数字 return(fg) ; } int check1(int sp, int start, int *addnum) { // 检查指定的行、列、九宫格有没有相同的数字,若有传回 1 int fg= 0, i, sp1 ; for(i=0; i<9; i++) { sp1= start+ addnum[i] ; if(sp!=sp1 && sudoku[sp]==sudoku[sp1]) fg++ ; } return(fg) ; } int push(int sp) { // 将指定的位置放入堆叠中 tempNum[tempSp++]= sp ; } int pop() { // 取出堆叠中的上一个位置 if(tempSp<0) return(-1) ; else return(tempNum[--tempSp]) ; }

记得采纳啊

‘柒’ 数独是什么有什么要求有什么竞赛

数独是一种根据逻辑推理的益智游戏(运动)。国内起步较晚,国外已经盛行近20年。国内目前没有特别大型或规范的比赛,不过有些小型的比赛。目前每年在北京有一次“全国赛”,是为去世锦赛产生名额用的。

楼上说的一些观点我非常不赞同,什么叫“不是需要长期需要努力钻研的东西”,你懂数独吗,你了解多少,知道个标准数独就跟不懂的人乱说,完全是误人子弟,你不懂没关系,不要出来装懂好不好!

数独每年在世界范围内有一次世界数独锦标赛,正好明天(2010年4月29日)美国时间下午开始举行第五届世界数独锦标赛,这里是题目说明的网址http://www.worldpuzzle.org/wiki/index.php/Fifth_World_Sudoku_Championship/zh
你去看看什么才是真正的数独,就算你努力钻研10年未必能达到目前国内顶尖选手的水平。

你所说的半个月搞定的数独,是标准数独中入门的几种直观解法,那些对于有点脑子的人来说半天就学会了,但把半天学习的运用非常熟练没有1,2年的时间根本不可能,我说的是非常熟练。

况且现在在标准数独的基础上衍生出至少几百种变形数独,真正数独比赛比的是综合能力,当然标准数独的基本功也是重要的考核项目之一。

楼主想学简单的解法的话可以来网络数独吧,置顶帖里有标准数独的常用解法http://tieba..com/f?kz=510857623。

不过对于国内大多数人来说,还是当做休闲娱乐比较好,要想冲到高手的行列,需要花费大量的时间和精力,还需要有天生的资质,就算有些人再努力,到某个瓶颈也很难突破了。

数独吧主:蓝天skyhuner

‘捌’ 求用C语言编写一个解数独的程序,急

用0代表要填的数
#include <stdio.h>
#include <stdlib.h>

#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)

struct{
int left;
char num;
char try;
}board[SIZE][SIZE];

int bit2num(int bit)
{
switch(bit){
case 1:case 2:
return bit;
case 4:
return 3;
case 8:
return 4;
case 16:
return 5;
case 32:
return 6;
case 64:
return 7;
case 128:
return 8;
case 256:
return 9;
}
}

void printf_res()
{
int i, j, k;

for(i=0; i<SIZE; i++)
{
if(i%3==0)
{
for(j=0; j<SIZE*2+4; j++)
putchar('-');
putchar('\n');
}

for(j=0; j<SIZE; j++)
{
if(j%3==0)
putchar('|');
if(board[i][j].num > 0)
printf("\033[0;31m%2d\033[0m", board[i][j].num);
else
printf("%2d", board[i][j].try);
}
printf("|\n");
}
for(i=0; i<SIZE*2+4; i++)
putchar('-');
putchar('\n');
}

void sub(int i, int j, int bit)
{
int k, m;

for(k=0; k<SIZE; k++)
{
board[k][j].left &= ~bit;
board[i][k].left &= ~bit;
}

for(k=i/3*3; k<(i/3+1)*3; k++)
for(m=j/3*3; m<(j/3+1)*3; m++)
board[k][m].left &= ~bit;
}

void init()
{
int i, j;

for(i=0; i<SIZE; i++)
for(j=0; j<SIZE; j++)
if(board[i][j].num > 0)
sub(i, j, 1<<(board[i][j].num-1));
else if(board[i][j].try > 0)
sub(i, j, 1<<(board[i][j].try-1));
}

void add(int i, int j, int bit)
{
int k, m;

for(k=0; k<SIZE; k++)
{
board[k][j].left |= bit;
board[i][k].left |= bit;
}
for(k=i/3*3; k<(i/3+1)*3; k++)
for(m=j/3*3; m<(j/3+1)*3; m++)
board[k][m].left |= bit;
}

void solve(int pos)
{
int i=pos/SIZE;
int j=pos%SIZE;
int bit, left;

if(pos == SIZE*SIZE)
{
printf_res();
exit(0);
}
if(board[i][j].num > 0)
solve(pos+1);
else
for(left=board[i][j].left; left; left&=(left-1))
{
bit = get_low_bit(left);
sub(i, j, bit);
board[i][j].try = bit2num(bit);

solve(pos+1);

add(i, j, bit);
board[i][j].try=0;
init();
}
}

int main()
{
int i, j, c;

for(i=0; i<SIZE; i++)
for(j=0; j<SIZE; j++)
{
while((c=getchar())<'0' || c>'9')
;
board[i][j].num = c-'0';
board[i][j].try = 0;
board[i][j].left = 0x0001FF;
}
init();
solve(0);

return 0;
}

‘玖’ 数独 算法 C语言 代码

一、步骤:
1.对每一个空格,根据规则推断它可能填入的数字,并存储它的所有可能值;
2.根据可能值的个数,确定填写的顺序。比如说,有些空格只有一种可能,那必然是正确的结果,首先填入。
3.将所有只有一种可能的空格填写完毕以后,回到步骤1,重新确定剩下空格的可能值;
4.当没有只有一种可能的空格时(即每个空格都有两种以上可能),按照可能值个数从小到大的顺序,使用深度(广度)优先搜索,完成剩下空格。

二、例程:

#include<windows.h>
#include<stdio.h>
#include<time.h>

charsd[81];
boolisok=false;

//显示数独
voidshow()
{
if(isok)puts("求解完成");
elseputs("初始化完成");

for(inti=0;i<81;i++)
{
putchar(sd[i]+'0');
if((i+1)%9==0)putchar(' ');
}
putchar(' ');
}

//读取数独
boolInit()
{
FILE*fp=fopen("in.txt","rb");
if(fp==NULL)returnfalse;
fread(sd,81,1,fp);
fclose(fp);
for(inti=0;i<81;i++)
{
if(sd[i]>='1'&&sd[i]<='9')sd[i]-='0';
elsesd[i]=0;
}
show();
returntrue;
}

//递归解决数独
voidforce(intk)
{
if(isok)return;
if(!sd[k])
{
for(intm=1;m<=9;m++)
{
boolmm=true;
for(intn=0;n<9;n++)
{
if((m==sd[k/27*27+(k%9/3)*3+n+n/3*6])||(m==sd[9*n+k%9])||(m==sd[k/9*9+n]))
{
mm=false;
break;
}
}
if(mm)
{
sd[k]=m;
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}
sd[k]=0;
}
else
{
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}

intmain()
{
system("CLS");
if(Init())
{
doublestart=clock();
force(0);
printf("耗时%.0fms",clock()-start);
}
elseputs("初始化错误");
getchar();
}