自己动手做个小游戏(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",_);

第一部分终了。

转载于:https://www.cnblogs.com/Alighieri/p/5048763.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值