拉灯游戏加强版
2016-04-07 19:48
267 查看
#include<windows.h> #include<conio.h> #include<cstdio> #include<ctime> #include<cstring> #include<cstdlib> #include<algorithm> #define N 40 #define BOARDX(x) ((x)-OFFSETX)/2 #define BOARDY(y) (y)-OFFSETY #define SCREENX(x) (x)*2+OFFSETX #define SCREENY(y) (y)+OFFSETY #define BACKGROUND_WHITE (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED) #define FOREGROUND_WHITE (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED) using namespace std; int QT; int f ; int a[N*N][N*N]; int ans ; int which[N*N],ins[N*N]; int OFFSETX=3; int OFFSETY=3; int HEIGHT; int WIDTH; int LAMP; int LEVEL; HANDLE hIn,hOut; const int dir[4][2]={ 0,1, 1,0, 0,-1, -1,0 }; void writeChar(LPCSTR pChar,COORD wrtCrd); void newgame(); void levelmade(); void gamemade(); bool is_win(); void drawCell(int x,int y); void write(); void initgame(); void doing(); void WinGame(); void exchange(int x,int y); void clearScreen(); void AnsMade() { memset(a,0,sizeof(a)); for(int i=1;i<=HEIGHT;i++) { for(int j=1;j<=WIDTH;j++) { int tot=(i-1)*WIDTH+j; a[tot][tot]=1; for(int k=0;k<4;k++) { int x=i+dir[k][0],y=j+dir[k][1]; if(x>HEIGHT||x<=0||y<=0||y>WIDTH)continue; a[tot][(x-1)*WIDTH+y]=1; } } } } void drawAns(int x,int y) { char buf[5]={0}; switch (ans[x][y]) { case 0: sprintf(buf,"○\0"); break; case 1: sprintf(buf,"●\0"); break; } COORD cci={SCREENX(x),SCREENY(y)}; writeChar(buf,cci); } void GetAns() { SetConsoleTitle("拉灯游戏提示界面 F2:返回"); AnsMade(); for(int i=1;i<=HEIGHT;i++) for(int j=1;j<=WIDTH;j++) a[(i-1)*WIDTH+j][HEIGHT*WIDTH+1]=f[i][j]; int Equ=HEIGHT*WIDTH,Var=HEIGHT*WIDTH; memset(which,0,sizeof(which)); memset(ins,0,sizeof(ins)); int i=1,j=1,k; while(i<=Equ&&j<=Var) { for(k=i;k<=Equ;k++) if(a[k][j])break; if(a[k][j]) { if(k!=i) for(int p=j;p<=Var+1;p++) swap(a[i][p],a[k][p]); for(k=i+1;k<=Equ;k++) { if(!a[k][j])continue; for(int p=j;p<=Var+1;p++) a[k][p]^=a[i][p]; } which[i]=j,ins[j]=i; i++; } j++; } for(k=i;k<=Var;k++) a[k][Var+1]=1; for(k=i-1;k>=1;k--) { for(int p=which[k]+1;p<=Var;p++) if(a[k][p])a[k][Var+1]^=a[ins[p]][Var+1]; } clearScreen(); memset(ans,0,sizeof(ans)); for(int i=1;i<=HEIGHT;i++) for(int j=1;j<=WIDTH;j++) ans[i][j]=a[(i-1)*WIDTH+j][HEIGHT*WIDTH+1]; for(int i=1;i<=HEIGHT;i++) for(int j=1;j<=WIDTH;j++) drawAns(i,j); } int read() { static char ch; static int D; while(!isdigit(ch=getch())); for(D=ch-'0';isdigit(ch=getch());) D=D*10+ch-'0'; return D; } void fillChar(TCHAR cChar, DWORD len, COORD wrtCrd) { DWORD wtn; FillConsoleOutputCharacter(hOut, cChar, len, wrtCrd, &wtn); } void fillAttr(WORD attr, DWORD len, COORD wrtCrd) { DWORD wtn; FillConsoleOutputAttribute(hOut, attr, len, wrtCrd, &wtn); } void clearScreen() { COORD crd = {0, 0}; CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(hOut, &csbi); fillChar(' ', csbi.dwSize.X * csbi.dwSize.Y, crd); fillAttr(FOREGROUND_WHITE, csbi.dwSize.X * csbi.dwSize.Y, crd); } void exchange(int x,int y) { f[x][y]^=1; for(int j=0;j<4;j++) { int xx=x+dir[j][0]; int yy=y+dir[j][1]; f[xx][yy]^=1; } } void writeChar(LPCSTR pChar,COORD wrtCrd) { DWORD wtn; WriteConsoleOutputCharacter(hOut,pChar,strlen(pChar),wrtCrd,&wtn); } void newgame() { SetConsoleTitle("拉灯游戏 F1:提示"); clearScreen(); char buf[50]={0}; sprintf(buf,"按任意键开始游戏\0"); COORD cci={30,10}; writeChar(buf,cci); getch(); } void levelmade() { clearScreen(); char buf[50]={0}; sprintf(buf," 请选择难度等级\0"); int x=30; int y=9; COORD cci1={x,y}; writeChar(buf,cci1); sprintf(buf,"简单:1 容易:2 困难:3 自定义:4\0"); x=25; y=11; COORD cci2={x,y}; writeChar(buf,cci2); char k=getch(); LEVEL=k-'0'; if(LEVEL>4||LEVEL<1) levelmade(); } void gamemade() { srand(time(0)); if(LEVEL!=4) { memset(f,0,sizeof(f)); LAMP=rand()%LAMP+LAMP; for(int i=1;i<=LAMP;i++) { int x=rand()%HEIGHT+1; int y=rand()%WIDTH+1; exchange(x,y); } } } bool is_win() { for(int i=1;i<=HEIGHT;i++) for(int j=1;j<=WIDTH;j++) if(f[i][j]) return 0; return 1; } void drawCell(int x,int y) { char buf[5]={0}; switch (f[x][y]) { case 0: sprintf(buf,"○\0"); break; case 1: sprintf(buf,"●\0"); break; } COORD cci={SCREENX(x),SCREENY(y)}; writeChar(buf,cci); } void write() { SetConsoleTitle("拉灯游戏 F1:提示"); clearScreen(); for(int i=1;i<=HEIGHT;i++) { for(int j=1;j<=WIDTH;j++) { if(!is_win()) drawCell(i,j); else WinGame(); } } } void WinGame() { clearScreen(); char buf[50]={0}; sprintf(buf,"恭喜你,你赢了\0"); COORD cci={30,10}; writeChar(buf,cci); Sleep(100); getch(); initgame(); } void make_me() { FILE *fin=fopen("tt.in","r"); fscanf(fin,"%d%d",&WIDTH,&HEIGHT); for(int j=1;j<=WIDTH;j++) for(int i=1;i<=HEIGHT;i++) fscanf(fin,"%d",&f[i][j]); } void initgame() { levelmade(); if(LEVEL==1) { HEIGHT=9,WIDTH=9,LAMP=20; gamemade(); }else if(LEVEL==2) { HEIGHT=16,WIDTH=16,LAMP=50; gamemade(); }else if(LEVEL==3) { HEIGHT=30,WIDTH=16,LAMP=100; gamemade(); }else make_me(); OFFSETX=(70-HEIGHT*2)/2; write(); } void onKeyDown(WORD keycode) { switch(keycode) { case VK_F1:GetAns();break; case VK_F2:write();break; default:break; } } int main() { hIn=GetStdHandle(STD_INPUT_HANDLE); hOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; cci.dwSize=1; cci.bVisible=FALSE; SetConsoleCursorInfo(hOut,&cci); newgame(); initgame(); for(;;) { DWORD nEvts; GetNumberOfConsoleInputEvents(hIn,&nEvts); if(nEvts>0) { INPUT_RECORD inpRec; ReadConsoleInput(hIn,&inpRec,1,&nEvts); if(inpRec.EventType==MOUSE_EVENT) { int x=BOARDX(inpRec.Event.MouseEvent.dwMousePosition.X); int y=BOARDY(inpRec.Event.MouseEvent.dwMousePosition.Y); if(inpRec.Event.MouseEvent.dwEventFlags==MOUSE_MOVED) continue; if(inpRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED) { exchange(x,y); write(); }else continue; } if(inpRec.EventType==KEY_EVENT) onKeyDown(inpRec.Event.KeyEvent.wVirtualKeyCode); } FlushConsoleInputBuffer(hIn); Sleep(50); } return 0; }
相关文章推荐
- 我是运营,我没有假期
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- VB实现的《QQ美女找茬游戏》作弊器实例
- C#实现洗牌游戏实例
- C#实现的算24点游戏算法实例分析
- C#实现简单的井字游戏实例
- C++编写简单的打靶游戏
- C++实现基于控制台界面的吃豆子游戏
- 纯javascript实现的小游戏《Flappy Pig》实例
- 基于javascript实现句子翻牌网页版小游戏
- JavaScript实现俄罗斯方块游戏过程分析及源码分享
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- Android基本游戏循环实例分析
- JavaScript游戏之优化篇
- js实现俄罗斯方块小游戏分享