方向鍵應用
方向鍵在編輯上或遊戲上用到非常多,在console mode文字底下,顯示區域是25列×80行。
座標表示(,),左上角是(0,0),左下角是(0,24),右上角是(79,0),右下角是(79,24)。
往下移動列數加1,往右移動行數加1。
本範例只需要使用到一個能隨意控制座標的函數,在Turbo C/C++,Borland C++中有gotoxy()可
以使用,在VC上就沒有提供了,但作者幫你寫了一個,不過只能在VC中使用:
	::::::::::::::::::::::::::::::::::::::::::::::
	//Version:Visual C++ 6.0
	//引入#include<windows.h>
	//x表示行值;y表示列值
	void gotoxy(int x, int y)
	{
	 	COORD point;
		point.X = x; point.Y = y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
	}
	::::::::::::::::::::::::::::::::::::::::::::::
雖然這篇文章只需要以上這一個函數,不過作者寫了幾個函數供大家參考:
	::::::::::::::::::::::::::::::::::::::::::::::
	//Version:Visual C++ 6.0
	//控制螢幕游標顯示
	//引入#include<windows.h>
	//_bVisibleTRUE表示顯示游標;FALSE表示隱藏游標
	//CCI.dwSize:表示游標的大小佔字元的百分之幾,一般是25%。不懂意思的話,
	//CCI.bVisibleTRUE,然後CCI.dwSize050100,你就曉得囉!!!
	void SetCursorVisible(BOOL _bVisible,DWORD _dwSize)
	{
		CONSOLE_CURSOR_INFO CCI;
		CCI.bVisible = _bVisible;
		CCI.dwSize = _dwSize;
		SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&CCI);
	}
	::::::::::::::::::::::::::::::::::::::::::::::
Turbo C/C++Borland C/C++也有控制螢幕游標顯示,資訊如下:
	::::::::::::::::::::::::::::::::::::::::::::::
	引入#include<conio.h> 

	函數void _setcursortype(int cur_t);

	Description
	Selects cursor appearance.
	Sets the cursor type to

	_NOCURSOR 		Turns off the cursor
	_NORMALCURSOR 	Normal underscore cursor
	_SOLIDCURSOR 		Solid block cursor

	Note: Do not use this function for Win32s or Win32 GUI applications.
	::::::::::::::::::::::::::::::::::::::::::::::
組語也介紹一下:
	::::::::::::::::::::::::::::::::::::::::::::::
	//由程式火鍋寢室聯誼社的Lord_Jerry提供
	Show Mouse Cursor:
	mov ax, 1
	int 33h

	Hide Mouse Cursor:
	mov ax, 2
	int 33h
	::::::::::::::::::::::::::::::::::::::::::::::

取得目前座標值:
	::::::::::::::::::::::::::::::::::::::::::::::
	//Version:Visual C++ 6.0
	//引入#include<windows.h>
	//假設cx,cy是用來取目前座標值的變數,利用這個函數的方式就是:
	//getxy(&cx,&cy);
	void getxy(int *x,int *y)
	{
		CONSOLE_SCREEN_BUFFER_INFO csbi; 
		GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); 
		*x = csbi.dwCursorPosition.X;
		*y = csbi.dwCursorPosition.Y;
	}
	::::::::::::::::::::::::::::::::::::::::::::::
Turbo C/C++也有函數可以取得座標值:
	::::::::::::::::::::::::::::::::::::::::::::::
	wherex():取得目前游標水平位置的座標值
	
	wherey():取得目前游標垂直位置的座標值
	::::::::::::::::::::::::::::::::::::::::::::::
來看一個程式:
	::::::::::::::::::::::::::::::::::::::::::::::
	//Visual C++ 6.0
	#include <stdio.h>
	#include <conio.h>
	#include <windows.h>

	#define ESC	27
	#define DIRECTION_KEYBOARD	224
	#define UP     72
	#define DOWN   80
	#define LEFT   75
	#define RIGHT  77

	void gotoxy(int x, int y)
	{
	 	COORD point;
		point.X = x; point.Y = y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
	}

	void SetCursorVisible(BOOL _bVisible,DWORD _dwSize)
	{
		CONSOLE_CURSOR_INFO CCI;
		CCI.bVisible = _bVisible;
		CCI.dwSize = _dwSize;
		SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&CCI);
	}

	void main()
	{
		unsigned short int ch1,ch2;
		unsigned short int X=0,Y=0;
	
		SetCursorVisible(TRUE,100);	
	
		gotoxy(50,20);
		printf("*");
		gotoxy(0,0);
	
		while(1)
		{
			ch1 = getch();
			if(ch1 == ESC)
				break;
			else if(ch1 == DIRECTION_KEYBOARD)
			{
				ch2 = getch();
				switch(ch2)
				{
					case UP:
						if( Y==0)
							break;
						gotoxy(X,--Y);
						break;
					case DOWN:
						if( Y==24 )
							break;
						gotoxy(X,++Y);
							break;
					case LEFT:
						if( X==0 )
							break;
						gotoxy(--X,Y);
						break;
					case RIGHT:
						if( X==79)
							break;
						gotoxy(++X,Y);
						break;
				}
				if(X==50 && Y==20)
				{
					system("CLS");
					printf("You got it!!!\n");
					break;
				}
			}
	
		}
			
	}
	::::::::::::::::::::::::::::::::::::::::::::::
先將游標變成  ,在座標(50,20)處,印'*',然後進入迴圈之中,若按ESC鍵,此程式結束。
若按方向鍵時,游鍵將做上下左右移動,若超過邊界時,則不動作,直到吃到'*',則螢幕清除
,顯示文字。這是一個遊戲基本的概念,你可以有樣學樣寫井字遊戲、貪蛇食、打地鼠…等。
祝你成功囉!!!
回目錄
Written By James On 2004/02/08 
Hosted by www.Geocities.ws

1