線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1888
推到 Plurk!
推到 Facebook!

classTime的問題

答題得分者是:AndrewK
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-26 21:59:31 IP:61.64.xxx.xxx 訂閱
/****************************************************************************
* 答題時間設定 *
****************************************************************************/
//設定時間秒數
void __fastcall TformMain::setTime(int minT)
{
minTime = minT;
}
//---------------------------------------------------------------------------
//取得時間秒數
int __fastcall TformMain::getTime()
{
return minTime;
}
//---------------------------------------------------------------------------
//減少時間
void __fastcall TformMain::cutTime(int cutT)
{
if(minTime == 0) //時間到時將限制為零
minTime = 0;
else
minTime -= cutT;
}
//---------------------------------------------------------------------------
/****************************************************************************
* 答題時間 *
****************************************************************************/
void __fastcall TformMain::timeQuestionTimeTimer(TObject *Sender)
{
//答題時間遞減
cutTime(1);

//顯示答題時間
Label_time->Caption = getTime();

//倒數時間設定
if (getTime() <= (minTime))
{
getTime();
Label_time->Caption = getTime(); //顯示答題時間
}
//答題時間結束
if (getTime() == (0))
{
FeedBack(3); //時間到回饋
timeQuestionTime->Enabled = false; //答題結束,關閉倒數計時
Sky_JudgeCount = false; //答題結束, 關閉感應
}
}


不太懂倒數時間設定那段程式碼

麻煩幫忙解釋一下(尤其是<=minTime那)

還有答題時間設定那段(尤其看不懂減少時間那段)

因為最近一直卡在沒辦法順利讓程式跑到我給的條件結束時跑到回饋的form

常常一執行就直接跑到formFeedBack(下面是最近卡關的程式碼)

//---------------------------------------------------------------------------
void __fastcall TformExpElm::timeGameTimeTimer(TObject *Sender)
{
ExpElm_SubTime ;
//遊戲時間遞減
if (ExpElm_SubTime%2 == 0)
ExpElm_GameTime.cutTime(1);
//時間Bar反應
imgGameTimeBar->Canvas->Brush->Color = clBlack;
imgGameTimeBar->Canvas->FillRect(Rect(0,0,ExpElm_SubTime*0.5,25));
//遊戲時間結束
if (ExpElm_GameTime.getTime() == 0)
{
ExpElm_Timeover = false;
FeedBack();
}
}
//---------------------------------------------------------------------------
void __fastcall TformExpElm::FeedBack()
{
//關閉時間倒數
timeGameTime->Enabled = false;
timeCount->Enabled = false;
//開啟回饋畫面
formFeedBack->Show();
//formFeedBack->Timer1->Enabled = true;
//formFeedBack->LoadDB(2,formExpElm_QueGet.getTitleNum(),formJump_Left_Answer,formJump_Right_Answer);
}

主要是在遊戲時間遞減那段看不懂怎麼運作

因為卡關卡一段時間了,所以希望各位能鼎力相助!!(抱歉,第一次問,問的東西有點多) 謝謝了!!

(希望能用淺顯易懂的方式詳細說明,因為涉獵不深) 再次先謝謝大家了!!!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-27 09:49:33 IP:115.43.xxx.xxx 訂閱
//設定時間秒數
void __fastcall TformMain::setTime(int minT)
{
minTime = minT;
}
//---------------------------------------------------------------------------
//取得時間秒數
int __fastcall TformMain::getTime()
{
return minTime;
}
//---------------------------------------------------------------------------
//減少時間
void __fastcall TformMain::cutTime(int cutT)
{
if(minTime == 0) //時間到時將限制為零
minTime = 0;
else
minTime -= cutT;
}
//---------------------------------------------------------------------------
/****************************************************************************
* 答題時間 *
****************************************************************************/
void __fastcall TformMain::timeQuestionTimeTimer(TObject *Sender)
{
//答題時間遞減
cutTime(1);

//顯示答題時間
Label_time->Caption = getTime();

//倒數時間設定
if (getTime() <= (minTime))
{
getTime();
Label_time->Caption = getTime(); //顯示答題時間
}
//答題時間結束
if (getTime() == (0))
{
FeedBack(3); //時間到回饋
timeQuestionTime->Enabled = false; //答題結束,關閉倒數計時
Sky_JudgeCount = false; //答題結束, 關閉感應
}
}


