自己动手做个小游戏(1)

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

第一部分终了。

posted @ 2015-12-15 16:55  Alighieri Dante  阅读(876)  评论(0编辑  收藏  举报