Re: [問題] 遊戲程式

看板C_and_CPP (C/C++)作者 (AzureBlaze)時間14年前 (2011/12/11 23:40), 編輯推噓1(107)
留言8則, 5人參與, 最新討論串4/5 (看更多)
※ 引述《winston1215 (Winston)》之銘言: 考慮到難度我覺得用Console來做是最可行的 出來的效果大概是這樣 http://codepad.org/L5te3jaH 這是我以前拿來交作業的貪吃蛇(好孩子不要抄), 不過機械系的計程亂寫一通也不會有人管,所以寫 得連我現在也看不懂,看看就好了不建議去研究他 console的進階操作沒有標準所以會關係到你要在什 麼平台上跑。以下假設你要在windows上寫: 首先幾乎所有windows API(就是windows放出來給你 用的函數)都放在windows.h裡,所以: #include <windows.h> 接著要對console進行操作 可是windows下同時可以開這麼多程式,一個程式也 可以開好幾個console出來,他怎麼知道你要操作哪 一個?這時候就要用GetStdHandle() 定義: http://ppt.cc/wdi0 HANDLE WINAPI GetStdHandle( __in DWORD nStdHandle ); GetStdHandle()會傳回你目前程式預設console的HANDLE 傳回的型態HANDLE說穿了就是一個類似pointer的東 西,對console的操作都要透過這個HANDLE去辨別被 操作的東西。 WINAPI是什麼可以不用管他 MSDN中所有函數的參數都會標上 __in或是__out等來 表示他是輸入還是輸出用的,只是方便使用者閱讀實 際上沒有意義 DWORD這個資料型態實際上只是個unsigned int nStdHandle的內容可以看一下說明,我們要的是輸出 到螢幕上,所以使用STD_OUTPUT_HANDLE DWORD handle = GetStdHandle(STD_OUTPUT_HANDLE); 一般的console只能輸出到游標的位置,而且游標還不 能任意移動。要做遊戲就幾乎需要能夠輸出到螢幕上任 意位置了。這時候要用的是WriteConsoleOutputCharacter() 定義: http://ppt.cc/q0db BOOL WINAPI WriteConsoleOutputCharacter( __in HANDLE hConsoleOutput, __in LPCTSTR lpCharacter, __in DWORD nLength, __in COORD dwWriteCoord, __out LPDWORD lpNumberOfCharsWritten ); 第一個hConsoleOutput就是我們剛剛從GetStdHandle() 那邊拿到的HANDLE,他才知道這些字是要寫到哪個console。 LPCTSTR就是Windows惡名昭彰的匈牙利命名法了,他的意思是 "Long Pointer to Constant TCHAR String" L P C T STR TCHAR是用來應付ascii和unicode差別用的Char Type 在一般ascii的環境下就只是個普通的char 所以LPCTSTR實際的意思就是const char*而已 這邊放的是你要寫進去的字串 nLength是你要寫進去字串的長度 COORD是WINAPI用的struct: typedef struct _COORD { SHORT X; SHORT Y; } COORD, *PCOORD; 也就是把xy座標包在一起 在dwWriteCoord這邊的意思是輸入字串開始的xy座標(左上角算起) LPDWORD "Long Pointer to DWORD" L P DWORD 其實就是DWORD*,或是unsigned int* lpNumberOfCharsWritten是用來傳回實際上寫入了幾個字元(寫到 這個指標指向的位址裡) 通常好像沒什麼用? XP可以直接放個NULL給他,不過在Windows7下會當給你看所以要找 個東西接著。 COORD p1; p1.X = 35; p1.Y = 12; char *str = "hello world!"; DWORD dummy; WriteConsoleOutputCharacter( handle, str, strlen(str), p1, &dummy ); 這樣會把"hello world"寫到螢幕大概中央的地方 順帶一題,console的預設大小是80*25(可以改) 如果想要花俏一點的話(黑白文字寶石方塊想到就覺得可怕) 可以用WriteConsoleOutputAttribute()替文字上色 定義: http://ppt.cc/VYYm BOOL WINAPI WriteConsoleOutputAttribute( __in HANDLE hConsoleOutput, __in const WORD *lpAttribute, __in DWORD nLength, __in COORD dwWriteCoord, __out LPDWORD lpNumberOfAttrsWritten ); 除了寫入的lpAttribute以外基本上和剛剛的WriteConsoleOutputCharacter一樣 WORD這個東西和DWORD其實一樣 WriteConsoleOutputAttribute()會改變螢幕上某個位置的屬性 http://ppt.cc/EEWH 常用的屬性包括字的顏色、背景顏色 顏色的操作有RED GREEN BLUE INTENSITY四種可以組合 出來的結果有16色(就是一般BBS那些顏色) 效果要用| (bitwise OR)加在一起,像是: WORD red = FOREGROUND_RED | FORGROUND_INTENSITY; //亮紅色字,黑背景 WORD darkCyan = FOREGROUND_GREEN | FOREGROUND_BLUE;//暗青色字,黑背景 WORD redBlue = FOREGROUND_RED | BACKGROUND_BLUE; //暗紅字,暗藍並景 可以自己組合看看 WriteConsoleOutputAttribute( handle, &red, 1, p1, &dummy ); 把剛剛hello world!的h弄成亮紅色 剩下其他功能可以參考MSDN裡旁邊那排函數 其他的: 聲音: http://ppt.cc/Hu;~ BOOL WINAPI Beep( __in DWORD dwFreq, //頻率 __in DWORD dwDuration //時間,千分之一秒 ); Beep(440,1000); //中央A,1秒 華麗的開頭動畫: 參考 telnet://towel.blinkenlights.nl -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.121.198

12/11 23:45, , 1F
補充:清空螢幕可以用system("cls");
12/11 23:45, 1F

12/12 00:50, , 2F
在Linux清螢幕要用 clear?( ̄ー ̄;)
12/12 00:50, 2F

12/12 01:26, , 3F
用 system("cls") 會有閃爍問題,大多建議只更新變動處.
12/12 01:26, 3F

12/12 01:28, , 4F
12/12 01:28, 4F

12/12 02:13, , 5F
linux 清螢幕可以用控碼~~
12/12 02:13, 5F

12/12 09:17, , 6F
其實我覺得閃爍可以等東西生出來再想辦法解決
12/12 09:17, 6F

12/12 09:18, , 7F
何況全螢幕重繪本來就慢得要命
12/12 09:18, 7F

12/12 12:46, , 8F
推~ 專業教學文
12/12 12:46, 8F
文章代碼(AID): #1EvCxvFq (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EvCxvFq (C_and_CPP)