我是一个编程新人,完全没有编程经验,正在自学编程,最近看了网易公开课的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",_);
第一部分终了。