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 }
转载于:https://www.cnblogs.com/doodle777/p/3154449.html