程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 自己動手做個小游戲(1),動手做小游戲

自己動手做個小游戲(1),動手做小游戲

編輯:關於C語言

自己動手做個小游戲(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",_);

第一部分終了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved