
我之前给别人写过一个打地鼠的小游戏,就是用鼠标 *** 作的。发给你参考下。代码很简单。
主要函数我在下方说明了,但更多信息你必须自己百度看,一言两语说不完。
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;
}
ret_val=fgets(st,n,stdin); 从标准输入设备读入一行字符,含换行符。若拍入字符个数多于需要,则 st[] 最后一个字符 为 '\0'
---
若拍入字符个数多于需要,才会 进入
while(getchar()!='\n') continue;
这句中的 continue 有或没有是 一样 的, 也就是说用:
while(getchar()!='\n') ; 是一样的。
这句的作用 相当于 清掉 拍入的多余的字符,直到遇到 换行符。
例如: n=5;
拍入 12345678换行。
fgets 读入 1234 到st[], st[4]='\0'
getchar() 依次读去 5 6 7 8 换行 -- 循环了5次。
你的问题 大概 指 这件事。 continue 从st[] 尾开始。
C语言里面有gotoxy(x,y)函数来定位光标位置;
但在VC下面没有conioh,也就没有gotoxy(),只在tc,bc中才有
下面是别人构造的一个:
include<windowsh>
#include<iostream>
using namespace std;
void gotoxy(int x, int y) {
COORD c;
cX = x - 1;
cY = y - 1;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
int main()
{
gotoxy(20,12);
std::cout<<"Hello world!"<<endl;
return 0;
}
其中的COORD和SetConsoleCursorPosition定义在winconh中~
SetConsoleCursorPosition用于在相应的设备设置光标的位置,两个参数分别是设备句柄和光标位置结构。GetStdHandle定义在winbaseh上用于获得标准输入、输出、错误输出句柄
当参数标识为STD_OUTPUT_HANDLE时获得标准输出句柄
这里应该是棋盘坐标系和屏幕坐标系之间的映射(转换)
下面属于猜测:
屏幕坐标系(原点1,1):
+---------------->y
|
|
v
x
棋盘坐标系(原点0,0):
y
^
|
|
|
+------------------x
以上就是关于C语言鼠标 *** 作全部的内容,包括:C语言鼠标 *** 作、请帮忙解读下C语言下面代码中continue 的光标在哪儿 是在输入的第一个字符 还是st[i]、C语言问题: DOS光标定位!!!在线等!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)