不太懂倒數時間設定那段程式碼

麻煩幫忙解釋一下(尤其是<=minTime那)

我想這裡應該是 == 0 或<=minT


還有答題時間設定那段(尤其看不懂減少時間那段)

因為最近一直卡在沒辦法順利讓程式跑到我給的條件結束時跑到回饋的form

常常一執行就直接跑到formFeedBack(下面是最近卡關的程式碼)

//---------------------------------------------------------------------------
void __fastcall TformExpElm::timeGameTimeTimer(TObject *Sender)
{
ExpElm_SubTime ;
//遊戲時間遞減
if (ExpElm_SubTime%2 == 0)
ExpElm_GameTime.cutTime(1);
//時間Bar反應
imgGameTimeBar->Canvas->Brush->Color = clBlack;
imgGameTimeBar->Canvas->FillRect(Rect(0,0,ExpElm_SubTime*0.5,25));
//遊戲時間結束
if (ExpElm_GameTime.getTime() == 0)
{
ExpElm_Timeover = false;
FeedBack();
}
}

1.如果 ExpElm_SubTime%2 的目的,是為了讓時間 2秒遞減一的話,你可以設定 timeGameTime 的屬性 interval 為 2000,可查看書本裡 timer 的屬性介紹
2.而 ExpElm_GameTime 如果是你的 classTime class,但還沒看到你做初始 setTime 的動作
ex:ExpElm_GameTime.settime(xxx);





//---------------------------------------------------------------------------
void __fastcall TformExpElm::FeedBack()
{
//關閉時間倒數
timeGameTime->Enabled = false;
timeCount->Enabled = false;
//開啟回饋畫面
formFeedBack->Show();
//formFeedBack->Timer1->Enabled = true;
//formFeedBack->LoadDB(2,formExpElm_QueGet.getTitleNum(),formJump_Left_Answer,formJump_Right_Answer);
}

主要是在遊戲時間遞減那段看不懂怎麼運作

因為卡關卡一段時間了,所以希望各位能鼎力相助!!(抱歉,第一次問,問的東西有點多) 謝謝了!!

(希望能用淺顯易懂的方式詳細說明,因為涉獵不深) 再次先謝謝大家了!!!
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-07-27 09:55:45, 註解 無‧
AndrewK 重新編輯於 2009-07-27 09:56:19, 註解 無‧
AndrewK 重新編輯於 2009-07-27 12:48:10, 註解 無‧
AndrewK 重新編輯於 2009-07-28 00:24:48, 註解 無‧
AndrewK 重新編輯於 2009-07-28 00:54:47, 註解 無‧
AndrewK 重新編輯於 2009-08-02 22:33:16, 註解 無‧
AndrewK 重新編輯於 2009-08-02 22:34:14, 註解 修正error‧
AndrewK 重新編輯於 2009-08-02 22:41:25, 註解 line the mistake in some suggest‧
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-27 16:04:49 IP:61.64.xxx.xxx 訂閱
ExpElm_GameTime.setTime(60);
ExpElm_SubTime ;
//遊戲時間遞減
if (ExpElm_SubTime%2 == 0)
ExpElm_GameTime.cutTime(1);
ExpElm_GameTime.getTime();
Label1->Caption = ExpElm_GameTime.getTime();

之後加了第1行和6.7行 想看看它時間是怎麼遞減

結果他是60變59再變成60循環跑 不知道是哪邊邏輯錯了

還有不大懂它那裏為什麼要除以2取餘數,判斷奇數偶數是為了甚麼?看不太懂

minTime為什麼會等於0阿?不是等跑完才會return minTime為0阿?

不好意思 希望再幫多加解釋一下(理解力有點慢@@) 謝謝你了!!!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-27 16:25:06 IP:115.43.xxx.xxx 訂閱
1. 從 timeGameTimeTimer.enable = ture 開始
timeGameTimeTimer 的事件 會一直不斷執行
執行到 timeGameTimeTimer.enable = false
執行的速度是 timeGameTimetimer 的 interval 屬性設多少 (單位:千分之一秒)
Ex: timeGameTimetimer 的 interval 屬性設成 1000,就每一秒就跑這個事件一次,執行裡面
的程式碼,這個就是 Ttimer 物件的特性,也就是你現在命名為 timeGameTime 這個物件

