| 1 | const std = @import("std"); |
| 2 | |
| 3 | pub fn main(init: std.process.Init) !void { |
| 4 | var stdout_writer = std.Io.File.stdout().writerStreaming(init.io, &.{}); |
| 5 | const out = &stdout_writer.interface; |
| 6 | |
| 7 | var line_buffer: [20]u8 = undefined; |
| 8 | var stdin_reader: std.Io.File.Reader = .init(.stdin(), init.io, &line_buffer); |
| 9 | const in = &stdin_reader.interface; |
| 10 | |
| 11 | try out.writeAll("Welcome to the Guess Number Game in Zig.\n"); |
| 12 | |
| 13 | var rng: std.Random.IoSource = .{ .io = init.io }; |
| 14 | const answer = rng.interface().intRangeLessThan(u8, 0, 100) + 1; |
| 15 | |
| 16 | while (true) { |
| 17 | try out.writeAll("\nGuess a number between 1 and 100: "); |
| 18 | const untrimmed_line = in.takeSentinel('\n') catch |err| switch (err) { |
| 19 | error.StreamTooLong => { |
| 20 | try out.writeAll("Line too long.\n"); |
| 21 | _ = try in.discardDelimiterInclusive('\n'); |
| 22 | continue; |
| 23 | }, |
| 24 | else => |e| return e, |
| 25 | }; |
| 26 | const line = std.mem.trimEnd(u8, untrimmed_line, "\r\n"); |
| 27 | |
| 28 | const guess = std.fmt.parseUnsigned(u8, line, 10) catch { |
| 29 | try out.writeAll("Invalid number.\n"); |
| 30 | continue; |
| 31 | }; |
| 32 | if (guess > answer) { |
| 33 | try out.writeAll("Guess lower.\n"); |
| 34 | } else if (guess < answer) { |
| 35 | try out.writeAll("Guess higher.\n"); |
| 36 | } else { |
| 37 | try out.writeAll("You win!\n"); |
| 38 | return; |
| 39 | } |
| 40 | } |
| 41 | } |