控制台点灯的小游戏,貌似是贴吧里的灵感

  1 /********************************************
  2  * 程序名称:控制台点灯游戏
  3  * 作  者:WindAutumn <fluttingleaves@hotmail.com>
  4  * 最后修改:2012-7-20
  5  * 版 本 号:1.0
  6  * *****************************************/
  7 
  8 #include<stdio.h>
  9 #include<windows.h>
 10 #include<conio.h>
 11 
 12 #define X_PIANYI 4
 13 #define Y_PIANYI 2
 14 typedef struct
 15 {
 16     int x;
 17     int y;
 18 } CursorPosition;
 19 int LightCodition[10][10]= {0};
 20 
 21 void EnterGame();
 22 void ShowMenu();
 23 void StartGame(int row,int column);
 24 void UserDef();
 25 void MyExit();
 26 int  GetMousePos(CursorPosition * cursor);
 27 void HideCursor(HANDLE hOutput);
 28 void GotoXy(HANDLE hOutput, int x, int y);
 29 void InitScreen(HANDLE hOutput);
 30 
 31 int main()
 32 {
 33     SetConsoleTitle("控制台点灯游戏");
 34     while(1)
 35     {
 36         EnterGame();
 37     }
 38 
 39     return 0;
 40 }
 41 
 42 /***************进入游戏的入口*******************/
 43 void EnterGame()
 44 {
 45     char choice;
 46     do
 47     {
 48         ShowMenu();
 49         choice=getchar();
 50     }
 51     while(choice!='1'&&choice!='2'&&choice!='3'&&choice!='4'&&choice!='5'&&choice!='9');
 52 
 53     switch(choice)
 54     {
 55     case '1':
 56         StartGame(5,5);
 57     case '2':
 58         StartGame(6,6);
 59     case '3':
 60         StartGame(7,7);
 61     case '4':
 62         StartGame(8,8);
 63     case '5':
 64         UserDef();
 65     case '9':
 66         MyExit();
 67     }
 68 }
 69 
 70 /***************显示游戏菜单*******************/
 71 void ShowMenu()
 72 {
 73     printf("\n\n\n\n\t\t\t请选择游戏模式:\n");
 74     printf("\t\t\t模式(1):5 X 5\n");
 75     printf("\t\t\t模式(2):6 X 6\n");
 76     printf("\t\t\t模式(3):7 X 7\n");
 77     printf("\t\t\t模式(4):8 X 8\n");
 78     printf("\t\t\t模式(5):自己输入行列数\n");
 79     printf("\t\t\t退出游戏(9)\n");
 80     printf("\t\t\t═════════════════════\n");
 81     printf("\t\t\t请选择(输入对应数字):");
 82 }
 83 
 84 /***************开始游戏*******************/
 85 void StartGame(int row,int column)
 86 {
 87     CursorPosition cursor;
 88     HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 89     int backrow,backcolumn;
 90 
 91     HideCursor(hOutput);
 92     InitScreen(hOutput);
 93     GotoXy(hOutput, 0, 0);
 94 
 95     printf(" row: %d,column:%d\n",row,column);
 96     for(backcolumn=0; backcolumn<column; backcolumn++)
 97     {
 98         GotoXy(hOutput, X_PIANYI, Y_PIANYI + backcolumn);// 第一个可用的绘图点
 99         for(backrow=0; backrow<row; backrow++)
100             printf("");
101     }
102     SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED);// 亮红色字体
103     while(1)
104     {
105         if(GetMousePos(&cursor)&&cursor.x>=X_PIANYI&&cursor.x<X_PIANYI+row*2&&cursor.y>=Y_PIANYI&&cursor.y<Y_PIANYI+column)
106         {
107             GotoXy(hOutput, cursor.x, cursor.y);
108             LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI] = ! LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI];
109             LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI] ?
110             SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED) :
111             SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);
112             printf("");// 覆盖原来的块
113             if(cursor.y-1>=Y_PIANYI&&cursor.y-1<Y_PIANYI+column)
114             {
115                 GotoXy(hOutput, cursor.x, cursor.y-1);// 上面的块,并保证两种颜色重合
116                 LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI-1] = ! LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI-1];
117                 LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI-1] ?
118                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED) :
119                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);
120                 printf("");
121             }
122             if(cursor.x-2>=X_PIANYI&&(cursor.x-2)<X_PIANYI+row*2)
123             {
124                 GotoXy(hOutput, cursor.x-2, cursor.y);// 左面的块,并保证两种颜色重合
125                 LightCodition[(cursor.x-X_PIANYI)/2-1][cursor.y-Y_PIANYI] = ! LightCodition[(cursor.x-X_PIANYI)/2-1][cursor.y-Y_PIANYI];
126                 LightCodition[(cursor.x-X_PIANYI)/2-1][cursor.y-Y_PIANYI] ?
127                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED) :
128                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);
129                 printf("");
130             }
131             if(cursor.x+2>=X_PIANYI&&(cursor.x+2)<X_PIANYI+row*2)
132             {
133                 GotoXy(hOutput, cursor.x+2, cursor.y);// 右面的块,并保证两种颜色重合
134                 LightCodition[(cursor.x-X_PIANYI)/2+1][cursor.y-Y_PIANYI] = ! LightCodition[(cursor.x-X_PIANYI)/2+1][cursor.y-Y_PIANYI];
135                 LightCodition[(cursor.x-X_PIANYI)/2+1][cursor.y-Y_PIANYI] ?
136                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED) :
137                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);
138                 printf("");
139             }
140             if(cursor.y+1>=Y_PIANYI&&cursor.y+1<Y_PIANYI+column)
141             {
142                 GotoXy(hOutput, cursor.x, cursor.y+1);// 下面的块,并保证两种颜色重合
143                 LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI+1] = ! LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI+1];
144                 LightCodition[(cursor.x-X_PIANYI)/2][cursor.y-Y_PIANYI+1] ?
145                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_RED) :
146                 SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);
147                 printf("");
148             }
149         }
150     }
151 }
152 
153 /***************用户自定义游戏行列*******************/
154 void UserDef()
155 {
156     int row=0,column=0;
157     system("cls");
158     printf("\n\n\n\n\t\t\t请输入行数:");
159     scanf("%d",&row);
160     printf("\t\t\t请输入列数:");
161     scanf("%d",&column);
162     printf("\t\t\t现在,游戏开始!");
163     StartGame(row,column);
164 }
165 
166 /***************退出游戏*******************/
167 void MyExit()
168 {
169     system("cls");
170     printf("欢迎再次使用!");
171     getch();
172     exit(0);
173 }
174 
175 /***************用于处理鼠标点击事件***************/
176 int  GetMousePos(CursorPosition * cursor)
177 {
178     HANDLE hInput  = GetStdHandle(STD_INPUT_HANDLE);
179     INPUT_RECORD inRec;
180     DWORD res;
181 
182     ReadConsoleInput(hInput, &inRec, 1, &res);
183     if (inRec.EventType == MOUSE_EVENT && inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
184     {
185         cursor->x = inRec.Event.MouseEvent.dwMousePosition.X / 2 * 2;
186         cursor->y = inRec.Event.MouseEvent.dwMousePosition.Y;
187         return 1;
188     }
189 
190     return 0;
191 }
192 void HideCursor(HANDLE hOutput)
193 {
194     CONSOLE_CURSOR_INFO cursor_info = {1, 0};
195     SetConsoleCursorInfo(hOutput, &cursor_info);
196 }
197 void GotoXy(HANDLE hOutput, int x, int y)
198 {
199     COORD coord;
200     coord.X = x;
201     coord.Y = y;
202     SetConsoleCursorPosition(hOutput, coord);
203 }
204 
205 /**************屏幕初始化函数*****************/
206 void InitScreen(HANDLE hOutput)//边框宽 37*2+2*2=78 字 / 高 20 行 / 从(1,1)开始绘框 / (2,2)可用
207 {
208     int i,j;
209     GotoXy(hOutput, X_PIANYI-3, Y_PIANYI-1);
210 
211     SetConsoleTextAttribute(hOutput, FOREGROUND_INTENSITY | FOREGROUND_BLUE);// 亮蓝色边框
212     printf("");
213     for(i=0; i<37; i++)
214         printf("");
215     printf("╗\n");
216 
217     for(j=0; j<20; j++)
218     {
219         printf("");
220         for(i=0; i<37*2; i++)
221             printf(" ");
222         printf("║\n");
223     }
224 
225     printf("");
226     for(i=0; i<37; i++)
227         printf("");
228     printf("╝\n");
229 }

 

posted @ 2013-06-25 12:24  doodle777  阅读(228)  评论(0编辑  收藏  举报