上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-17, PM 9:42 星期一 文章主題: [問題][C++]請問C++的幾個用法 |
|
|
如何以C++寫出匯入~匯出參數
以及使用C++來判斷鍵盤上按了哪個鍵
或是可一直接使用C++來判斷1個表單
例如
> 選項A
選項B
選項C
>為游標~可以上下移動~然後按ENTER或其他鍵來選擇 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-18, AM 12:01 星期二 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | 如何以C++寫出匯入~匯出參數
以及使用C++來判斷鍵盤上按了哪個鍵
或是可一直接使用C++來判斷1個表單
例如
> 選項A
選項B
選項C
>為游標~可以上下移動~然後按ENTER或其他鍵來選擇 |
我不確定你說的「匯入~匯出參數」是什麼意思
如果是判斷按鍵的話,可以使用getch()函式讀入按鍵做判斷
想要判斷方向鍵的話,請參考以下這個主題的第六篇文章:
http://www.gamelife.idv.tw/viewtopic.php?t=118 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-18, PM 6:07 星期二 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
我想說的就是類似RPG讀取於存檔的概念
不知是否是將其中的檔案資料匯出存黨
然後要用的時候在讀取進來?
這些對初學者似乎難了點= =...
另外大大說的那個我有看過~但是他沒有解說~所以我不知道原理怎麼使用... |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-18, PM 7:21 星期二 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | 我想說的就是類似RPG讀取於存檔的概念
不知是否是將其中的檔案資料匯出存黨
然後要用的時候在讀取進來?
這些對初學者似乎難了點= =...
另外大大說的那個我有看過~但是他沒有解說~所以我不知道原理怎麼使用... |
喔,可以啊
就把想儲存的數值放到檔案裡就行了
標準c++的書都有教file stream怎麼用
以RPG來說
假設你等級20
看你各種屬性是用算式算來的還是有變化的再決定屬性要不要存(假設不用存)
然後假設你擁有數種裝備
裝備實際上在程式中都可以用數字代替
比如說編號1可能是制式長劍,編號2可能是制式盔甲
那你要把目前狀況儲存時
可能就是存成
20 1 2
就這樣存三個數值就把你目前的狀態記錄下來了
這代表你的角色是20級,身上有制式長劍跟制式盔甲
當然這只是小小的範例
實際上可能還要記錄東西是穿著的還是放在背包裡的
以及你目前的座標,目前任務過到哪
這些都是可以用一些簡單的旗標(也就是數字)來記錄的
至於方向鍵嘛...你把他的程式碼相關部份照著copy下來就行了啊
你可以試著修改他一些程式碼做測試,應該就可以理解要怎麼使用 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-18, PM 8:28 星期二 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
yag 寫到: | fire231 寫到: | 另外大大說的那個我有看過~但是他沒有解說~所以我不知道原理怎麼使用... |
至於方向鍵嘛...你把他的程式碼相關部份照著copy下來就行了啊
你可以試著修改他一些程式碼做測試,應該就可以理解要怎麼使用 |
我補充一下好了
我們寫程式時,實際上很多地方不需要知道它的原理是什麼
只要會用就好了
就好像我們不知道電視遙控器的原理,但只要知道怎麼用,我們就可以拿它來遙控電視
這世界上的原理太多了,追下去是追不完的,重點是要先會用
以林教授的GetArrowKey範例來說
只要先#include "wincon.h",接著就可以使用抓取按鍵的功能
再來就是要宣告一個
union
{
int twoByte;
char oneByte[2];
} key;
這裡可以看到它把int變數名稱叫twoByte,但實際上,int是跟cpu同位元數的,所以是4Bytes(32位元)
不過在這並沒有妨礙,它真正的意思是要告訴我們,我們只會取用前兩個Bytes
之後要宣告一個INPUT_RECORD Buffer;
跟一個DWORD NumberOfEventsRead;
然後把它們丟到int a = ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Buffer, 1, &NumberOfEventsRead);裡面
最後用key.twoByte = Buffer.Event.KeyEvent.wVirtualScanCode;這行來把按鍵訊息讀進來
到這裡為止都是制式的用法,每次要用時就copy過來就是了
接著就是判斷的部份
我們可以看到GetArrowKey.cpp最上面有以下幾行
#define LEFT 75 // Code for the LEFT arrow key
#define RIGHT 77 // Code for the RIGHT arrow key
#define UP 72 // Code for the UP arrow key
#define DOWN 80 // Code for the DOWN arrow key
#define QUIT 16 // Code for Q
這些數值就是所謂的scan code,至於其餘按鍵的scan code請參考:
http://www.ece.umd.edu/~nsw/ench250/scancode.htm
那麼現在我們可以讀取使用者的輸入了
以key.oneByte[0] == UP為例子來說
使用者就是按了↑,應該不難理解
這一整個解說下來,實際上我們只用了一個函式,就是ReadConsoleInput,其餘的東西都是從這個函式延伸出來的
像是為了傳入引數,所以我們必須宣告Buffer跟NumberOfEventsRead,為了使用這個函式我們必須include wincon.h…等等
所以寫程式最重要的事情只有兩件,第一,抓住一堆程式碼中的重點,在這我們的重點就是ReadConsoleInput
第二,學會查詢資料文件,只要到google查詢ReadConsoleInput就會發現這個網址:http://msdn2.microsoft.com/en-us/library/ms684961.aspx
然後就可以知道需要宣告些什麼,並且抓些什麼東西出來用
就算是有解說不清楚的地方(像是scan code),起碼我們也能得到關鍵字:scan code
然後再回到google查詢,直到找到我們要的東西為止
程式的領域太廣、東西太多,絕對不可能背得完,也不可能什麼都了解,就連書籍都沒辦法教得完
所以一個程式設計師最需要的特質就是要了解怎麼查詢自己需要的資料,能夠自我成長、自我學習,這樣才能在程式設計的路上持續走下去
ps.話說那個scan code是跟裝置(鍵盤)相關的,即使遇到了在台灣少見的裝置(比如說日文鍵盤)而使得scan code不一樣,也可以在程式碼中一一測試出來自己要的scan code,只要將key.oneByte[0]的數值顯示出來就行了,然後每個按鍵都試一試,把數值抄下來,自然就得到了一份scan code表。 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-18, PM 9:55 星期二 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
我將他的程式碼複製下來
貼到DEV-C++之後編譯
無法編譯成功說= =
難道是VC++跟DEV-C++不同嗎= =??
不過我執行它的EXE檔到是可以 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-19, PM 5:16 星期三 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | 我將他的程式碼複製下來
貼到DEV-C++之後編譯
無法編譯成功說= =
難道是VC++跟DEV-C++不同嗎= =??
不過我執行它的EXE檔到是可以 |
你是指整個GetArrowKey範例嗎?
你有把consola.h跟consola.lib也放到同一個資料夾下嗎? |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-19, PM 6:12 星期三 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
有~可是還是沒用...
exe檔是可以執行
但是cpp檔複製下來後不能編譯 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-19, PM 8:42 星期三 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
順便問問
如何呼叫外部程式?
大大寫的C++入門非常不錯
例題講解也很精闢~
不過看到第10回就沒了= =~有點可惜.. |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-20, PM 4:06 星期四 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | 有~可是還是沒用...
exe檔是可以執行
但是cpp檔複製下來後不能編譯 |
唔...編譯時的錯誤訊息是什麼呢?
fire231 寫到: | 順便問問
如何呼叫外部程式?
大大寫的C++入門非常不錯
例題講解也很精闢~
不過看到第10回就沒了= =~有點可惜.. |
呼叫外部程式?是指什麼呢?
使用system()函式如何?
呵呵
我還以為那幾篇沒人看@@"
最近有點忙
而且前幾天硬碟剛壞掉...
很多資料都沒了
現在在準備重灌中
等過一陣子我會開始寫新進度的
感謝支持喔^^ |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-20, PM 6:09 星期四 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
union
{
int twoByte;
char oneByte[2];
} key;
void DrawBox(); // Function to draw the boundary box
void main(void)
{
在這邊就錯了= =..
好像是說main不能用void吧...
我只要遇到這樣的~他都會出錯...
--
我的意思是說~例如這時候我要存檔
於是打上指令~這時候呼叫外部程式
該程式的內容是讀取主程式的一些需要存檔的資料之後存起來
存檔是這樣使用的吧?
因為大大後面第10篇RPG沒有教學完= =
大大的解析比另外上面大大PO的那個還要清楚~ |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-20, PM 10:08 星期四 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | union
{
int twoByte;
char oneByte[2];
} key;
void DrawBox(); // Function to draw the boundary box
void main(void)
{
在這邊就錯了= =..
好像是說main不能用void吧...
我只要遇到這樣的~他都會出錯...
-- |
呵,那你就把void main改成int main嘛
試著依據錯誤訊息修正你遇到的bug囉
fire231 寫到: | 我的意思是說~例如這時候我要存檔
於是打上指令~這時候呼叫外部程式
該程式的內容是讀取主程式的一些需要存檔的資料之後存起來
存檔是這樣使用的吧?
因為大大後面第10篇RPG沒有教學完= =
大大的解析比另外上面大大PO的那個還要清楚~ |
這只要一個函式就行了^^
就像那個RPG,輸入fight就會呼叫fight()函式
你可以增加輸入save就呼叫save()函式
然後自己試著實作save()函式的內容
以目前第10篇的內容來說
只要把x座標、y座標跟money金錢這三個儲存到txt檔裡就行了
然後可以再試著實作一個相對應的load()函式把存檔讀出來
讀出來時就是從我們的txt檔裡把x、y、money讀出來並設定
再把畫面做相對應的更新
就可以把存檔讀出來囉 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-20, PM 10:18 星期四 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
我嘗試過將他的程式修改了
後來發現
好像是下面繪圖部分的問題= =
於是我把下面刪掉~上面一些函數也取消
後來得到
代碼: | #include "stdafx.h"
#include "windows.h"
#include "wincon.h"
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "consola.h" // Please read the README file in the working directory
#define LEFT 75 // Code for the LEFT arrow key
#define RIGHT 77 // Code for the RIGHT arrow key
#define UP 72 // Code for the UP arrow key
#define DOWN 80 // Code for the DOWN arrow key
#define QUIT 16 // Code for Q
// for more detailed informaiton about CONSOLA.H
union
{
int twoByte;
char oneByte[2];
} key;
void DrawBox(); // Function to draw the boundary box
int main()
{
INPUT_RECORD Buffer;
DWORD NumberOfEventsRead;
// Draw the boundary box
while( key.oneByte[0] != 16 ) // Exit the program when Q pressed
{
int a = ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Buffer, 2 , &NumberOfEventsRead);
key.twoByte = Buffer.Event.KeyEvent.wVirtualScanCode;
if( key.oneByte[0] == UP ){
printf("The UP key is pressed\n");
else if( key.oneByte[0] == DOWN ){
printf("The DOWN key is pressed\n");
else if( key.oneByte[0] == LEFT ){
printf("The LEFT key is pressed\n");
else if( key.oneByte[0] == RIGHT ){
printf("The RIGHT key is pressed\n");
else{
printf("Please press any ARROW KEY (Q to quit)\n");
}
} |
這樣
似乎是不錯了~也可以編譯
不過編譯後~他會不規則列出句子~而且無法暫停~甚至連滑鼠的移動都會判斷
於是我把它修改成
代碼: | #include "stdafx.h"
#include "windows.h"
#include "wincon.h"
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "consola.h" // Please read the README file in the working directory
#define LEFT 75 // Code for the LEFT arrow key
#define RIGHT 77 // Code for the RIGHT arrow key
#define UP 72 // Code for the UP arrow key
#define DOWN 80 // Code for the DOWN arrow key
#define QUIT 16 // Code for Q
// for more detailed informaiton about CONSOLA.H
union
{
int twoByte;
char oneByte[2];
} key;
void DrawBox(); // Function to draw the boundary box
int main()
{
INPUT_RECORD Buffer;
DWORD NumberOfEventsRead;
// Draw the boundary box
while( key.oneByte[0] != 16 ) // Exit the program when Q pressed
{
int a = ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Buffer, 2 , &NumberOfEventsRead);
key.twoByte = Buffer.Event.KeyEvent.wVirtualScanCode;
if( key.oneByte[0] == UP ){
printf("The UP key is pressed\n");
system("pause");}
else if( key.oneByte[0] == DOWN ){
printf("The DOWN key is pressed\n");
system("pause");}
else if( key.oneByte[0] == LEFT ){
printf("The LEFT key is pressed\n");
system("pause");}
else if( key.oneByte[0] == RIGHT ){
printf("The RIGHT key is pressed\n");
system("pause");}
else{
printf("Please press any ARROW KEY (Q to quit)\n");
system("pause");}
}
} |
在每段的部份加了
system("pause");
結果差強人意
每當我要按下去判斷的時候他會執行兩次(連續判斷兩次)
於是當我按上
他會出現
UP 被按下
請按任何鍵繼續
這時若要離開按其他的鍵會出現
按Q離開
請按任何建繼續
這時按Q要按兩次才能結束
總之就是每次都會判斷兩次~按任何鍵繼續的時候~我按的鍵就會變成判斷的鍵
fire231 在 2007-9-20, PM 10:20 星期四 作了第 1 次修改 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-9-20, PM 10:18 星期四 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
另外
使用SAVE的函數
那又如何將參數存於另外一個TXT黨呢?
我想問的就是這個= =....
如何將參數匯出到TXT黨上面 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2007-9-21, PM 2:14 星期五 文章主題: Re: [問題][C++]請問C++的幾個用法 |
|
|
fire231 寫到: | 另外
使用SAVE的函數
那又如何將參數存於另外一個TXT黨呢?
我想問的就是這個= =....
如何將參數匯出到TXT黨上面 |
使用file stream就可以了
你那邊手上沒有c++的書嗎?
就算是c語言也是有標準檔案輸入輸出
你查c語言書的最後幾章或者上網找FILE結構都找得到相關說明
簡單的output file stream的使用是先#include <fstream>
然後宣告ofstream outFile( "c:\\test.txt" );
假設我們有個變數int money = 1000;要存入test.txt中
就使用outFile << money;即可存入
如此一來你的c碟下就會多個test.txt檔,裡面存了1000這個數值
至於詳細的用法,你可能要查書或上網查
這部份的教學還要好一陣子才會寫到...我得先把我掛掉的硬碟搞定才行
另外...參數在程式語言中一般是指函式期待接收進來的變數
名詞使用上要注意一些,不然會造成代溝
像是外部程式一般是指其他獨立的exe檔
如果要把某些名詞拿來表達自己特有的意義
最好是可以詳細解釋清楚唷~
以你這篇為例,以「變數」或「數值」來代替「參數」會比較好
以「存入」代替「匯出」會比較好 |
|
回頂端 |
|
|
|