繁忙学习之余,编个小软件玩玩~
本人利用C++编写了一个还算完整的动画编辑软件(就是一个cpp文件),
编得还算成功,所以写个博客班门弄斧分享分享~
名为“Manexe”
源代码如下
#include<conio.h>
#include<bits/stdc++.h>
#include<windows.h>
#include<ctime>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//KEY_DOWN(MOUSE_MOVED)
using namespace std;//GetCursorPos(&p)
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
//GetAsyncKeyState('W') & 0x8000
double x,y;
inline void gt(int y,int x){
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
inline void getAddofMouse() {
/**/POINT pt;HWND h=GetForegroundWindow(); GetCursorPos(&pt); ScreenToClient(h,&pt);
/**/x=double(pt.y)/16,y=double(pt.x)/8;
/**/return;
}
int n=1,k=1,cl=15;
bool dl=1;
struct exe{
int ki,xi,yi,c1,c2;
exe(){}
exe(int K,int X,int Y,int C,int Cl){
ki=K,xi=X,yi=Y,c1=C,c2=Cl;
}
};
vector<exe>fl;
int m;
struct itn{int dc[25][55];itn(){memset(dc,0,sizeof(dc));}};
vector<itn>v;
inline int read(){
int x=0;char s=getchar();
while(s<'0'||s>'9')s=getchar();
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x;
}
inline void write(int nm){
int u=0;
bool op=0;
for(int i=5;i>=0;i--){
u=nm/int(pow(10,i));
nm%=int(pow(10,i));
if(u>0)op=1;
if(op)putchar(char(u+48));
}
if(!op)putchar('0');
}
string c="Untitled.txt";
inline void putt(){
gt(20,0);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
puts("eraser");
gt(20,6);
for(int i=1;i<=15;i++){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),i*16);
putchar(' ');
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
puts("o打开 s保存 d删除当前页 r运行 c复制");
for(int i=1;i<=5+cl;i++)putchar(' ');
puts("^ ");
gt(0,50);
puts("页数");
gt(0,54);write(n);
puts(" ");
gt(1,50);
write(k);
puts("页 ");
gt(2,50);
puts("文件:");
gt(2,55);
puts(c.c_str());
gt(2,55+c.size());
puts(" ");
gt(10,50);
puts("z撤销 y重做");
gt(11,50);
puts("/、*换颜色(橡皮)");
gt(12,50);
puts("+、-翻下一/上一页");
gt(14,50);
int ui=14;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),ui);
puts(".............");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(15,50);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12);
puts("2019新年快乐!");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(16,50);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),ui);
puts("'''''''''''''");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
}
inline void getf(){
freopen(c.c_str(),"r",stdin);
if(scanf("%d",&n)==1){
v.clear();
k=1;
for(int o=0;o<n;o++){
itn vi;
for(int i=1;i<=20;i++)
for(int j=1;j<=50;j++)
vi.dc[i][j]=read();
v.push_back(vi);
}
}
else n=1;
freopen("CON","r",stdin);
return;
}
inline void putf(){
freopen(c.c_str(),"w",stdout);
write(n);
putchar('\n');
for(int o=0;o<n;o++){
for(int i=1;i<=20;i++){
for(int j=1;j<=50;j++)write(v[o].dc[i][j]),putchar(' ');
putchar('\n');
}
}
freopen("CON","w",stdout);
//exit(0);
return;
}
inline void puta(){
gt(0,0);
for(int i=1;i<=20;i++){
for(int j=1;j<=50;j++){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),v[k-1].dc[i][j]*16);
putchar(' ');
}
putchar('\n');
}
}
inline void run()
{
int u=k;
for(k=1;k<=n;k++){
puta();
Sleep(80);
}
k=u;
puta();
return;
}
int main()
{
v.push_back(itn());
fl.push_back(exe(1,0,0,0,0));
while(1){
if(dl)dl=0,putt();
if(kbhit()){
char cc;
cc=getch();
if(cc=='o'){
char ss[20];
gt(22,0);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
putchar('n'),putchar('a'),putchar('m'),putchar('e'),putchar(':');
gets(ss);
gt(22,0);
for(int i=1;i<=20;i++)putchar(' ');
c=ss;
c+=".txt";
getf();
dl=1;
puta();
}
if(cc=='s'){
gt(22,0);
putchar(' ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
putf();
gt(22,0);
}
if(cc=='d'){
n--;
if(n>0)v.erase(v.begin()+k-1,v.begin()+k);
n=max(n,1);
k=min(n,k);
putt();
puta();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
putchar('f');
fl.erase(fl.begin()+m+1,fl.end());
}
if(cc=='c'){
if(k>1)v[k-1]=v[k-2];
puta();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
putchar('f');
fl.erase(fl.begin()+m+1,fl.end());
}
if(cc=='z'){
if(m>0){
if(fl[m].ki<=v.size()){
v[fl[m].ki-1].dc[fl[m].xi][fl[m].yi]=fl[m].c1;
if(k!=fl[m].ki)k=fl[m].ki,puta(),putt();
else{
gt(fl[m].xi-1,fl[m].yi-1);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),fl[m].c1*16);
putchar(' ');
}
m--;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
putchar('f');
}
else{
fl.erase(fl.begin()+m,fl.begin()+m+1);
m--;
}
}
}
if(cc=='y'){
if(m<fl.size()-1){
m++;
v[fl[m].ki-1].dc[fl[m].xi][fl[m].yi]=fl[m].c2;
if(k!=fl[m].ki)k=fl[m].ki,puta(),putt();
else{
gt(fl[m].xi-1,fl[m].yi-1);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),fl[m].c2*16);
putchar(' ');
}
}
}
if(cc==char(72)||cc=='+'){
k=min(k+1,200);
if(k>n){
n=k,v.push_back(itn());
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
putchar('f');
fl.erase(fl.begin()+m+1,fl.end());
}
puta(),putt();
}
if(cc==char(80)||cc=='-')k=max(k-1,1),puta(),putt();
if(cc==char(75)||cc=='/')cl=max(cl-1,0),putt();
if(cc==char(77)||cc=='*')cl=min(cl+1,15),putt();
if(cc=='r'){
run();
}
}
if(KEY_DOWN(MOUSE_MOVED)){
getAddofMouse();
if(int(x)<=19&&int(x)>=0&&int(y)<=49&&int(y)>=0){
if(v[k-1].dc[int(x)+1][int(y)+1]!=cl){
if(fl.size()>m+1)fl.erase(fl.begin()+m+1,fl.end());
fl.push_back(exe(k,int(x)+1,int(y)+1,v[k-1].dc[int(x)+1][int(y)+1],cl));
m=fl.size()-1;
}
v[k-1].dc[int(x)+1][int(y)+1]=cl;
gt(int(x),int(y));
if(cl==0) putchar(' ');
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),cl*16);
putchar(' ');
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
gt(22,0);
putchar('f');
}
}
while(kbhit())char e=getch();
gt(19,50);
}
return 0;
}
运行如下
*“运行”就是播放当前动画 *“f”表示未保存
由于本人知识的局限性,它只有1000像素连老年机都不如,而且只有15种颜色,运行得还有点慢,还有很大改进空间呐~
各位读者可以复制下去玩玩,各位大佬也可以复制下去改进改进(发布一定要跟我说,因为原型是我的程序)~