方向鍵在編輯上或遊戲上用到非常多,在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>
//_bVisible:TRUE表示顯示游標;FALSE表示隱藏游標
//CCI.dwSize:表示游標的大小佔字元的百分之幾,一般是25%。不懂意思的話,
//把CCI.bVisible設TRUE,然後CCI.dwSize設0、50、100,你就曉得囉!!!
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