2.你的 settime 這個動作,算是初始化的動作,不應該放在 timeGameTimeTimer 的事件裡
你可以用逐歩偵錯跑跑看,會發現一直不斷將 mintime 設為 60,我猜測 timeGameTimetimer
物件是你手動拉到 form 上的, 設計模式就建立好了,你試試看放在 formcreate 事件裡吧

3.為什麼要取2的餘數 --> 你的 timegametime 的 interval 設成多少?
a.你可以試試不 % 2,再把 相關 ExpElm_SubTime 變數的值判斷要不要乘 2
b.也可以直接不 % 2,再改變 ExpElm_subTime變數,將 timeGameTimetimer 的 interval 屬性
值乘 2,看看顯示結果變成如何?

4.
[code cpp]
ExpElm_GameTime.setTime(60);
ExpElm_SubTime ;
//遊戲時間遞減
if (ExpElm_SubTime%2 == 0)
ExpElm_GameTime.cutTime(1);
ExpElm_GameTime.getTime();
Label1->Caption = ExpElm_GameTime.getTime();
[/code]
可以改成
[code cpp]
ExpElm_GameTime.setTime(60);
ExpElm_SubTime ;
//遊戲時間遞減
if (ExpElm_SubTime%2 == 0)
ExpElm_GameTime.cutTime(1);
// ExpElm_GameTime.getTime(); 【getime 為取值用,這裡可以省略】
Label1->Caption = ExpElm_GameTime.getTime();
[/code]
當 ExpElm_GameTime.cutTime(1); 時,ExpElm_GameTime 裡的 minetime就自動減一了

5. 其實我也是單看你的程式碼,只能猜測你的 ExpElm_GameTime 這個物件,是已經寫好
並裝到 IDE 上,而裡面的 cutTime(),getTime(), setTime() 三個函式,就是 OO 的封裝的
特性,將 ExpElm_GameTime 的 minetime 封裝起來

如果還是有不清楚的地方,最好的方法,拿一本BCB的書,學兩件事
1.學學如何利用 BCB 來 逐歩偵錯,並觀看變數的變化
2.打開 BCB 的書,看看 TTime 這個物件的運作原理

最後你可以利用逐歩偵錯,對你的疑問,將程式做一些改變,觀看結果
對你以後程式的學習與撰寫會有非常大的幫助
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-07-27 16:30:03, 註解 無‧
AndrewK 重新編輯於 2009-07-27 16:59:59, 註解 無‧
AndrewK 重新編輯於 2009-07-27 17:08:41, 註解 無‧
AndrewK 重新編輯於 2009-07-27 17:44:00, 註解 無‧
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-27 23:19:48 IP:61.64.xxx.xxx 訂閱
原來是這樣,都忘了他要一直計次

總算可以跑到我要的結果了

我會試試%2那不同的用法

是指timer程式碼放到formcrete跑看看的意思嗎?

恩 我們把常用的寫成class用

還有 我一直想知道 當被debug有錯誤時(會出現藍色的條狀顯示畫面) 怎麼能強制中斷

它都不給中斷,只好ctrl alt del結束程式= =

恩 我最近有在拿松岡的書一章一章跟著學

我會去多試試逐步偵錯,觀察變數的變化

這確實會對我幫助很大,謝謝你給的這些建議呢!!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-07-28 00:53:29 IP:115.43.xxx.xxx 訂閱
1.ExpElm_GameTime.setTime(60)  【單獨這一行】
置於 Formcreate 函式

2.當被debug有錯誤時(會出現藍色的條狀顯示畫面) 如何能 Reset ??
你可以按 Ctrl F2

3. 我回覆 #2 的文章中,部分內容有誤,
你的 setTime 函式中 minT 只是參數
無法用於timeQuestionTimeTimer 函式中做為判斷的依據
==============================================

站內還有很多前輩分享經驗的文章,你也可以多多利用

