c语言编小游戏
① c语言能写出什么样有意思的小程序
C语言是一门通用计算机编程语言,应用广泛。
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
程序源代码:
main()
{int i,j,k;printf( );for(i=1;i<5;i++)/*以下为三重循环*/for(j=1;j<5;j++)
for (k=1;k<5;k++),{f (i!=ki!=jj!=k) /*确保i、j、k三位互不相同*/printf(%d,%d,%d ,i,j,k); }}
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
程序源代码:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf(%ld,i);
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf(bonus=%d,bonus);
}
6.题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 的结果满足如下条件,即是结果。
程序源代码:
#include math.h
main()
{
long int i,x,y,z;
for (i=1;i<100000;i++)
{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
y=sqrt(i+268); /*y为再加上168后开方后的结果*/
if(x*x==i+100y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
printf( %ld ,i);
}
}
7.题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
程序源代码:
main()
{
int day,month,year,sum,leap;
printf( please input year,month,day );
scanf(%d,%d,%d,year,month,day);
switch(month)/*先计算某月以前月份的总天数*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
defaultrintf(data error);break;
}
sum=sum+day; /*再加上某天的天数*/
if(year%400==0||(year%4==0year%100!=0))/*判断是不是闰年*/
leap=1;
else
leap=0;
if(leap==1month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf(It is the %dth day.,sum); }
8.题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
程序源代码:
main()
{
int x,y,z,t;
scanf(%d%d%d,x,y,z);
if (x>y)
/*交换x,y的值*/
if(x>z)
/*交换x,z的值*/
if(y>z)
/*交换z,y的值*/
printf(small to big: %d %d %d ,x,y,z);
}
9.题目:用*号输出字母C的图案。
程序分析:可先用<|>*<|>号在纸上写出字母C,再分行输出。
程序源代码:
#include stdio.h
main()
{
printf(Hello C-world! );
printf( **** );
printf( * );
printf( * );
printf( **** );
}
10.题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
程序分析:字符共有256个。不同字符,图形不一样。
程序源代码:
#include stdio.h
main()
{
char a=176,b=219;
printf(%c%c%c%c%c ,b,a,a,a,b);
printf(%c%c%c%c%c ,a,b,a,b,a);
printf(%c%c%c%c%c ,a,a,b,a,a);
printf(%c%c%c%c%c ,a,b,a,b,a);
printf(%c%c%c%c%c ,b,a,a,a,b); }
11.题目:输出9*9口诀。
程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
程序源代码:
#include stdio.h
main()
{
int i,j,result;
printf( );
for (i=1;i<10;i++)
{ for(j=1;j<10;j++)
{
result=i*j;
printf(%d*%d=%-3d,i,j,result);/*-3d表示左对齐,占3位*/
}
printf( );/*每一行后换行*/
}
}
12.题目:要求输出国际象棋棋盘。
程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
程序源代码:
#include stdio.h
main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf(%c%c,219,219);
else
printf( );
printf( );
}
}
13.题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
程序源代码:
#include stdio.h
main()
{
int i,j;
printf( );/*输出两个笑脸*/
for(i=1;i<11;i++)
{
for(j=1;j<=i;j++)
printf(%c%c,219,219);
printf( );
}
② 用C语言编写的小游戏代码是什么
“猜数字小游戏”,每个数字后按空格,最后按回车确认
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int a[4],b[4];
int count=0; //计算猜测次数
void csh( ); //初始化
void start( ); //开始游戏
int main( )
{ csh( );
start( );
}
void csh( ) //初始化
{ printf(" 猜 数 字 小 游 戏 ");
printf(“ 猜四个数字,如数字与顺序都正确记为A,数字正确位置不对记为B. ”);
}
void start( ) //开始游戏
{int m,n; //m是完全猜对的个数,n是顺序不对的个数
while(1)
{srand((unsigned)time(NULL)); //初始化随机数发生器srand( )
while(1) { for(int i=0;i<4;i++) a[i]=rand( )%10; //rand( )函数每次随机产生一个0-9的数
if( (a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0])&&
(a[2]!=a[1]&&a[2]!=a[0])&&a[1]!=a[0] ) break; } //4个随机数各自不相等
printf(" 请依次输入4个一位整数: ");
while(1)
{for(int i=0;i<4;i++) scanf(“%d”,&b[i]);
printf(" 你输入的是:%d %d %d %d ",b[0],b[1],b[2],b[3]);
m=0;n=0;
for(int i=0;i<4;i++)
{for(int j=0;j<4;j++)
{ if(b[i]==a[j]&&i==j)m=m+1; if(b[i]==a[j]&&i!=j)n=n+1; }
}
count=count+1;
printf(" %dA %dB 你试了%d次 ",m,n,count);
if(m==4)break;
if(count==8){ count=0; break; }
}
printf(" ");
if(m==4)printf(" 你猜对了(^-^)! 就是:%d %d %d %d ",a[0],a[1],a[2],a[3]);
else printf(" 你输了(T-T)!哈哈!应该是:%d %d %d %d ",a[0],a[1],a[2],a[3]);
int z;
printf(" (要继续吗?1或0) ");
scanf(“%d”,&z);
if(z==0) break;
}
}
③ C语言开发:如何用130行代码,写出"超火"微信小游戏—羊了个羊
近日,一款名为“羊了个羊”的微信小游戏在网络上迅速走红。其独特之处在于简单的玩法与不寻常的关卡设计,这款游戏类似于三消类游戏《合成大西瓜》与《召唤神龙》的后续作品,以微游戏形式成为新王者。
游戏规则简单:玩家需要通过点击三个相同的图案进行消除,未凑齐三个的图案则暂时存放在底部的七个待选栏位中。当待选栏位满时,游戏即告失败。第一关旨在作为玩法教程,而当玩家进入第二关后,难度明显提升。官方指出,“羊了个羊”是一款极难的闯关消除小游戏,其通关率极低,不足0.1%。
对于编程爱好者,我们或许能借助所学知识自行开发一款类似的《羊了个羊(仿制版)》。为此,以下是所需的准备工作:
开发工具:建议使用VS2022/2019,同时安装易X图形库插件。VScode用户需额外配置开发环境。
素材准备:请在文章末尾查看获取方式。
下面是源代码概览,代码未私藏,欢迎尝试编译。
如遇问题,随时联系我获取帮助。
此外,为了帮助初学者高效学习C语言/C++,分享以下资源:
视频分享:整理多年学习的源码、项目实战视频、项目笔记与基础入门教程,群内交流提问编程问题。
欢迎转行与学习编程的伙伴加入粉丝群,利用资源加速成长。把握时光,抓住成长机会。
加入【粉丝群】,与伙伴们一起学习C语言/C++/数据结构与算法,共同进步。
④ 如何使用C语言编写简单小游戏
C语言是计算机专业都要学习的一门基础学科。一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣。
例如2048这款游戏:
方法/步骤:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define SIZE 4
static int score=0;
void putn(int n[][SIZE]);
void getn(int n[][SIZE]);
int isempty(int n[][SIZE]);
int isfull(int n[][SIZE]);
void math(int n[][SIZE],char c);
void tow(int n[][SIZE]);
void toa(int n[][SIZE]);
void tos(int n[][SIZE]);
void tod(int n[][SIZE]);
//主函数
int main()
{
int i,j;
int n[SIZE][SIZE];
char c=' ';
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
n[i][j]=0;
}
}
printf( "*********************** "
" 2048(%dX%d) "
" control:W/A/S/D "
"press any key to begin "
"*********************** ",SIZE,SIZE);
getch();
system("cls");
//n[0][1]=2048;
//n[0][3]=2048;
while(1)
{
if(isempty(n))
getn(n);
putn(n);
if(!isempty(n)&&isfull(n))
break;
sleep(200);
c=getch();
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch();
math(n,c);
system("cls");
}
printf(" Game Over! ",score);
return 0;
}
//函数
void putn(int n[][SIZE])
{
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
printf("| ");
printf("| ");
for(j=0;j<SIZE;j++)
{
if(n[i][j]==0)
printf("| ");
else
printf("|%4d ",n[i][j]);
}
printf("| ");
for(j=0;j<SIZE;j++)
printf("|_____");
printf("| ");
}
printf("score: %d",score);
}
void getn(int n[][SIZE])
{
int a,b;
a=rand()%SIZE;
b=rand()%SIZE;
while(n[a][b]!=0)
{
a=rand()%SIZE;
b=rand()%SIZE;
}
n[a][b]=2;
}
int isempty(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(n[i][j]==0)
count++;
return count;
}
int isfull(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
{
for(j=1;j<SIZE-1;j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++;
}
}
for(j=0;j<SIZE;j++)
{
for(i=1;i<SIZE-1;i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++;
}
}
return count>0?0:1;
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n);break;
case 'a':toa(n);break;
case 's':tos(n);break;
case 'd':tod(n);break;
default :;
}
}
void tow(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=0;j<SIZE;j++)
{
for(a=0;a<SIZE;a++)
{
for(i=0;i<SIZE-1;i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}
}
}
}
for(j=0;j<SIZE;j++)
{
for(a=0,i=0;i<SIZE;i++)
{
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i+1][j])
{
m[a++]=n[i][j]+n[i+1][j];
score+=m[a-1];
n[i][j]=0,n[i+1][j]=0;
}
}
for(i=0;i<SIZE;i++)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void toa(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=0;i<SIZE;i++)
{
for(a=0;a<SIZE;a++)
{
for(j=0;j<SIZE-1;j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}
}
}
}
for(i=0;i<SIZE;i++)
{
for(a=0,j=0;j<SIZE;j++)
{
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j+1])
{
m[a++]=n[i][j]+n[i][j+1];
score+=m[a-1];
n[i][j]=0,n[i][j+1]=0;
}
}
for(j=0;j<SIZE;j++)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
void tos(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1;a>=0;a--)
{
for(i=SIZE-1;i>0;i--)
{
if(n[i][j]==0)
{
n[i][j]=n[i-1][j];
n[i-1][j]=0;
}
}
}
}
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1,i=SIZE-1;i>=0;i--)
{
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i-1][j])
{
m[a--]=n[i][j]+n[i-1][j];
score+=m[a+1];
n[i][j]=0,n[i-1][j]=0;
}
}
for(i=SIZE-1;i>=0;i--)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void tod(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1;a>=0;a--)
{
for(j=SIZE-1;j>0;j--)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j-1];
n[i][j-1]=0;
}
}
}
}
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1,j=SIZE-1;j>=0;j--)
{
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j-1])
{
m[a--]=n[i][j]+n[i][j-1];
score+=m[a+1];
n[i][j]=0,n[i][j-1]=0;
}
}
for(j=SIZE-1;j>=0;j--)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
⑤ 求个用VC++C语言编写的小游戏
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
int random();
int mopai(int shan);
int yourchusha(int shan);
int i,xingcan=0,temp,choice;
int yoursha=0,yourshan=0;
int itssha=0,itsshan=0;
int yourhp=4,itshp=4;
printf("三国杀简易版:\n");
printf("开始游戏:\n");
srand( (unsigned)time( NULL ) );
for(i=1;i<=4;i++)
{
random();//random() 方法可返回介于 0 ~ 1 之间的一个随机数。
if(!random())
yourshan+=1;
else yoursha+=1;
}
for(i=1;i<=4;i++)
{
random();
if(!random())
itsshan+=1;
else itssha+=1;
}
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
while(yourhp&&itshp)
{
printf("\n你的行动开始:\n");
printf("\n摸牌阶段:\n");
temp=mopai(xingcan);
yourshan+=temp;
yoursha+=(2-temp);
xingcan=0;
printf("你的手牌:杀%d张,闪%d张\n",yoursha,yourshan);
printf("\n按任意键继续\n");
getch();
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
printf("\n出牌阶段:\n");
printf("请选择:\n");
printf("1.出杀 2.弃牌\n");
while(1)
{
scanf("%d",&choice);
if(choice!=1&&choice!=2)
printf("输入错误,请重新输入\n");
else break;
}
if(choice==1)
{
if(yoursha)
{
yoursha-=1;
if(yourchusha(itsshan))
itsshan-=1;
else
{
itshp-=1;
}
}
else printf("你没有杀,请弃牌\n");
}
if(!itshp)
break;
printf("\n按任意键继续\n");
getch();
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
printf("弃牌阶段:\n");
while(yoursha+yourshan-yourhp>0)
{
printf("你需要弃掉%d张卡牌,请逐张弃牌:\n",yoursha+yourshan-yourhp);
printf("1.弃一张杀 2.弃一张闪\n");
while(1)
{
scanf("%d",&choice);
if(choice!=1&&choice!=2)
printf("输入错误,请重新输入\n");
else break;
}
switch(choice)
{
case 1:
{
if(yoursha)
yoursha-=1;
else printf("你没有杀,请重新选择\n");
break;
}
case 2:
{
if(yourshan)
yourshan-=1;
else printf("你没有闪,请重新选择\n");
break;
}
}
}
printf("你的行动结束。\n");
printf("\n按任意键继续\n");
getch();
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
printf("计算机的行动开始:\n");
printf("摸牌阶段:\n");
temp=mopai(xingcan);
itsshan+=temp;
itssha+=(2-temp);
xingcan=0;
printf("计算机手牌数:%d张\n",itssha+itsshan);
printf("\n按任意键继续\n");
getch();
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
printf("出牌阶段:\n");
if(itssha)
{
itssha-=1;
printf("杀\n");
printf("计算机对你出了一张杀,请出一张闪\n");
printf("1.确定 2.取消\n");
while(1)
{
scanf("%d",&choice);
if(choice!=1&&choice!=2){
printf("输入错误,请重新输入\n");
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机的手牌:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
}
else break;
}
switch(choice)
{
case 1:
{
if(yourshan)
{
yourshan-=1;
printf("闪\n");
break;
}
else printf("你没有闪\n");
}
case 2:
{
yourhp-=1;
printf("计算机对你造成一点伤害\n");
}
}
}
if(!yourhp)
break;
printf("计算机手牌数:%d张\n",itssha+itsshan);
printf("弃牌阶段:\n");
if(itssha+itsshan-itshp>0)
{
if(itshp>itsshan)
{
printf("计算机弃杀%d张\n",itssha+itsshan-itshp);
itssha-=(itssha+itsshan-itshp);
}
else
{
printf("计算机弃杀%d张,闪%d张\n",itssha,itsshan-itshp);
itssha=0;
itsshan=itshp;
}
}
printf("计算机的行动结束。\n");
printf("\n按任意键继续\n");
getch();
system("cls");
printf("你的手牌:杀%d张,闪%d张\t",yoursha,yourshan);
printf("计算机手牌数:%d张\n",itssha+itsshan);
printf("你的体力:%d\t",yourhp);
printf("计算机的体力:%d\n",itshp);
}
if(!yourhp)
printf("很遗憾,计算机击败了你\n");
else printf("恭喜你,你击败了计算机\n");
printf("游戏结束,欢迎下次再来!\n");
printf("\n按任意键退出。");
getch();
return 0;
}
int random()
{
return rand()%3;
}
int mopai(int shan)
{
int i;
srand( (unsigned)time( NULL ) );
for(i=1;i<=2;i++)
{
random();
if(!random())
shan+=1;
}
return shan;
}
int yourchusha(int shan)
{
printf("杀 ");
if(shan)
{
printf("闪\n");
return 1;
}
else
{
printf("您对计算机造成一点伤害\n");
return 0;
}
}
⑥ 教你如何使用C语言编写简单小游戏
编写程序,实现如下表所示的5-魔方阵。
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
5-魔方阵
问题分析
所谓“n-魔方阵”,指的是使用1〜n2共n2个自然数排列成一个n×n的方阵,其中n为奇数;该方阵的每行、每列及对角线元素之和都相等,并为一个只与n有关的常数,该常数为n×(n2+1)/2。
例如5-魔方阵,其第一行、第一列及主对角线上各元素之和如下:
第一行元素之和:17+24+1+8+15=65
第一列元素之和:17+23+4+10+11=65
主对角线上元素之和:17+5+13+21+9=65
而
n×(n2+1)/2=5×(52+1)/2=65
可以验证,5-魔方阵中其余各行、各列及副对角线上的元素之和也都为65。
假定阵列的行列下标都从0开始,则魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n2-1个数依次按下列规则存放:
(1)
假定当前数的下标为(i,j),则下一个数的放置位置为当前位置的右上方,即下标为(i-1,j+1)的位置。
(2)
如果当前数在第0行,即i-1小于0,则将下一个数放在最后一行的下一列上,即下标为(n-1,j+1)的位置。
(3)
如果当前数在最后一列上,即j+1大于n-1,则将下一个数放在上一行的第一列上,即下标为(i-1,0)的位置。
(4)
如果当前数是n的倍数,则将下一个数直接放在当前位置的正下方,即下标为(i+1,j)的位置。
算法设计
在设计算法时釆用了下面一些方法:
定义array()函数,array()函数的根据输入的n值,生成并显示一个魔方阵,当发现n不是奇数时,就加1使之成为奇数。
使用动态内存分配与释放函数malloc()与free(),在程序执行过程中动态分配与释放内存,这样做的好处是使代码具有通用性,同时提高内存的使用率。
在分配内存时还要注意,由于一个整型数要占用两个内存,因此,如果魔方阵中要存放的数有max个,则分配内存时要分配2*max个单元,从而有malloc(max+max)。在malloc()函数中使用max+max而不是2*max是考虑了程序运行的性能。
显然应该使用二维数组来表示魔方阵,但虽然数组是二维形式的,而由于内存是一维线性的,因此在存取数组元素时,要将双下标转换为单个索引编号。在程序中直接定义了指针变量来指向数组空间,即使用malloc()函数分配的内存。