上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-6-11, PM 5:13 星期一 文章主題: [C++][8]Switch |
|
|
代碼: | #include <iostream>
#include <time.h>
using namespace std;
int main()
{
int money = 10000, bet = 0;
short number = 0;
srand( (unsigned)time( NULL ) );
cout << "此為賭博遊戲,您一開始有1萬元,可隨意壓注0元以上(正整數)" << endl
<< "電腦會隨機給出數字1~9,若出現數字1、3,可得賭注2倍" << endl
<< "若出現數字4~6,則賠掉賭注,若出現數字7、9,可得賭注3倍" << endl
<< "若出現數字2、8,則可拿回賭注。" << endl;
system( "pause" );
system( "cls" );
Loop:
cout << "您目前的財產: " << money << " 元" << endl
<< "請下注(輸入-1結束遊戲):";
cin >> bet;
if( cin.fail() )
{
cin.clear();
char ch1;
cin >> ch1;
system( "cls" );
cout << "錯誤的輸入格式!" << endl;
goto Loop;
}
if( bet >= 0 )
money -= bet;
else if( bet == -1 )
return 0;
else
{
system( "cls" );
cout << "請輸入正確的數字" << endl;
goto Loop;
}
number = rand() % 9 + 1;
cout << endl
<< "************************************" << endl
<< "* *" << endl;
switch( number )
{
case 1:
case 3:
cout << "* 恭喜您得到賭注x2! *" << endl;
money += bet * 2;
break;
case 4:
case 5:
case 6:
cout << "* 抱歉,您輸了! *" << endl;
break;
case 7:
case 9:
cout << "* 恭喜您得到賭注x3! *" << endl;
money += bet * 3;
break;
case 2:
case 8:
cout << "* 您拿回了賭注,不輸不贏。 *" << endl;
money += bet;
break;
default:
cout << "* 這應該是不會出現的訊息。 *" << endl;
}
cout << "* *" << endl
<< "************************************" << endl
<< endl
<< "總財產: " << money << " 元" << endl;
system( "pause" );
system( "cls" );
if( money > 0 )
goto Loop;
else
{
cout << endl
<< "您已經輸光光了,請重新再來,byebye!" << endl
<< endl;
system( "pause" );
}
return 0;
} |
以上範例除了switch外應該沒用到其他新東西。
switch是很簡單的語法,如範例中switch( number ),其下case 1:、case 2:…等等,就代表當number等於1時怎樣,number等於2時怎樣,如果以if來寫此程式中switch的部份,就會變成如下形式:
代碼: | if( number == 1 || number == 3)
{
cout << "* 恭喜您得到賭注x2! *" << endl;
money += bet * 2;
}
else if( number == 4 || number == 5 || number == 6 )
{
cout << "* 抱歉,您輸了! *" << endl;
}
else if( number == 7 || number == 9 )
{
cout << "* 恭喜您得到賭注x3! *" << endl;
money += bet * 3;
}
else if( number == 2 || number == 8 )
{
cout << "* 您拿回了賭注,不輸不贏。 *" << endl;
money += bet;
}
else
{
cout << "* 這應該是不會出現的訊息。 *" << endl;
} |
由此可以看出,switch的主要用途就是在對一個變數的值做條件判斷時使用,不僅可以避免一直重複打出此變數之名稱,對程式的閱讀性也有幫助。
除了整數外,字元也可以用switch來處理:
代碼: | char letter;
switch( letter )
{
case 'A':
// 省略程式碼
break;
case 'B':
// 省略程式碼
break;
} |
如同以上,字元只要用兩個單引號括起來即可。
不過對於浮點數,則要避免使用此種方式,理由如同我們先前講過的,浮點數因為儲存方式的關係,精準度並不是很夠,以這種方式處理,很有可能會出現非預期的錯誤。
使用switch時要注意的地方有兩點,第一是每當條件判斷告一段落,要用break;敘述來跳出switch,否則它會繼續執行下面case條件裡的敘述,像是我把範例中case 1跟case 3下面的break;拿掉的話,那麼當數字是1或3時,它會連case 4~case 6的「抱歉,您輸了!」也一併輸出,直到它遇到break;敘述才停止。
第二是default:敘述必須放在switch的最後面,這跟if-else的最後一個else是一樣的意思,會把上面所有已列出條件之外的所有情況都在此處理。
在範例中,因為我們的number從rand() % 9 + 1中應該只會得到數字1~9,所以switch最後的default是不應該會執行到的敘述,這可以省略,但為了說明所以我寫了出來。
switch是很有用的條件判斷語法,尤其是在視窗程式設計時,許多訊息處理或識別字判斷都會使用到switch。
那麼...我在範例中有故意留下了一個邏輯判斷上的小錯誤,就當做習題請你們試著找出來吧~
yag 在 2007-8-6, PM 1:55 星期一 作了第 2 次修改 |
|
回頂端 |
|
|
satanupup 喜歡上這裡的冒險者
註冊時間: 2007-05-29 文章: 80
68.10 果凍幣
|
發表於: 2007-6-13, PM 7:15 星期三 文章主題: |
|
|
可以輸入超過自己所擁有的錢
所以要在輸入賭的錢後面加上個if判斷式if(bet<=money){
到最後再加上個}
就完成瞜 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-6-16, PM 5:11 星期六 文章主題: |
|
|
satanupup 寫到: | 可以輸入超過自己所擁有的錢
所以要在輸入賭的錢後面加上個if判斷式if(bet<=money){
到最後再加上個}
就完成瞜 |
嗯,雖然你沒有說的很清楚,不過我大概了解你的意思,你的方向正確了,可以算是一個答案。
還有沒有其他人有更好一點的答案呢?
另外,經由snowmhiau的幫忙測試,我發現在cin的錯誤處理部份還是不太好,這就另外再開一篇主題講解吧。
...我剛講解打了一個小時,快要打完時不小心按了F5...全沒了冏rz...........
天啊~~~~~~我快吐血了~~~~~~~~~~~~~~
OhMyGod!!!!心好痛!!!!!
我不要重打啊~~~~!~~~~!~~~~!~~~~!~~~~!~~~~!
心灰意冷,歹勢,過幾天再來補...嗚嗚,好想哭... |
|
回頂端 |
|
|
snowmhiau 常駐此論壇的衛士
註冊時間: 2007-06-09 文章: 116 來自: KEELONG 692.99 果凍幣
|
發表於: 2007-6-16, PM 6:55 星期六 文章主題: |
|
|
yag 寫到: |
...我剛講解打了一個小時,快要打完時不小心按了F5...全沒了冏rz...........
天啊~~~~~~我快吐血了~~~~~~~~~~~~~~
OhMyGod!!!!心好痛!!!!!
我不要重打啊~~~~!~~~~!~~~~!~~~~!~~~~!~~~~!
心灰意冷,歹勢,過幾天再來補...嗚嗚,好想哭... |
我以前也常常遇到這問題...
常常就是軟件..當機...或者是...PO版超過時間太久結果無法正常傳遞...
所以我在要打上長篇大論的時候我都會利用記事本作成備分..
然後再COPY這樣的笨方法比較保險@@"
或者是都用手記方式做筆記..
因為我以前都在D曹做筆記,結果某天我家硬碟機壞了= ="
所有的東西都無法讀取真的是很慘。
只好全部從做...做備份檔真的滿重要的而且也是一個好習慣!~ |
|
回頂端 |
|
|
snowmhiau 常駐此論壇的衛士
註冊時間: 2007-06-09 文章: 116 來自: KEELONG 692.99 果凍幣
|
發表於: 2007-6-16, PM 7:37 星期六 文章主題: |
|
|
我用的方法也是在if( bet >= 0 )前面加上
這段語法:
代碼: | if( bet > money ) /*如果bet(賭注)大於money(總資產)*/
{
system( "cls" );
cout << "您的資金不足!" << endl; /*顯示"您的資金不足!"*/
goto Loop;
} |
目前還沒想到更好的方法 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-6-16, PM 10:19 星期六 文章主題: |
|
|
snowmhiau 寫到: |
我以前也常常遇到這問題...
常常就是軟件..當機...或者是...PO版超過時間太久結果無法正常傳遞...
所以我在要打上長篇大論的時候我都會利用記事本作成備分..
然後再COPY這樣的笨方法比較保險@@"
或者是都用手記方式做筆記..
因為我以前都在D曹做筆記,結果某天我家硬碟機壞了= ="
所有的東西都無法讀取真的是很慘。
只好全部從做...做備份檔真的滿重要的而且也是一個好習慣!~ |
嗯...說到備份,論壇似乎也該來定期備份一下了,免得哪天資料全不見,那就真的糟透了@_@"
snowmhiau 寫到: | 我用的方法也是在if( bet >= 0 )前面加上
這段語法:
代碼: | if( bet > money ) /*如果bet(賭注)大於money(總資產)*/
{
system( "cls" );
cout << "您的資金不足!" << endl; /*顯示"您的資金不足!"*/
goto Loop;
} |
目前還沒想到更好的方法 |
唔...提示一下,事實上有個辦法只要"半行"就可以達成類似妳用的方法的效果~ |
|
回頂端 |
|
|
lsk 喜歡上這裡的冒險者
註冊時間: 2007-06-20 文章: 93
20.59 果凍幣
|
發表於: 2007-6-20, AM 3:15 星期三 文章主題: |
|
|
代碼: |
if( bet >= 0 && bet <= money ) //加在這邊~
money -= bet;
else if( bet == -1 )
return 0;
else
{
system( "cls" );
cout << "請輸入正確的數字" << endl;
goto Loop;
}
|
|
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-6-20, PM 2:04 星期三 文章主題: |
|
|
lsk 寫到: | 代碼: |
if( bet >= 0 && bet <= money ) //加在這邊~ |
|
Bingo~~答對囉
不過老大...你是專業程式人員耶,還跑來搶答這種小問題XD |
|
回頂端 |
|
|
thisgo 稍嫌羞澀的路人
註冊時間: 2008-01-21 文章: 3
0.00 果凍幣
|
發表於: 2008-4-16, PM 4:49 星期三 文章主題: |
|
|
我是新手,一系列的文章看下來,第一次試著回覆文章,請多多包含。
主要是增加關於判斷bet>money之後的動作。
另外想請問,為什麼if迴圈內,有時要上下引號{},有時一行敘述就不用呢? Ex : return 0;
P.S. 寫程式感覺越來越有些感覺,繼續加油!!
代碼: | if( bet >= 0 && bet <= money)
money -= bet;
else if( bet == -1 )
return 0;
else if( bet > money) //主要是用else if新增這一段動作流程,
{
cout << "你的資金不夠,請重新輸入" << endl;
system("pause");
system("cls");
goto Loop;
}
else
{
system( "cls" );
cout << "請輸入正確的數字" << endl;
goto Loop;
} |
|
|
回頂端 |
|
|
還是零分 散播福音的祭司
註冊時間: 2007-09-19 文章: 164
653.83 果凍幣
|
發表於: 2008-4-16, PM 5:14 星期三 文章主題: |
|
|
引言回覆: | 另外想請問,為什麼if迴圈內,有時要上下引號{},有十一行敘述就不用呢? Ex : return 0; |
if判斷成立後要執行的動作只有一行的話就不用上下引號了
多行才需要 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2008-4-16, PM 9:29 星期三 文章主題: |
|
|
To thisgo:
這是它的語法規定
只有一行時可以省略左右大刮號
兩行以上時就不能省略
之所以會有這種規定
主要是精簡程式碼吧,可以省下兩個大刮號佔住的兩行,看起來清楚些
以常理推斷
只有一行時我們可以很明顯知道這是屬於此行上面的條件判斷敘述或者迴圈敘述
兩行以上時
我們就無法很明確了解到底是接著上面的敘述還是獨立的敘述
因此就必須要有大刮號 |
|
回頂端 |
|
|
thisgo 稍嫌羞澀的路人
註冊時間: 2008-01-21 文章: 3
0.00 果凍幣
|
發表於: 2008-4-17, PM 8:06 星期四 文章主題: |
|
|
To 樓上兩位大大:
謝謝兩位熱心回覆,有些小地方果然是要自己動手寫一次,有碰到才會有印象,多謝 |
|
回頂端 |
|
|
hello147258369 偶而上來逛逛的過客
註冊時間: 2009-08-01 文章: 6
40.05 果凍幣
|
發表於: 2009-8-1, PM 2:58 星期六 文章主題: |
|
|
先說一下對不起...我是一個新手....可能之前看得不太清楚....
我想問一下time.h是用來做什麼的??
還有srand( (unsigned)time( NULL ) ); 這行不太明白... |
|
回頂端 |
|
|
hello147258369 偶而上來逛逛的過客
註冊時間: 2009-08-01 文章: 6
40.05 果凍幣
|
發表於: 2009-8-1, PM 4:14 星期六 文章主題: |
|
|
還有個問題想問一下....如果數字打了超過int的限制...會停止了..... |
|
回頂端 |
|
|
mirror 散播福音的祭司
註冊時間: 2007-07-27 文章: 174
828.60 果凍幣
|
發表於: 2009-8-1, PM 6:11 星期六 文章主題: |
|
|
hello147258369 寫到: | 先說一下對不起...我是一個新手....可能之前看得不太清楚....
我想問一下time.h是用來做什麼的??
還有srand( (unsigned)time( NULL ) ); 這行不太明白... |
time是時間的意思
為了使用時間的結構、函數
所以要載入 time.h 標頭檔
srand( (unsigned)time( NULL ) );
srand這個函數是用來產生亂數值的種子使用
要配合rand()一併使用的...
而種子的取樣是time,因為time變化大
比較不會重覆
如果不用srand會怎麼樣..
假設你的rand()取出的前面四個亂數值是 1 2 2 3 四個數字好了
那它前面四個值永遠都是 1 2 2 3
相信這對遊戲設計是很不好的
只要記下亂數的順序,即使你做的是很簡單的麻將遊戲好了
很快就會被玩家破解了..
至於你說的int問題是溢位
網路上搜尋一下就知道溢位是什麼了
假設你的類型是不帶正負號的Byte好了
它的值介於0~255
如果你的數值小於0,或超過255的時候就會發生溢位問題
輕微發生程式當掉... |
|
回頂端 |
|
|
|