------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-07-28 00:56:26, 註解 無‧
AndrewK 重新編輯於 2009-07-28 00:57:24, 註解 無‧
AndrewK 重新編輯於 2009-07-28 01:39:36, 註解 無‧
AndrewK 重新編輯於 2009-07-28 01:55:37, 註解 無‧
AndrewK 重新編輯於 2009-07-28 04:24:38, 註解 無‧
AndrewK 重新編輯於 2009-07-28 04:25:19, 註解 無‧
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-07-29 14:33:56 IP:61.64.xxx.xxx 訂閱
了解!!  希望以後還有機會能再請教你一些問題

付帶一個問題,BCB平方必須要寫成變數*變數,不能變數^2嗎?

在裡面搜尋和課本似乎沒注意到有說明這問題,謝謝了!!

底下是練習的程式碼,若都改成^2是能執行,不過出來答案不同

void __fastcall Tf5_8_1::btnRunClick(TObject *Sender)
{
int sideA,sideB,sideC;
sideA=StrToInt(edtSideA->Text);
sideB=StrToInt(edtSideB->Text);
sideC=StrToInt(edtSideC->Text);
if ((sideA sideB>sideC) && (sideB sideC>sideA) && (sideC sideA>sideB))
{if (sideC*sideC>sideA*sideA sideB*sideB)
lblKind->Caption="鈍角三角形";
if (sideC*sideC==sideA*sideA sideB*sideB)
lblKind->Caption="直角三角形";
if (sideC*sideC lblKind->Caption="銳角三角形";
lblYN->Caption="Yes! 是!";

}
else
{
lblYN->Caption="No! 不是!";
lblKind->Caption="不是三角形";

}
}
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-07-29 14:49:08 IP:61.64.xxx.xxx 訂閱
if (rbt01->Checked==true)
lblShow2->Caption="祝: 學業進步!";
else if (rbt21->Checked==true)
lblShow2->Caption="祝! 事事如意!";
else if (rbt41->Checked==true)
lblShow2->Caption="祝! 身體健康!";
else if (rbt61->Checked==true)
lblShow2->Caption="祝! 闔家平安!";

這有辦法寫成switch寫法嗎?

不好意思 這次問題大概就這些了~~
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-07-29 15:21:18 IP:118.169.xxx.xxx 訂閱
你怎麼認定 ^ 是代表次方而不是代表XOR?



===================引 用 a03021 文 章===================
付帶一個問題,BCB平方必須要寫成變數*變數,不能變數^2嗎?
底下是練習的程式碼,若都改成^2是能執行,不過出來答案不同
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-07-29 15:22:28 IP:118.169.xxx.xxx 訂閱
你可以先寫看看,不行再看看compiler告訴你什麼訊息

===================引 用 a03021 文 章===================
if (rbt01->Checked==true)
lblShow2->Caption="祝: 學業進步!";
else if (rbt21->Checked==true)
lblShow2->Caption="祝! 事事如意!";
else if (rbt41->Checked==true)
lblShow2->Caption="祝! 身體健康!";
else if (rbt61->Checked==true)
lblShow2->Caption="祝! 闔家平安!";

這有辦法寫成switch寫法嗎?

不好意思 這次問題大概就這些了~~
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-07-29 22:25:56 IP:61.64.xxx.xxx 訂閱
原來是我一直搞混= =,把Java"^2"平方的用法拿來用......

不過後來想一想,如果單就這程式碼,寫成 if 好像比較簡單

因為若寫成switch,會不知道怎麼設成整數運算式或字元的條件

謝謝你讓我把困惑的平方問題解決!!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-07-30 01:07:56 IP:115.43.xxx.xxx 訂閱
1.如果是練習 coding 所用,可以試試看用變數,再處理預防【邏輯上的錯誤】試試
2.思考是否可以用其他元件取代 Tcheckbox,再使用 switch .... case

試試看吧!! 接下來就看你自己如何處理了~~
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-07-30 01:15:15, 註解 無‧
a03021
一般會員


發表:3
回覆:9
積分:2
註冊:2009-07-25

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-07-30 11:14:55 IP:61.64.xxx.xxx 訂閱
其他元件取代Tcheckbox,應該是個很不錯的方法

謝謝了 我去試試!
系統時間:2017-10-20 23:58:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!