創作內容

5 GP

【C語言】新手上路之1A2B猜數字小遊戲分享!!

作者:阿朋│2020-08-04 01:23:19│贊助:10│人氣:668
一、前言

大家許久不見,我是阿朋

距離上次跟大家分享自己的近況,應該已經過了一年多了,

總之,我從護理系畢業了,

並於今年的8/1號完成護理師國考(放榜要等到9/3),

即將踏入醫院成為護理人員的我,

想要利用最後還是人類的時光,多多充實自己

剛好男朋友從大二轉至資訊管理系後,有程式設計的教科書,

便開始學習起了最基本也最難學的蛋炒飯C語言,

俗話說:「萬事起頭難。」 (還真他ㄇ

可能是護理讀久了,腦袋的思考邏輯都固化了,

面對新領域的邏輯與概念真的是赤裸裸地被當白痴,

幸好男朋友高職念的是相關職類,而他的好朋友們都非常樂意指導我,

應該算是傻人有傻福吧,廢話不多說(就是你一直說),來張預覽圖。

/*圖1-執行檔預覽圖*/


「什麼!?!?!

這個黑黑的小窗口,就是程式嗎!?」

各位觀眾的心中一定有這樣的疑問,

我只能跟大家下跪,讓大家失望

是的!C語言就是這樣的程式語言喔!

雖然看起來很簡單,(也的確很簡單

但背後的思考過程還有編輯過程也花了我一整天的時間呢!

二、猜數字遊戲的規則與要素

在開始分享我的程式碼之前,我想跟大家分享我做了哪些功課,

首先,就是了解猜數字的規則與要素,

根據維基百科,猜數字的規則如下:

1)遊玩人數:至少2人,或1個電腦程式及1個人。

2)其中一人準備好一組由四個數字組成的密碼,且這四個數字不能重複。

3)另外一人猜測數字,並依據其回答給予XAYB的回覆。

3.1)X代表數字與出現的位置正確。

3.2)Y代表數字正確,但位置不正確。

以上就是猜數字的規則與要素,

據此我們可以整理出程式需要具備以下的功能:

1)能夠重複產生四個不重複的亂數

2)限定玩家輸入0~9之四位數字,亦不得重複

3)依照猜數字的規則,判斷A及B的個數

4)能夠重複執行

/*表1-程式功能與相關函數(指令)*/

功能 使用觀念 核心函數
1.產生亂數
1.輸入與輸出
2.資料型態轉換
3.運算子與運算式
4.亂數的函數
5.選擇性敘述
6.巢狀迴圈
7.陣列
1.rand()
2.if()
3.do..while()
、for()
4.strlen()
5.printf()、gets()、scanf()
2.輸入與判斷
3.猜數字的規則判斷
4.能重複執行


上表整理出了,我寫這個程式時所使用到的觀念與函數,

那怕有些朋友跟我一樣一開始看到感覺霧煞煞,

如果說大家有興趣知道更多,可以翻教科書,不要問我,

可以留言告訴我,也許有機會可以發教學文喔!

三、程式碼分享

