
楼主你好!你是不是发现,每次运行完之后,光标
都会回到首行第一个位置?
原因很简单!
if(in[i]=='\r')
{
in[i+1]='\0';
break;
}
这段代码的问题!因为你把'\r'存入了in[i]之中了!'\r'就是回到该行的第一位置的作用!
如果你可以这样验证,把上面这段代改为下面
if(in[i]=='\r')
{
in[i]='\0';
break;
}
把那个'\r'用'\0'覆盖掉,这样输出的时候,光标就不会回到该行的第一个位置了!我个人认为getch()没什么注意的!因为这个函数
不怎么使用!
大概大学作业里面,叫你写简单的什么密码登陆之类的用到,其他我感觉我不怎么用到!
希望我的回答对你有帮助!
我之前给别人写过一个打地鼠的小游戏,就是用鼠标 *** 作的。发给你参考下。代码很简单。
主要函数我在下方说明了,但更多信息你必须自己百度看,一言两语说不完。
SetConsoleCursorPosition函数可以定位光标位置,也就是文字内容显示的起点。
ReadConsoleInput(HANDLE hConsoleInput,INPUT_RECORD lpBuffer,DWORD nLength,
DWORD lpNumberOfEventsRead)函数可以获取鼠标的 *** 作信息。
调用过上面函数后,lpBuffer由于是传址,所以其地址里的值就包含了鼠标信息。
lpBufferEventType == MOUSE_EVENT //判断是鼠标事件
lpBufferEventMouseEventdwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//判断是鼠标左键点击
两个判断一起就是鼠标左键点击的判断,其他事件参数你可以自己网上找。#include <stdioh>
#include <stdlibh>
#include <windowsh>
#include <conioh>
#include <timeh>
#include <stringh>
#include <malloch>
#define gSizek 30//区域大小宽度
#define gSizeg 20//区域大小高度
#define gBegin 3//活动区域起始行
int main()
{
int t=0,s0,s1,i,j,count=0,fen=0,row=0,clo=0;
char gameA[gSizeg][gSizek+1],fSave[10]={0};
SetConsoleTitle("打地鼠");
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
INPUT_RECORD inRec;
DWORD res;
COORD p0;
p0X=0;
p0Y=0;
srand(time(0));
s0= time(NULL);
strcpy(gameA[0]," GAME");
strcpy(gameA[1],"未命中次数:0,计分:000000");
for(i=gBegin-1;i<gSizeg;i++)
{
for(j=0;j<gSizek+1;j++)
{
if(i>gBegin-1 && i<gSizeg-1 && j>0 && j<gSizek-1)
gameA[i][j]=' ';
else
gameA[i][j]=4;
if(j==gSizek)
gameA[i][j]=0;
}
}
for(i=0;i<gSizeg;i++)
printf("%s\n",gameA[i]);
while (1)
{
if(t>=3)
{
if(row>0 && clo>0)
gameA[row][clo]=' ';
row=rand()%(gSizeg-1);
clo=rand()%(gSizek-1);
s0= time(NULL);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
if(row<3)
row=4;
if(clo<1)
clo=1;
gameA[row][clo]=2;
for(i=0;i<gSizeg;i++)
{
//gameA[i][gSizeg+1]=0;
printf("%s\n",gameA[i]);
}
}
if(count==3)
{
p0X=10;
p0Y=8;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
printf("GAME OVER!");
break;
}
s1= time(NULL);
t=s1-s0;
ReadConsoleInput(hInput, &inRec, 1, &res);
if (inRecEventType == MOUSE_EVENT && inRecEventMouseEventdwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
{
if(inRecEventMouseEventdwMousePositionX==clo && inRecEventMouseEventdwMousePositionY==row)
{
if(fen==0)
fen=1;
if(fen>999999)
fen=999999;
else
fen=fen2;
sprintf(fSave,"%06d",fen);
gameA[1][18]=0;
strcat(gameA[1],fSave);
}
else
{
count++;
fen=0;
gameA[1][11]=count+'0';
}
t=4;
}
}
while(1);
return 0;
}
一、屏幕 *** 作函数
1 clrscr()清除字符窗口函数
2 window()字符窗口函数
3 gotoxy()光标定位函数
4 clreol() 清除光标行尾字符函数
5 insline() 插入空行函数
6 delline() 删除一行函数
7 gettext() 拷进文字函数
8 puttext() 拷出文字函数
9 movetext() 移动文字函数
二、字符属性函数
10 textmode() 文本模式函数
11 highvideo()高亮度函数
12 lowvideo() 低亮度函数
13 normvideo(void);
14 textcolor() 文本颜色函数
15 textattr() 文本属性函数
16textbackground() 文本背景函数
三、 屏显状态函数 17 wherex() 光标处x坐标
函数
18 wherey() 光标处y坐标函数
19 gettextinfo() 获取文本窗口信息函数
2 window()字符窗口函数
功能: 函数window()用于在指定位置建立一个字符窗口。
用法: 此函数调用方式为 void window(int left,int top,int right,int bottom);
说明: 函数中参数left,top为窗口左上角坐标;right,bottom为其右下角坐标。
若有一个坐标是无效的,则window()函数不起作用。一旦该函数调用成功,那么所有定位坐标都是相对于窗口的,而不是相对于整个屏幕。但是建立窗口所用的坐标总是相对整个屏幕的绝对坐标,而不是相对当前窗口的相对坐标。这样用户就可以根据各种需要建立多个互不嵌套的窗口。
此函数的头文件为conioh。
返回值:无
例: 调用这个函数的实现例见3gotoxy()函数的例子中。
gotoxy()光标定位函数
功能: 函数gotoxy()将字屏幕上的光标移到当前窗口指定的位置上。
用法: 这个函数调用方式为void gotoxy(int x,int y);
说明: 括号里x,y是, 光标定位的坐标,如果其中一个坐标值无效(如坐标超界),那么光标不会移动。
此函数在字符状态(有时称为文本状态)下经常用到 ,其相应的头文件为conioh
返回值:无
例: 下面程序建立两个窗口,然后在窗口里显示字符,字符的位置是调用该函数确定的。
#include"conioh>
void border(int startx,int starty,int endx,int endy)
{
register int i;
gotoxy(1,1);
for(i=0;i<=endx-startx;i++)
putch('-');
gotoxy(1,endy-starty);
for(i=0;i<=endx-startx;i++)
putch('-');
for(i=2;i<=endy-starty;i++){
gotoxy(1,i);
putch('1');
gotoxy(endx-startx+1,i);
putch('1');
}
}
main()
{
void border(int,int,int,int);
clrscr();
window(6,8,38,12);
border(6,8,38,12);
gotoxy(2,2);
printf("window 1");
window(8,16,40,24);
border(8,16,40,24);
gotoxy(3,2);
printf("window 2");
getch();
}
三、 屏显状态函数
这里提供三个在文本模式下屏幕显示状态的函数
17 wherex() 光标处x坐标函数
功能: 函数wherex()返回当前窗口中光标处横向坐标。
用法: 此函数调用方式为int wherex(void);
说明: 这个函数调用无参数,其对应的头文件是conioh
返回值: 函数调用成功,返回光标处x坐标值。
例: 调用这个函数的实例见18wherey()函数的例中。
18 wherey() 光标处y坐标函数
功能: 函数wherey()返回当前窗口中光标处纵向坐标。
用法: 该函数调用方式为int wherey(void);
说明: 此函数调用无参数,其相应的头文件是conioh
返回值: 函数调用成功,返回光标处y坐标值。
例: 调作函数wherex()与wherey(),返回当前光标处x坐标与y坐标,并赋给整型变量xpos ,ypos。
int xpos,ypos;
xpos=wherex();
ypos=wherey();
19 gettextinfo() 获取文本窗口信息函数
功能: 函数gettextinfo()获取当前文本窗口信息,并存放在实参结构中。
用法: 函数调用方式为void gettextinfo(struct text-info info);
说明: 函数中参数info 为struct text-info结构型指针,struct text-info结构在此函数相应的头文件中定义为:
struct text-info{
unsigned char winleft; // 窗口左上角x坐标
unsigned char wintop; // 窗口左上角y坐标
unsigned char winright; // 窗口右下角x坐标
unsigned char winbottom; // 窗口右下角y坐标
unsigned char attribute; // 文本属性
unsigned char normattr; // 正常属性
unsigned char currmode; // 当前屏显模式
unsigned char screenhight // 文本窗口高度(以行数计)
unsigned char screenwidth; // 文本窗口宽度(以字符个数计)
unsigned char curx; // 光标处x坐标
unsigned char cury; // 光标处y坐标
};
记住,调用函数gettextinfo()时,要传递struct text-info结构型指针或该结构的首地址,不要传递结构变量本身。
这个函数对应的头文件是conioh
返回值: 返回文本窗口角点坐标、高宽度、文本属性等值,并存放在info所指向的结构变量中。
例: 程序语句说明如何正确调用gettextinfo()函数:
struct text-info win-status;
gettextinfo(&win-status);
CROOD就是这样的一个玩意:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, PCOORD;
很明显这个结构可以用来记录坐标
GetStdHandle()函数获得标准输入输出的句柄,参数STD_OUTPUT_HANDLE是个宏,代表标准输出,可以看作显示器
SetConsoleCursorPosition(hout,coord); 看函数名称:设置控制台光标坐标,参数就是设备句柄,坐标,那么把标准输出的句柄传给函数,就可以把光标定位在对应的位置了(左上角位置是0,0然后向左 向下延伸)
下面这段代码可以在屏幕第10行第30列输出"Hello world"
#include <windowsh>
#include <iostream>
using namespace std;
int main()
{
HANDLE hout;
COORD coord;
coordX=30;
coordY=10;
hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,coord);
cout<<"Hello world!\n";
return 0;
}


评论列表(0条)