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