65,210
社区成员
发帖
与我相关
我的任务
分享
/**
* @Title 老鼠走迷宫的拓展探究
* @Author 孙琨
* @Date 2013-11-16
* @At XUST
* @All Copyright by 孙琨
*
*/
#include <iostream>
using namespace std;
int maze[9][9] = { // 初始化迷宫,英文maze为“迷宫”
{2,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,0,0,2},
{2,0,2,2,0,2,2,0,2},
{2,0,2,0,0,2,0,0,2},
{2,0,2,0,2,0,2,0,2},
{2,0,0,0,0,0,2,0,2},
{2,2,0,2,2,0,2,2,2},
{2,0,0,0,0,0,0,0,2},
{2,2,2,2,2,2,2,2,2}
};
int startI = 1,startJ = 1; // 入口行列坐标
int endI = 7,endJ = 7; // 出口行列坐标
void visit(int i,int j) // 自动搜寻路径
{
int m,n;
maze[i][j] = 1;
if((i == endI) && (j == endJ))
{
cout << endl << "显示路径:" << endl;
for(m=0; m<9; m++)
{
for(n=0; n<9; n++)
{
if(maze[m][n] == 2)
cout << "■";
else if(maze[m][n] == 1)
cout << "♀";
else
cout << " ";
}
cout << endl;
}
}
if(maze[i][j+1] == 0)
visit(i,j+1);
if(maze[i+1][j] == 0)
visit(i+1,j);
if(maze[i][j-1] == 0)
visit(i,j-1);
if(maze[i-1][j] == 0)
visit(i-1,j);
maze[i][j] = 0;
}
int main(void)
{
int i,j;
cout << "显示迷宫: " << endl;
for(i=0; i<9; i++)
{
for(j=0; j<9; j++)
{
if(maze[i][j] == 2)
cout << "■" ;
else
cout << " " ;
}
cout << endl;
}
visit(startI,startJ);
return 0;
}
#include <conio.h>
#include <windows.h>
void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
DWORD count;
COORD coord = {x, y};
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hStdOut, coord);
WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}
void HideTheCursor()
{
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleCursorInfo(hStdOut, &cciCursor))
{
cciCursor.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
void ShowTheCursor()
{
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleCursorInfo(hStdOut, &cciCursor))
{
cciCursor.bVisible = TRUE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
void GetWH(int *w,int *h) {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {
*w=csbi.srWindow.Right;
*h=csbi.srWindow.Bottom;
} else {
*w=80;
*h=25;
}
}
void ClearConsole()
{
//Get the handle to the current output buffer...
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
//This is used to reset the carat/cursor to the top left.
COORD coord = {0, 0};
//A return value... indicating how many chars were written
// not used but we need to capture this since it will be
// written anyway (passing NULL causes an access violation).
DWORD count;
//This is a structure containing all of the console info
// it is used here to find the size of the console.
CONSOLE_SCREEN_BUFFER_INFO csbi;
//Here we will set the current color
if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
{
//This fills the buffer with a given character (in this case 32=space).
FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
//This will set our cursor position for the next print statement.
SetConsoleCursorPosition(hStdOut, coord);
}
}
int main() {
unsigned short k;
int x,y,w,h;
SetConsoleOutputCP(437);
ClearConsole();
GetWH(&w,&h);
x=w/2;y=h/2;
HideTheCursor();
ConPrintAt(x,y,"\xdb",1);
while (1) {
Sleep(50);
k=getch();
if (27==k) break;//按Esc键退出
if (0==k||0xe0==k) k|=getch()<<8;//非字符键
switch (k) {
case 0x48e0:case 0x04800://上
if (y>0) {
ConPrintAt(x,y," ",1);
y--;
ConPrintAt(x,y,"\xdb",1);
}
break;
case 0x50e0:case 0x05000://下
if (y<h) {
ConPrintAt(x,y," ",1);
y++;
ConPrintAt(x,y,"\xdb",1);
}
break;
case 0x4be0:case 0x04b00://左
if (x>0) {
ConPrintAt(x,y," ",1);
x--;
ConPrintAt(x,y,"\xdb",1);
}
break;
case 0x4de0:case 0x04d00://右
if (x<w-1) {
ConPrintAt(x,y," ",1);
x++;
ConPrintAt(x,y,"\xdb",1);
}
break;
}
// cprintf("%04x pressed.\r\n",k);
}
ClearConsole();
ShowTheCursor();
return 0;
}