about summary refs log tree commit diff stats
path: root/README.md
blob: 95b97b645acfcdffa43c4809634420525203064b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# 2023 Lisp Game Jam Entry
## "Apple"

*Apple* is a reverse snake --- you're an apple trying to avoid the snake.

## Dependencies

- chicken scheme (`csi`) with eggs:
  - matchable
  - r7rs
  - stty
- my ansi library, [yolk][]

[yolk]: https://git.acdw.net/yolk

## Running

Run `./apple.scm` in this directory.  Alternatively, run `make` to build a static binary and run that instead.

## License

This software is licensed under the Look At This Cool Rock I Found Public License, version 1.0.  See [COPYING][] for details.

Here is a picture of the cool rock I found:

![cool rock](https://junk.acdw.net/coolrock.jpg)

[COPYING]: https://git.acdw.net/game/tree/COPYING

## Development log

### 2023-06-01

- Changed name to *apple*
- Added a makefile for compilation

- I made the snake smart!
  - now it follows the appple around the screen trying to eat it
  - figuring out collision logic and making sure the snake didn't eat itself and all was .. whoo boy, it was wild
  - but in the end it works well enough!
- Added game win/lose conditions
- Added fruit
  - will make that work tomorrow
  - hacky AS HECK! here be dragons yall
  - collision detection is full of special cases, and I don't like how it works

### 2023-05-31

- Added color using the (yolk attrs) library
- Parameterize (me) and (snake) in main to make definition order unimportant
- Change game loop and event handling to allow for independent snake movement
  - This didn't require using threads!
  - Also enabled hjkl for movement.
  - The snake is very dumb right now --- it just goes in a circle.
  - Also includes timing!
  - And changing direction!
- Randomly place snake and apple
- Refactor functions to pass around the world less
  - This means that things now hold a reference to the world they're in .. I think this makes sense
- Add checking if things are around a given thing

### 2023-05-30

- Changed license to LATCRIFPL
- Added beginning of snake and came up with basic idea for game

I'm going to have to add threads >_<  Curse you non-turn-based games!

The snake is interesting ... it's its own structure with a head thing and a list of tail things trailing behind.  Each time it moves it just cuts off its tail at the length it needs to be, giving the illusion of movement.  I had some complicated stuff with each segment storing its own age ... but that was a bad idea lol.

### 2023-05-29

- I've changed the basic logic from just throwing characters on the screen wherever to a vector-based approach.  I thought there was a multiple-dimensional vector egg or something, but I apparently was mistaken.  So I'm doing the ol' multiply-by-one-thing-and-add-another approach.
- Implementing collision detection was slightly easier than I thought it might
  be.
- Figuring out the vector bounds math was tricky... lots of "off-by-one" errors.  I suppose I've hit both of the main errors of computer science with this game, then.
- I encapsulated things in their own records (so far, `world`, `thing`, and `me` ... and `world` and `me` are parameterized) to keep stuff together.  I think this'll work... I hope!

### .. before

I started out by writing [yolk][], which has a bunch of procedures returning strings for terminal escapes.  NIH and all :)

Originally I had a big loop to just draw all the border stuff at once, then the character where I wanted it.  The character would erase itself and redraw as it moved, which worked fine ... for one object.

I was walking around when I realized I'd need to redo things.