我是一個編程新人,完全沒有編程經驗,正在自學編程,最近看了網易公開課的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",_);
第一部分終了。