我是一个编程新人,完全没有编程经验,正在自学编程,最近看了网易公开课的cs50,看到讲师展示的一个类似华容道的小游戏,于是决定自己写出来,也算是对前几节视频内容的一个巩固。
小游戏根据输入数字形成一个n阶的矩阵,有一个空位,可以挪动空位旁边的数字,最终把这个矩阵变成有序排列即为小游戏成功。
1.首先我决定先写出根据输入阶数生成矩阵的部分,
这个矩阵的排列应该是随机排列的,我首先将矩阵的所有数字赋值给square[]数组,然后通过随机函数把数组内的数字随机交换,最后打印出矩阵的形式。
这里随机数的生成是困扰了我很长时间的地方,通过百度,我知道rand()只是伪随机数,所以应该这样写:
#include<stdlib.h>
#include<time.h>
srand(time(0));//每次都根据时间生成一个种子
rand();//通过不同种子给出不同的随机数
然后是数组内的数值交换的函数,通过CS50视频的讲解,懂得了指针的用法,也知道了main函数体外面的操作并不能影响函数体里面的内存,所以应该用指针进行操作
swap函数:
void
swap(int *a, int *b)
{
int tem;
tem = *a;
*a = *b;
*b = tem;
}
生成矩阵的部分整体是这样
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void swap(int *a,int *b);
int
main(int argc,char *argv[])
{
int f,i,j,n;
int k = 0;
int x = 1;
printf("请输入阶数:\n");
scanf("%d",&f);
int square[f*f];
for(i = 0;i<f*f;i++)
{ //将矩阵的所有数字赋值给square数组
square[i] = x++;
}
srand(time(0));//每次都生成随机的种子
for(j = 0;j<f*f;j++)
{ //通过随机函数把数组内的数字进行随机交换
n = rand()%(f*f);
swap(&square[j],&square[n]);
}
for(i = 0;i < f*f;i+=f) //打印输出为矩阵形式
{
for(j = 0;j < f;j++)
{
printf("%2d ",square[k]);
k++;
}
printf("\n");
}
}
void
swap(int *a,int *b)
{
int tem;
tem = *a;
*a = *b;
*b = tem;
}
运行结果是这样的:
但是我需要矩阵里面最大的那个数显示为"_"也就是空位,想了半天也没有找到解决办法,今天太晚了,看来要留给明天解决了。
希望我能通过动手,获得更多的编程技巧。晚安。
_________________________________________________
update:要想最大的那个数显示为“_” ,可以在printf时候做一个判断,if(square是最大的) prinft("%c",_);
所以可以写一个判断当前数字是数组中最大值的一个函数findmax(),代码如下
int
findmax(int a[],int b,int c)
{
for(int m = 0;m < b;m++)
{
if(a[c]<a[m]) return 0;//如果a[c]比数组任意一个数小,则返回0
}
return 1; //否则为最大
}
//main函数体内相关代码
if(findmax(square,f*f,k))
prinft("%2c",_);
通过尝试,用指针的写法为
int
findmax(int *a,int b,int c )
{
for(int m = 0;m < b;m++)
{
if(*(a+c) < *(a+m)) return 0;
}
return 1;
}
// main函数体相关代码
if(findmax(&square[0],f*f,k))// square数组的首元素地址
prinft("%2c",_);
第一部分终了。