C++简单人机交互——走迷宫
程序员文章站
2022-03-12 16:33:20
...
一个简单的小方块走迷宫程序
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <string>
using namespace std;
class basic
{
public:
//不显示光标
void hide_cursor()
{
HANDLE h_GAME = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
GetConsoleCursorInfo(h_GAME,&cursor_info);
cursor_info.bVisible=false;
SetConsoleCursorInfo(h_GAME,&cursor_info);
}
//显示光标
void show_cursor()
{
HANDLE h_GAME = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
GetConsoleCursorInfo(h_GAME,&cursor_info);
cursor_info.bVisible=true;
SetConsoleCursorInfo(h_GAME,&cursor_info);
}
//光标移动到指定坐标处
void gotoxy(int x,int y)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
}
//在指定坐标处输出字符串
void outxy(int x,int y,string s)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
cout<<s<<endl;
}
//颜色
void color(int a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
};
class game:public basic
{
private:
int x,y,tt;
clock_t t,t2,t1,t3;
bool flag,flag2;
string b[25];
public:
game(int x0,int y0,int tt0)
{
x=x0;y=y0;
tt=tt0;
t=clock();
t2=clock();
flag=true;//两个初始化标志,防频闪
flag2=true;
}
void watch()
{
if(clock()-t3>60)
{
if(flag2==true)
{
gotoxy(66,0);
t2=clock()/1000;
// color(12);
cout<<"时间:"<<t2;
flag2=false;
}
if(clock()-t1>100)
{
flag2=true;
t1=clock();
}
t3=clock();
}
}
void bianjie()//打印出迷宫边界和初始界面
{
b[0]= "*********************************************";
b[1]= "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
b[2]= "■ ■ ■ ■ ■ ■";
b[3]= "■ ■ ■■■ ■ ■■■ ■ ■■■■■ ■ ■ ■ ■■■ ■■■■■■ ■";
b[4]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[5]= "■ ■■■■■ ■ ■ ■ ■ ■■■ ■ ■ ■ ■■■ ■ ■ ■■ ■ ■";
b[6]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[7]= "■ ■ ■■■ ■■■ ■ ■■■ ■■■ ■ ■■■ ■ ■■■■■ ■■ ■";
b[8]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[9]= "■ ■ ■ ■■■ ■■■■■ ■ ■ ■ ■ ■ ■■■ ■ ■ ■■■■ ■";
b[10]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[11]= "■ ■ ■ ■ ■■■■■ ■ ■ ■ ■ ■■■■■ ■ ■ ■ ■ ■■■";
b[12]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[13]= "■ ■■■ ■ ■ ■ ■■■ ■■■ ■ ■■■■■■■■■■■■ ■ ■ ■";
b[14]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[15]= "■ ■ ■■■■■■■■■ ■■■ ■ ■ ■■■■■ ■ ■ ■■■■ ■ ■";
b[16]= "■ ■ ■ ■ ■ ■ ■ ■ ■ ■";
b[17]= "■ ■■■■■■■■■ ■■■ ■■■■■ ■ ■■■■■ ■■■■■■■■ ■";
b[18]= "■ ■ ■ ■ ■ ■ ■ ■";
b[19]= "■■■■■ ■ ■■■■■ ■ ■ ■■■■■■■ ■ ■■■■■■■■■■ ■";
b[20]= "■ ■ ■ ■ ■■■";
b[21]= "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ * ";
b[22]= "*********************************************************************************";
b[23]= "放弃游戏:Esc "; //78
for(int i=0;i<25;i++)
{
gotoxy(0,i);
// color(10);
cout<<b[i];
}
}
void draw()//画小方块
{
gotoxy(x,y);
// color(13);
cout<<"◆";
}
void erase()//擦除
{
gotoxy(x,y);
cout<<" ";
}
void move()//小方块移动(擦画结合)
{
if(flag==true)
{
draw();
flag=false;
}
if(clock()-t>tt)//接收键盘信号不要太过于频繁
{
if(GetAsyncKeyState(VK_ESCAPE)) //退出
exit(0);
if(GetAsyncKeyState(VK_LEFT))//左
{
erase();
if(b[y][x-1]==' ')
--x;
else
x=x;
draw();
}
if(GetAsyncKeyState(VK_RIGHT))//右
{
erase();
if(b[y][x+2]==' ')
++x;
else if(b[y][x+2]=='*')
{
system("cls");
color(12);
gotoxy(28,12);
cout<<"你赢了"<<endl;
exit(0);
}
else
x=x;
draw();
}
if(GetAsyncKeyState(VK_UP))//上
{
erase();
if(b[y-1][x]==' '&&b[y-1][x+1]==' ')
--y;
else
y=y;
draw();
}
if(GetAsyncKeyState(VK_DOWN))//下
{
erase();
if(b[y+1][x]==' '&&b[y+1][x+1]==' ')
++y;
else
y=y;
draw();
}
flag=true;
t=clock();
}
}
};
void main()
{
game g(2,2,60);
g.bianjie();
while(true)
{
g.move();
g.watch();
}
// system("pause");
}
在控制台上运行应该是这样的 :
上面的颜色可以自行修改,直接使用color()函数就可以,不过还是把控制台调成黑色的再上颜色看着比较舒服些。