五子棋的规则就不用我说了吧,大家应该都玩过
今天,我来发一个鼠标操作的
函数使用须知
首先最重要的是这个函数:
头文件:windows.h
注意:请先将窗口属性调为插入模式(方便用这个函数):
1.右键点击
2.点击属性
3.只打开插入模式
4.点击确定(OK了)
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
ReadConsoleInput(hIn, &mouseRec, 1, &res);
CloseHandle(hOut); // 关闭标准输出设备句柄
CloseHandle(hIn); // 关闭标准输入设备句柄
//具体调用 mouseRec.。。。
mouseRec
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition; // 当前鼠标位置
DWORD dwButtonState; // 鼠标按钮状态
DWORD dwControlKeyState; // 键盘控制键状态
DWORD dwEventFlags; // 事件状态
} MOUSE_EVENT_RECORD;
//这个东西一般都在"INPUT_RECORD的变量名.Event.MouseEvent.以上变量"
示例代码
//我写的一个简单地例子
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
int main()
{
getch();
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
cout<<"**********\n** 开始 **\n**********\n";
while(1)
{
ReadConsoleInput(hIn, &mouseRec, 1, &res);//读取一个鼠标操作
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED&&mouseRec.Event.MouseEvent.dwMousePosition.X<10&&mouseRec.Event.MouseEvent.dwMousePosition.Y<3)//如果点击了
{
system("cls");
cout<<"加载中.";
Sleep(1000);
cout<<'.';Sleep(1000);
cout<<'.';Sleep(1000);
cout<<'.';Sleep(1000);
cout<<'.';Sleep(1000);break;
}
}
CloseHandle(hOut); // 关闭标准输出设备句柄
CloseHandle(hIn); // 关闭标准输入设备句柄
}
- 注意,在用这个函数前不能用system!!!
代码展示区 #1
好了接着上代码:
#include<cstdio>
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
int x[100]={3,7,11,15,19,23,27,31,35,39,43,47,51},y[100]={0,2,4,6,8,10,12,14,16,18,20,22,24},a[150][150];
int p1[500][500],p2[500][500],p1_i,p2_i;//p1白,p2蓝
const int _x=22,_y=5;
string s[2]={"黑棋","白棋"};
#define Ye SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
#define W SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
#define W1 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6f);
#define B SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_INTENSITY);
#define Bl SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x60);
void mapn(){
const int _x=13;
Ye;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);
for(int j=0;j<_x;++j){
cout<<" ";
for(int i=0;i<_x;++i)cout<<"╋ ";
cout<<endl<<" "<<endl;
}
W;
printf("**悔棋**\n鼠标操作,按鼠标左键放置,现在轮到");
B;
printf("黑棋");
}
void GotoXy(int x,int y){//x列,y行
HANDLE hout;
COORD coord;
coord.X=x;
coord.Y=y;
hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,coord);
}
void win(string s){
GotoXy(0,28);
cout<<s<<"WIN!\n";
W;
system("pause");
exit(0);
}
void clear(){
GotoXy(0,0);
for(int i=0;i<29;++i)cout<<" "<<endl;
GotoXy(0,0);
}
void find(int x_,int y_,bool &f,bool &d){
bool sss=1;
for(int i=0;i<13;++i)
for(int j=0;j<13;++j)
if(a[y[i]][x[j]]!=0){
sss=0;break;
}
if(x_>=0&&x_<=7&&y_==26&&!sss){
W;
GotoXy(8,26);
cout<<"1.是/0.否";
char c=getch();
if(c=='1'){
if(f==1){
p2_i--;
GotoXy(p2[p2_i][1],p2[p2_i][0]);
a[p2[p2_i][0]][p2[p2_i][1]+1]=0;
p2[p2_i][0]=p2[p2_i][1]=0;
}else if(f==0){
p1_i--;
GotoXy(p1[p1_i][1],p1[p1_i][0]);
a[p1[p1_i][0]][p1[p1_i][1]+1]=0;
p1[p1_i][0]=p1[p1_i][1]=0;
}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);cout<<"╋";
d=1;
}
GotoXy(8,26);
W;
cout<<" ";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);
Sleep(100);
return ;
}
bool t=0;
int h=0,l=-1;
for(int i=0;i<13;++i){
if(x_==x[i]||x_==x[i]+1||x_==x[i]-1){
h=x[i];
break;
}
}
for(int j=0;j<13;++j){
if(y_==y[j]&&a[y[j]][h]==0){
l=y[j];
break;
}
}
if(a[l][h]==0&&h!=0&&l!=-1){
GotoXy(h-1,l);
int js=0;
if(f==1){
p1[p1_i][0]=l;//y;
p1[p1_i][1]=h-1;//x;
p1_i++;
a[l][h]=1;
W1;
cout<<"●";
for(int i=0;i<13;++i){
if(a[l][x[i]]==1)js++;
else js=0;
if(js==5)win("白棋");
}
js=0;
for(int i=0;i<13;++i){
if(a[y[i]][h]==1)js++;
else js=0;
if(js==5)win("白棋");
}
for(int i=0;i<13;i++)
for(int j=0;j<13;j++){
if((a[y[i]][x[j]]!=0&&a[y[i]][x[j]]==1&&a[y[i+1]][x[j+1]]==1&&a[y[i+2]][x[j+2]]==1&&a[y[i+3]][x[j+3]]==1&&a[y[i+4]][x[j+4]]==1)||(a[y[i]][x[j+4]]!=0&&a[y[i]][x[j+4]]==a[y[i+1]][x[j+3]]&&a[y[i]][x[j+4]]==a[y[i+2]][x[j+2]]&&a[y[i]][x[j+4]]==a[y[i+3]][x[j+1]]&&a[y[i]][x[j+4]]==a[y[i+4]][x[j]]))win("白棋");
}
}else{
p2[p2_i][0]=l;//y;
p2[p2_i][1]=h-1;//x;
p2_i++;
js=0;
a[l][h]=2;
Bl;
cout<<"●";
for(int i=0;i<13;++i){
if(a[l][x[i]]==2)js++;
else js=0;
if(js==5)win("黑棋");
}
js=0;
for(int i=0;i<13;++i){
if(js==5)win("黑棋");
if(a[y[i]][h]==2)js++;
else js=0;
}
for(int i=0;i<13;i++)
for(int j=0;j<13;j++){
if((a[y[i]][x[j]]!=0&&a[y[i]][x[j]]==2&&a[y[i+1]][x[j+1]]==2&&a[y[i+2]][x[j+2]]==2&&a[y[i+3]][x[j+3]]==2&&a[y[i+4]][x[j+4]]==2)||(a[y[i]][x[j+4]]!=0&&a[y[i]][x[j+4]]==a[y[i+1]][x[j+3]]&&a[y[i]][x[j+4]]==a[y[i+2]][x[j+2]]&&a[y[i]][x[j+4]]==a[y[i+3]][x[j+1]]&&a[y[i]][x[j+4]]==a[y[i+4]][x[j]]))win("黑棋");
}
}d=1;
}else d=0;
}
void hide(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);
CursorInfo.bVisible = 0;
SetConsoleCursorInfo(handle, &CursorInfo);
}
void game(){
W;
cout<<" ********";
B;
cout<<"Gobang";
W;
cout<<"**********";
cout<<endl<<" 开始游戏"<<endl<<" 退出游戏"<<endl<<" 关于作者与帮助(必看)"<<endl<<endl;
Ye;
cout<<" *********请先调至插入模式*********";
}
void zz(){
cout<<"作者:Accteped\n优快云:https://blog.youkuaiyun.com/Accteped?spm=1000.2115.3001.5343\nQQ:暂无\n洛谷:Accteped,https://www.luogu.com.cn/user/368851\n这是作者第4个游戏";
cout<<endl<<"\n\n帮助:\n用鼠标点击下棋\n下面有悔棋标识,点击后输入1或0\n请将窗口调大,并调成插入模式,具体方法请看\nhttps://blog.youkuaiyun.com/Accteped/article/details/113341770\nHave a good time!";
getch();
clear();
}
int main(){
SetConsoleTitle("Gobang/五子棋");
hide();
game();
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
bool f1=0,f2=0,f3=0;
while(1){
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=19&&mouseRec.Event.MouseEvent.dwMousePosition.Y==1){
if(!f1){
f1=1;
GotoXy(12,1);
B;
cout<<"开始游戏";
}
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)break;
}else if(f1){
f1=0;
GotoXy(12,1);
W;
cout<<"开始游戏";
}
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=19&&mouseRec.Event.MouseEvent.dwMousePosition.Y==2){
if(!f2){
f2=1;
GotoXy(12,2);
B;
cout<<"退出游戏";
}if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
clear();
W;
cout<<"确定吗 1.是 0.否";
char cc=getch();
if(cc=='1'){
clear();
cout<<"退出成功\n";
system("pause");
exit(0);
}
clear();
game();
}
}else if(f2){
f2=0;
GotoXy(12,2);
W;
cout<<"退出游戏";
}
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=31&&mouseRec.Event.MouseEvent.dwMousePosition.Y==3){
if(!f3){
f3=1;
GotoXy(12,3);
B;
cout<<"关于作者与帮助(必看)";
}if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
clear();
W;
zz();
game();
}
}else if(f3){
f3=0;
GotoXy(12,3);
W;
cout<<"关于作者与帮助(必看)";
}
}
clear();
mapn();
bool b=0;
while(1){
Sleep(110);
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
int xs=mouseRec.Event.MouseEvent.dwMousePosition.X,ys=mouseRec.Event.MouseEvent.dwMousePosition.Y;
bool d=0;
find(xs,ys,b,d);
if(d==1){
if(b==0){
b=1;
W;
}
else{
b=0;
B;
}
GotoXy(34,27);
cout<<s[b];
}
bool sss=1;
for(int i=0;i<13;++i)
for(int j=0;j<13;++j)
if(a[y[i]][x[j]]==0){
sss=0;break;
}
if(sss){
clear();
cout<<"该局为和局\n";
system("pause");
exit(0);
}
}
}
}
代码展示区 #2
因为有些电脑的有些中文字符只占一格,所以会出现格式错乱
如果上一个不行,就试一下这个
#include<cstdio>
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
int x[100]={3,7,11,15,19,23,27,31,35,39,43,47,51},y[100]={0,2,4,6,8,10,12,14,16,18,20,22,24},a[150][150];
int p1[500][500],p2[500][500],p1_i,p2_i;//p1白,p2黑
const int _x=22,_y=5;
string s[2]={"黑棋","白棋"};
#define Ye SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
#define W SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
#define W1 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6f);
#define B SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_INTENSITY);
#define Bl SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x60);
void mapn(){
const int _x=13;
Ye;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);
for(int j=0;j<_x;++j){
cout<<" ";
for(int i=0;i<_x;++i)cout<<"╋ ";
cout<<endl<<" "<<endl;
}
W;
printf("**悔棋**\n鼠标操作,按鼠标左键放置,现在轮到");
B;
printf("黑棋");
}
void GotoXy(int x,int y){//x列,y行
HANDLE hout;
COORD coord;
coord.X=x;
coord.Y=y;
hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,coord);
}
void win(string s){
GotoXy(0,28);
cout<<s<<"WIN!\n";
W;
system("pause");
exit(0);
}
void clear(){
GotoXy(0,0);
for(int i=0;i<29;++i)cout<<" "<<endl;
GotoXy(0,0);
}
void find(int x_,int y_,bool &f,bool &d){
bool sss=1;
for(int i=0;i<13;++i)
for(int j=0;j<13;++j)
if(a[y[i]][x[j]]!=0){
sss=0;break;
}
if(x_>=0&&x_<=7&&y_==26&&!sss){
W;
GotoXy(8,26);
cout<<"1.是/0.否";
char c=getch();
if(c=='1'){
if(f==1){
p2_i--;
GotoXy(p2[p2_i][1],p2[p2_i][0]);
a[p2[p2_i][0]][p2[p2_i][1]+1]=0;
p2[p2_i][0]=p2[p2_i][1]=0;
}else if(f==0){
p1_i--;
GotoXy(p1[p1_i][1],p1[p1_i][0]);
a[p1[p1_i][0]][p1[p1_i][1]+1]=0;
p1[p1_i][0]=p1[p1_i][1]=0;
}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);cout<<"╋ ";
d=1;
}GotoXy(8,26);
W;
cout<<" ";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x6e);
Sleep(100);
return ;
}
bool t=0;
int h=0,l=-1;
for(int i=0;i<13;++i){
if(x_==x[i]||x_==x[i]+1||x_==x[i]-1){
h=x[i];
break;
}
}
for(int j=0;j<13;++j){
if(y_==y[j]&&a[y[j]][h]==0){
l=y[j];
break;
}
}
if(a[l][h]==0&&h!=0&&l!=-1){
GotoXy(h-1,l);
int js=0;
if(f==1){
p1[p1_i][0]=l;//y;
p1[p1_i][1]=h-1;//x;
p1_i++;
a[l][h]=1;
W1;
cout<<"● ";
for(int i=0;i<13;++i){
if(a[l][x[i]]==1)js++;
else js=0;
if(js==5)win("白棋");
}
js=0;
for(int i=0;i<13;++i){
if(a[y[i]][h]==1)js++;
else js=0;
if(js==5)win("白棋");
}
for(int i=0;i<13;i++)
for(int j=0;j<13;j++){
if((a[y[i]][x[j]]!=0&&a[y[i]][x[j]]==1&&a[y[i+1]][x[j+1]]==1&&a[y[i+2]][x[j+2]]==1&&a[y[i+3]][x[j+3]]==1&&a[y[i+4]][x[j+4]]==1)||(a[y[i]][x[j+4]]!=0&&a[y[i]][x[j+4]]==a[y[i+1]][x[j+3]]&&a[y[i]][x[j+4]]==a[y[i+2]][x[j+2]]&&a[y[i]][x[j+4]]==a[y[i+3]][x[j+1]]&&a[y[i]][x[j+4]]==a[y[i+4]][x[j]]))win("白棋");
}
}else{
p2[p2_i][0]=l;//y;
p2[p2_i][1]=h-1;//x;
p2_i++;
js=0;
a[l][h]=2;
Bl;
cout<<"● ";
for(int i=0;i<13;++i){
if(a[l][x[i]]==2)js++;
else js=0;
if(js==5)win("黑棋");
}
js=0;
for(int i=0;i<13;++i){
if(js==5)win("黑棋");
if(a[y[i]][h]==2)js++;
else js=0;
}
for(int i=0;i<13;i++)
for(int j=0;j<13;j++){
if((a[y[i]][x[j]]!=0&&a[y[i]][x[j]]==2&&a[y[i+1]][x[j+1]]==2&&a[y[i+2]][x[j+2]]==2&&a[y[i+3]][x[j+3]]==2&&a[y[i+4]][x[j+4]]==2)||(a[y[i]][x[j+4]]!=0&&a[y[i]][x[j+4]]==a[y[i+1]][x[j+3]]&&a[y[i]][x[j+4]]==a[y[i+2]][x[j+2]]&&a[y[i]][x[j+4]]==a[y[i+3]][x[j+1]]&&a[y[i]][x[j+4]]==a[y[i+4]][x[j]]))win("黑棋");
}
}d=1;
}else d=0;
}
void hide(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);
CursorInfo.bVisible = 0;
SetConsoleCursorInfo(handle, &CursorInfo);
}
void game(){
W;
cout<<" ********";
B;
cout<<"Gobang";W;
cout<<"**********";
cout<<endl<<" 开始游戏"<<endl<<" 退出游戏"<<endl<<" 关于作者与帮助(必看)"<<endl<<endl;
Ye;
cout<<" *********请先调至插入模式*********";
}
void zz(){
cout<<"作者:Accteped\n优快云:https://blog.youkuaiyun.com/Accteped?spm=1000.2115.3001.5343\nQQ:暂无\n洛谷:Accteped,https://www.luogu.com.cn/user/368851\n这是作者第4个游戏";
cout<<endl<<"\n\n帮助:\n用鼠标点击下棋\n下面有悔棋标识,点击后输入1或0\n请将窗口调大,并调成插入模式,具体方法请看\nhttps://blog.youkuaiyun.com/Accteped/article/details/113341770\nHave a good time!";
getch();
clear();
}
int main(){
SetConsoleTitle("Gobang/五子棋");
hide();
game();
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
INPUT_RECORD mouseRec;
DWORD res;
bool f1=0,f2=0,f3=0;
while(1){
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=19&&mouseRec.Event.MouseEvent.dwMousePosition.Y==1){
if(!f1){
f1=1;
GotoXy(12,1);
B;
cout<<"开始游戏";
}
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)break;
}else if(f1){
f1=0;
GotoXy(12,1);
W;
cout<<"开始游戏";
}
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=19&&mouseRec.Event.MouseEvent.dwMousePosition.Y==2){
if(!f2){
f2=1;
GotoXy(12,2);
B;
cout<<"退出游戏";
}if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
clear();
W;
cout<<"确定吗 1.是 0.否";
char cc=getch();
if(cc=='1'){
clear();
cout<<"退出成功\n";
system("pause");
exit(0);
}
clear();
game();
}
}else if(f2){
f2=0;
GotoXy(12,2);
W;
cout<<"退出游戏";
}
if(mouseRec.Event.MouseEvent.dwMousePosition.X>=12&&mouseRec.Event.MouseEvent.dwMousePosition.X<=31&&mouseRec.Event.MouseEvent.dwMousePosition.Y==3){
if(!f3){
f3=1;
GotoXy(12,3);
B;
cout<<"关于作者与帮助(必看)";
}if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
clear();
W;
zz();
game();
}
}else if(f3){
f3=0;
GotoXy(12,3);
W;
cout<<"关于作者与帮助(必看)";
}
}
clear();
mapn();
bool b=0;
while(1){
Sleep(110);
ReadConsoleInput(hIn, &mouseRec, 1, &res);
if(mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
int xs=mouseRec.Event.MouseEvent.dwMousePosition.X,ys=mouseRec.Event.MouseEvent.dwMousePosition.Y;
bool d=0;
find(xs,ys,b,d);
if(d==1){
if(b==0){
b=1;
W;
}
else{
b=0;
B;
}
GotoXy(34,27);
cout<<s[b];
}
bool sss=1;
for(int i=0;i<13;++i)
for(int j=0;j<13;++j)
if(a[y[i]][x[j]]==0){
sss=0;break;
}
if(sss){
clear();
cout<<"该局为和局\n";
system("pause");
exit(0);
}
}
}
}
总结
这个函数并不是很难,可以自行学习。
我相信,你也可以!
好了,代码都给你们了
来个三连呗
顺便帮忙转发一下吧
谢谢!
Then 一个团队