Skip to content

Commit 40514ed

Browse files
committed
lights out
1 parent f8e25d6 commit 40514ed

File tree

12 files changed

+867
-59
lines changed

12 files changed

+867
-59
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: Lights Out Build
2+
on:
3+
push:
4+
paths:
5+
- 'Projects/Lights Out/**'
6+
- '!**.md'
7+
pull_request:
8+
paths:
9+
- 'Projects/Lights Out/**'
10+
- '!**.md'
11+
workflow_dispatch:
12+
jobs:
13+
build:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v3
17+
- uses: actions/setup-dotnet@v3
18+
with:
19+
dotnet-version: 8.0.x
20+
- run: dotnet build "Projects\Lights Out\Lights Out.csproj" --configuration Release

.vscode/launch.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,16 @@
152152
"console": "externalTerminal",
153153
"stopAtEntry": false,
154154
},
155+
{
156+
"name": "Lights Out",
157+
"type": "coreclr",
158+
"request": "launch",
159+
"preLaunchTask": "Build Lights Out",
160+
"program": "${workspaceFolder}/Projects/Lights Out/bin/Debug/Lights Out.dll",
161+
"cwd": "${workspaceFolder}/Projects/Lights Out/bin/Debug",
162+
"console": "externalTerminal",
163+
"stopAtEntry": false,
164+
},
155165
{
156166
"name": "Wordle",
157167
"type": "coreclr",

.vscode/tasks.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,19 @@
665665
],
666666
"problemMatcher": "$msCompile",
667667
},
668+
{
669+
"label": "Build Lights Out",
670+
"command": "dotnet",
671+
"type": "process",
672+
"args":
673+
[
674+
"build",
675+
"${workspaceFolder}/Projects/Lights Out/Lights Out.csproj",
676+
"/property:GenerateFullPaths=true",
677+
"/consoleloggerparameters:NoSummary",
678+
],
679+
"problemMatcher": "$msCompile",
680+
},
668681
{
669682
"label": "Build Solution",
670683
"command": "dotnet",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<OutputType>Exe</OutputType>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<RootNamespace>Lights_Out</RootNamespace>
6+
<ImplicitUsings>disable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
</Project>

Projects/Lights Out/Program.cs

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
using System;
2+
using System.Text;
3+
4+
const int Length = 5;
5+
const bool O = true;
6+
const bool X = false;
7+
8+
bool[][][] levels =
9+
[
10+
[ // 1
11+
[X, X, X, X, X],
12+
[X, X, X, X, X],
13+
[O, X, O, X, O],
14+
[X, X, X, X, X],
15+
[X, X, X, X, X],
16+
],
17+
[ // 2
18+
[O, X, O, X, O],
19+
[O, X, O, X, O],
20+
[X, X, X, X, X],
21+
[O, X, O, X, O],
22+
[O, X, O, X, O],
23+
],
24+
[ // 3
25+
[X, O, X, O, X],
26+
[O, O, X, O, O],
27+
[O, O, X, O, O],
28+
[O, O, X, O, O],
29+
[X, O, X, O, X],
30+
],
31+
[ // 4
32+
[X, X, X, X, X],
33+
[O, O, X, O, O],
34+
[X, X, X, X, X],
35+
[O, X, X, X, O],
36+
[O, O, X, O, O],
37+
],
38+
[ // 5
39+
[O, O, O, O, X],
40+
[O, O, O, X, O],
41+
[O, O, O, X, O],
42+
[X, X, X, O, O],
43+
[O, O, X, O, O],
44+
],
45+
[ // 6
46+
[X, X, X, X, X],
47+
[X, X, X, X, X],
48+
[O, X, O, X, O],
49+
[O, X, O, X, O],
50+
[X, O, O, O, X],
51+
],
52+
[ // 7
53+
[O, O, O, O, X],
54+
[O, X, X, X, O],
55+
[O, X, X, X, O],
56+
[O, X, X, X, O],
57+
[O, O, O, O, X],
58+
],
59+
[ // 8
60+
[X, X, X, X, X],
61+
[X, X, O, X, X],
62+
[X, O, X, O, X],
63+
[O, X, O, X, O],
64+
[X, O, X, O, X],
65+
],
66+
[ // 9
67+
[X, O, X, O, X],
68+
[O, O, O, O, O],
69+
[X, O, O, O, X],
70+
[X, O, X, O, O],
71+
[O, O, O, X, X],
72+
],
73+
[ // 10
74+
[X, O, O, O, X],
75+
[X, O, O, O, X],
76+
[X, O, O, O, X],
77+
[X, X, X, X, X],
78+
[X, X, X, X, X],
79+
],
80+
[ // 11
81+
[O, X, O, X, O],
82+
[O, X, O, X, O],
83+
[O, X, O, X, O],
84+
[O, X, O, X, O],
85+
[X, O, O, O, X],
86+
],
87+
[ // 12
88+
[O, O, O, O, O],
89+
[X, O, X, O, X],
90+
[O, O, X, O, O],
91+
[X, O, O, O, X],
92+
[X, O, X, O, X],
93+
],
94+
[ // 13
95+
[X, X, X, O, X],
96+
[X, X, O, X, O],
97+
[X, O, X, O, X],
98+
[O, X, O, X, X],
99+
[X, O, X, X, X],
100+
],
101+
[ // 14
102+
[X, X, X, X, X],
103+
[X, X, X, X, X],
104+
[X, O, X, X, X],
105+
[X, O, X, X, X],
106+
[X, O, X, X, X],
107+
],
108+
[ // 15
109+
[X, X, X, X, X],
110+
[X, O, X, X, X],
111+
[X, X, X, X, X],
112+
[X, O, X, X, X],
113+
[X, X, X, X, X],
114+
],
115+
[ // 16
116+
[O, X, X, X, X],
117+
[O, X, X, X, X],
118+
[O, X, X, X, X],
119+
[O, X, X, X, X],
120+
[O, O, O, O, O],
121+
],
122+
[ // 17
123+
[X, X, X, X, X],
124+
[X, X, X, X, X],
125+
[X, X, O, X, X],
126+
[X, O, O, O, X],
127+
[O, O, O, O, O],
128+
],
129+
[ // 18
130+
[X, X, O, X, X],
131+
[X, O, X, O, X],
132+
[O, X, O, X, O],
133+
[X, O, X, O, X],
134+
[X, X, O, X, X],
135+
],
136+
[ // 19
137+
[O, X, O, X, O],
138+
[X, X, X, X, X],
139+
[O, X, O, X, O],
140+
[X, X, X, X, X],
141+
[O, X, O, X, O],
142+
],
143+
[ // 20
144+
[X, X, X, X, X],
145+
[X, X, X, X, X],
146+
[O, X, X, X, O],
147+
[X, X, X, X, X],
148+
[X, X, X, X, X],
149+
],
150+
[ // 21
151+
[X, O, O, O, O],
152+
[X, O, X, X, X],
153+
[X, O, O, O, X],
154+
[X, O, X, X, X],
155+
[X, O, X, X, X],
156+
],
157+
[ // 22
158+
[X, O, O, O, X],
159+
[O, X, X, X, O],
160+
[O, X, X, X, O],
161+
[O, X, X, X, O],
162+
[X, O, O, O, X],
163+
],
164+
[ // 23
165+
[X, X, X, X, X],
166+
[X, X, X, X, X],
167+
[X, X, O, O, O],
168+
[X, X, O, O, X],
169+
[X, X, O, X, X],
170+
],
171+
[ // 24
172+
[X, X, X, X, X],
173+
[X, X, X, X, X],
174+
[O, X, X, X, O],
175+
[O, O, O, O, O],
176+
[X, O, X, X, O],
177+
],
178+
[ // 25
179+
[O, X, X, X, X],
180+
[O, O, X, X, X],
181+
[O, O, O, X, X],
182+
[O, O, O, O, X],
183+
[X, O, O, O, O],
184+
],
185+
];
186+
187+
Console.OutputEncoding = Encoding.UTF8;
188+
int level = 0;
189+
bool[][] board =
190+
[
191+
[O, O, O, O, O],
192+
[O, O, O, O, O],
193+
[O, O, O, O, O],
194+
[O, O, O, O, O],
195+
[O, O, O, O, O],
196+
];
197+
SetBoard();
198+
(int Left, int Top) cursor = (0, 0);
199+
while (true)
200+
{
201+
RenderBoard();
202+
Console.Write($"""
203+
204+
Turn off all the lights. Level {level + 1}.
205+
206+
Controls:
207+
- arrow keys: move cursor
208+
- enter: flip lights
209+
- backspace: reset level
210+
- escape: close game
211+
""");
212+
Console.SetCursorPosition(2 * cursor.Left, cursor.Top);
213+
Console.CursorVisible = false;
214+
switch (Console.ReadKey(true).Key)
215+
{
216+
case ConsoleKey.LeftArrow: cursor.Left = cursor.Left <= 0 ? Length - 1 : cursor.Left - 1; break;
217+
case ConsoleKey.RightArrow: cursor.Left = cursor.Left >= Length - 1 ? 0 : cursor.Left + 1; break;
218+
case ConsoleKey.UpArrow: cursor.Top = cursor.Top <= 0 ? Length - 1 : cursor.Top - 1; break;
219+
case ConsoleKey.DownArrow: cursor.Top = cursor.Top >= Length - 1 ? 0 : cursor.Top + 1; break;
220+
case ConsoleKey.Backspace: SetBoard(); break;
221+
case ConsoleKey.Escape: goto Close;
222+
case ConsoleKey.Enter:
223+
board[cursor.Top][cursor.Left] = !board[cursor.Top][cursor.Left];
224+
if (cursor.Top > 0) board[cursor.Top - 1][cursor.Left] = !board[cursor.Top - 1][cursor.Left];
225+
if (cursor.Top < Length - 1) board[cursor.Top + 1][cursor.Left] = !board[cursor.Top + 1][cursor.Left];
226+
if (cursor.Left > 0) board[cursor.Top][cursor.Left - 1] = !board[cursor.Top][cursor.Left - 1];
227+
if (cursor.Left < Length - 1) board[cursor.Top][cursor.Left + 1] = !board[cursor.Top][cursor.Left + 1];
228+
if (LightsOut())
229+
{
230+
Console.Clear();
231+
RenderBoard();
232+
Console.Write($"""
233+
234+
You turned off all the lights!
235+
Level {level + 1} complete.
236+
237+
Controls:
238+
- enter: next level
239+
- escape: close game
240+
""");
241+
switch (Console.ReadKey(true).Key)
242+
{
243+
case ConsoleKey.Escape: goto Close;
244+
case ConsoleKey.Enter:
245+
level++;
246+
SetBoard();
247+
Console.Clear();
248+
break;
249+
}
250+
}
251+
break;
252+
}
253+
}
254+
Close:
255+
Console.Clear();
256+
Console.WriteLine("Lights Out was closed.");
257+
Console.CursorVisible = true;
258+
259+
void SetBoard()
260+
{
261+
for (int i = 0; i < Length; i++)
262+
{
263+
for (int j = 0; j < Length; j++)
264+
{
265+
board[i][j] = levels[level][i][j];
266+
}
267+
}
268+
}
269+
270+
bool LightsOut()
271+
{
272+
for (int i = 0; i < Length; i++)
273+
{
274+
for (int j = 0; j < Length; j++)
275+
{
276+
if (board[i][j])
277+
{
278+
return false;
279+
}
280+
}
281+
}
282+
return true;
283+
}
284+
285+
void RenderBoard()
286+
{
287+
StringBuilder render = new();
288+
for (int i = 0; i < Length; i++)
289+
{
290+
for (int j = 0; j < 3; j++)
291+
{
292+
for (int k = 0; k < Length; k++)
293+
{
294+
switch (j)
295+
{
296+
case 0: render.Append((k, i) == cursor ? "╔═╤═╗" : "╭───╮"); break;
297+
case 1:
298+
render.Append((k, i) == cursor ? '╟' : '│');
299+
render.Append(board[i][k] ? "███" : " ");
300+
render.Append((k, i) == cursor ? '╢' : '│');
301+
break;
302+
case 2: render.Append((k, i) == cursor ? "╚═╧═╝" : "╰───╯"); break;
303+
}
304+
}
305+
render.AppendLine();
306+
}
307+
}
308+
Console.SetCursorPosition(0, 0);
309+
Console.Write(render);
310+
}

0 commit comments

Comments
 (0)