礙於巴哈姆特不是一個很方便排版程式碼的地方,(tab會自己不見,上色好累

(剛剛排了一個小時眼睛已經瞎掉

我僅能分享我在撰寫過程中,碰到瓶頸的地方,

至於全部的程式碼,我都放在這裡了

想要動手玩玩的朋友只要點左上綠色的run就可以開始遊戲了。

1)四位0~9不重複亂數的產生

首先,先介紹0~9亂數的產生,

rand()這個函數,會回傳0到random_max之間的整數,

(以dos系統為例此值為32767)

此時,為了取0~9的亂數,只要rand()對10取餘數即可,

換做C語言就是rand()%10,這樣一定介於0~9。

之後,再將取到的數字以迴圈的方式放入陣列中就行了。

/*圖2:1-取0-9的亂數進陣列的程式碼*/

/*圖2:2-實際執行一百次的結果*/

那麼該如何取出四個不同的數字呢?

網路上有提供洗牌法的解法,但我實在是太新手了,完全看不懂

只好用土法煉鋼的方式,

那就是,檢查第n個數字是否與之前的所有數字相同,

如果有,就再取一次0~9的亂數,並執行相同的判斷直到沒有相同為止。

/*圖3:1-土法煉鋼法求不重複4位數的示意圖*/

由上圖可知,土法煉鋼法所求的位數越大,其計算次數就越多,

算是很沒有效率的寫法。

/*圖3:2-土法煉鋼法求不重複4位數的程式碼*/

因此,在程式碼中,可以加入break;,以提高判斷的效率,

也就是一但發現重複,立刻重骰,直到沒有重複為止(像綠色途徑那樣)。

黃色點點部分為檢查碼,是為了讓大家更清楚的知道重骰的過程,

舉例而言,該程式骰至第979次時解果如下:

9 , !(9)2 , !(2)!(2)!(9)4 , !(9)!(4)8 ,

也就是說,第二數字第一次骰到9則立刻重骰到2之後才被儲存,

而第三個數字則是骰了兩次2及一次9,之後才骰到4得以被儲存,

以此類推,第四碼則是屏除了9、4的結果,骰到8才被儲存。

透過這一行,我們可以了解到每一個位置都會被判斷到,

所以絕對不會有重複數字發生的情形,那麼我們就可以把檢查碼拿掉,

直接觀察程式執行的結果囉!

/*圖3:3-實際執行100次0~9取四位數且不重複之程式*/

2)資料型態的轉換:將整數轉成字元儲存

本程式將答案及玩家所輸入的數字儲存於資料型態為字元的陣列裡面,

對於C語言來說,每一個字元是由一個ACSII編碼所代表而成的,

例如,0在ACSII的編號為48,

也就是說,當我們嘗試使用整數型態將字元「0」印出來,會得到48,

反過來說,當我們將整數48以字元型態印出則為「0」。

/*圖4:1-字元在C語言中以ACSII編碼儲存示意圖*/

那麼,本程式產生亂數的方法是從0~9之間,隨機取一個整數,再存入陣列,

所以如果將陣列中的數字以字元的方式讀取,

就無法實際等於我們想要它呈現字元,

例如,陣列中數值為0的資料,因為其數值為0並非48,

所以他所代表的字元就不是「0」了

那麼要怎麼將我們辛辛苦苦所得到的亂數,變成字元呢?

只要在rand()%10+48 (或是rand()%+'0')即可,

這樣的話當我們取到0,0+48=48,剛好就是字元「0」的ACSII的編碼,

同理可證,當我們取到1,1+48=49,也就是字元「1」的ACSII的編碼喔!


五、心得

文章從晚上六點多,已經打到一點多了,

我有點頭昏腦脹

突然發現巴哈的草稿系統不見了,只好先發出來,明日再補!

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4871255
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 3 篇留言

麵包,超人
阿朋好久不見呀...

看了頭都好痛呀...好複雜..

08-04 01:30

阿朋
我也是邊寫邊頭痛[e3]08-04 01:33
White蓮
好久不見呢!

現在次恭喜您護理師考試結束了~(聽說是很累的工作呢⋯⋯(辛苦了!

然後c語言⋯(快速往下拉( ・᷄ὢ・᷅ )

08-04 03:44

阿朋
[e3]謝謝你08-04 11:33
黑貓偷吃糖
阿朋!!!!!!!!!!!!!!!!!

08-05 13:37

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★a62222114 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:我想和你一起談自(傷)殘...

追蹤私訊

作品資料夾

blacktor讀者
【科幻長篇】《台東超載》-17:潛伏幽靈 https://home.gamer.com.tw/artwork.php?sn=4996547看更多我要大聲說昨天22:22


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】