海豚号码生成器,下载,能够在佰渡搜一下后面名字即可。
它除了具备多种生成号码的性能(随机、连号、自定义),
还有批量把号码一键导入手机通讯录,芜杂文本提取等性能,
号码排版打印,号码综合整顿(分批、查归属地、三网拆散、按城市分类等)。
—————- 分割线 ————–
class Console
{
public:
Console()
{hinput_ = GetStdHandle( STD_INPUT_HANDLE);
houtput_ = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(hinput_, &mode_);
COORD curpos = GetCursorPosition();
lefttop_ = COORD{0, SHORT(curpos.Y+(curpos.X>0)) };
}
~Console()
{SetConsoleMode( hinput_, mode_);
ShowCursor(true);
}
void ShowCursor(bool bShow)
{
CONSOLE_CURSOR_INFO cursor;
GetConsoleCursorInfo(houtput_, &cursor);
cursor.bVisible = bShow;
SetConsoleCursorInfo(houtput_, &cursor);
}
void EnableQuickEditMode(bool bEnabled)
{
DWORD mode;
GetConsoleMode(hinput_, &mode);
if(bEnabled && (mode&ENABLE_QUICK_EDIT_MODE)==0 )
SetConsoleMode(hinput_, mode|ENABLE_QUICK_EDIT_MODE);
else if(!bEnabled && (mode&ENABLE_QUICK_EDIT_MODE)!=0 )
SetConsoleMode(hinput_, mode&~ENABLE_QUICK_EDIT_MODE);
}
void EnableMouseInput(bool bEnabled)
{
DWORD mode;
GetConsoleMode(hinput_, &mode);
if(bEnabled && (mode&ENABLE_MOUSE_INPUT)==0 )
SetConsoleMode(hinput_, mode|ENABLE_MOUSE_INPUT);
else if(!bEnabled && (mode&ENABLE_MOUSE_INPUT)!=0 )
SetConsoleMode(hinput_, mode&~ENABLE_MOUSE_INPUT);
}
bool GetInputEvent(INPUT_RECORD& record)
{
DWORD n;
if(ReadConsoleInput(hinput_,&record,1,&n) && n==1 )
{if( record.EventType == MOUSE_EVENT)
{
record.Event.MouseEvent.dwMousePosition.X -= lefttop_.X;
record.Event.MouseEvent.dwMousePosition.Y -= lefttop_.Y;
}
return true;
}
return false;
}
COORD GetCursorPosition(void) const
{
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
GetConsoleScreenBufferInfo(houtput_, &ScreenBufferInfo);
return ScreenBufferInfo.dwCursorPosition;
}
void SetCursorPosition(SHORT rx, SHORT ry)
{SetConsoleCursorPosition( houtput_, COORD{SHORT(lefttop_.X+rx),SHORT(lefttop_.Y+ry)} );
}
template<typename T> void Output(SHORT rx, SHORT ry, const T& t, WORD wAttribute=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED)
{
std::ostringstream os;
os << t;
Output(rx, ry, std::string_view(os.str()), wAttribute );
}
void Output(SHORT rx, SHORT ry, const std::string_view& sv, WORD wAttribute=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED)
{COORD coord = {SHORT(lefttop_.X+rx),SHORT(lefttop_.Y+ry)};
DWORD n;
WriteConsoleOutputCharacterA(houtput_, sv.data(), (DWORD)sv.size(), coord, &n);
FillConsoleOutputAttribute(houtput_, wAttribute, n, coord, &n);
}
void Output(SHORT rx, SHORT ry, char ch, WORD wAttribute=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED)
{Output( rx, ry, std::string_view{&ch,1}, wAttribute );
}
private:
HANDLE hinput_;
HANDLE houtput_;
DWORD mode_;
COORD lefttop_;
};
class Chess
{
public:
Chess(SHORT row, SHORT col) : row(row), col(col), buf(row*col,EMPTY)
{csl.ShowCursor( false);
csl.EnableMouseInput(true);
csl.EnableQuickEditMode(false);
csl.SetCursorPosition(0,row+1+2);
}
~Chess()
{
}
void PrintBoard()
{for( SHORT c=0; c!=col; ++c)
csl.Output(2*c+0, 0, c+1);
for(SHORT r=0; r!=row; ++r)
csl.Output(2*col+0, r+1, r+1);
for(SHORT i=0; i!=row*col; ++i)
PrintSingle(i%col, i/col);
csl.Output(0, row+2, "X", FOREGROUND_RED|FOREGROUND_INTENSITY);
csl.Output(1, row+2, "--- quit");
}
void PrintSingle(SHORT x, SHORT y)
{
const char* p;
switch(buf[y*col+x] )
{
default: p="·"; break;
case USER_A: p="●"; break;
case USER_B: p="○"; break;
}
csl.Output(x*2, y+1, p);
}
void Run()
{PrintBoard();
State user = USER_B;
for(INPUT_RECORD record; csl.GetInputEvent(record); )
{if( record.EventType == MOUSE_EVENT)
{if( record.Event.MouseEvent.dwEventFlags==0 && record.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) // 鼠标不挪动 且 左键下压
{
COORD pos = record.Event.MouseEvent.dwMousePosition;
if(pos.X>=0 && pos.X<2*col && pos.Y>=1 && pos.Y<1+row)
{
SHORT r = pos.Y-1;
SHORT c = pos.X/2;
if(buf[r*col+c] == EMPTY )
{
user = user==USER_A ? USER_B : USER_A;
buf[r*col+c] = user;
PrintSingle(c, r);
}
}
else if(pos.X==0 && pos.Y==row+2) // quit
break;
}
}
}
}
private:
Console csl;
SHORT row, col;
enum State {EMPTY=0, USER_A, USER_B};
std::vector<State> buf;
};
int main(void)
{
Chess a(20, 20);
a.Run();
return 0;
}