-
Notifications
You must be signed in to change notification settings - Fork 0
/
source.cpp
211 lines (182 loc) · 5.25 KB
/
source.cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <string>
#include "raylib.h"
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 450;
const int MAX_FISH_SIZE = 50;
const int MIN_FISH_SIZE = 10;
const int MAX_FISH_SPEED = 10;
const int MIN_FISH_SPEED = 1;
Vector2 Vector2Add(Vector2 v1, Vector2 v2)
{
Vector2 result;
result.x = v1.x + v2.x;
result.y = v1.y + v2.y;
return result;
}
Vector2 Vector2Scale(Vector2 v, float scale)
{
Vector2 result;
result.x = v.x * scale;
result.y = v.y * scale;
return result;
}
Vector2 Vector2Subtract(Vector2 v1, Vector2 v2)
{
Vector2 result;
result.x = v1.x - v2.x;
result.y = v1.y - v2.y;
return result;
}
// Fish class
class Fish
{
public:
Vector2 position;
int size;
int speed;
Color color;
std::vector<Vector2> wavingLines;
// Constructor
Fish(int x, int y, int size, int speed, Color color)
{
position = { (float)x, (float)y };
this->size = size;
this->speed = speed;
this->color = color;
// Initialize waving lines
for (int i = 0; i < size; i++)
{
wavingLines.push_back({ (float)x, (float)y });
}
}
// Move fish
void move()
{
// Update position
position.x += (float)(rand() % 3 - 1) * speed;
position.y += (float)(rand() % 3 - 1) * speed;
// Keep fish within screen bounds
if (position.x < 0) position.x = 0;
if (position.x > SCREEN_WIDTH) position.x = (float)SCREEN_WIDTH;
if (position.y < 0) position.y = 0;
if (position.y > SCREEN_HEIGHT) position.y = (float)SCREEN_HEIGHT;
// Update waving lines
for (int i = 0; i < wavingLines.size(); i++)
{
wavingLines[i].x += (float)(rand() % 3 - 1) * speed;
wavingLines[i].y += (float)(rand() % 3 - 1) * speed;
}
}
// Grow fish
void grow(int size)
{
this->size += size;
}
};
float distance(Vector2 p1, Vector2 p2)
{
float dx = p2.x - p1.x;
float dy = p2.y - p1.y;
return sqrt(dx * dx + dy * dy);
}
// Simulation class
class Simulation
{
public:
std::vector<Fish> fishList;
int deadFishCount;
// Constructor
Simulation()
{
deadFishCount = 0;
}
// Update simulation by a single time step
// Update simulation by a single time step
void step()
{
// Move fish
for (Fish& f : fishList)
{
f.move();
}
// Check for fish chasing and being chased
for (int i = 0; i < fishList.size(); i++)
{
Fish& f1 = fishList[i];
for (int j = i + 1; j < fishList.size(); j++)
{
Fish& f2 = fishList[j];
if (f1.size > f2.size)
{
// Larger fish chases smaller fish
if (distance(f1.position, f2.position) < f1.size + f2.size)
{
// Eat smaller fish
f1.grow(f2.size);
fishList.erase(fishList.begin() + j);
deadFishCount++;
break;
}
}
else if (f1.size < f2.size)
{
// Smaller fish tries to escape larger fish
if (distance(f1.position, f2.position) < f1.size + f2.size)
{
f1.position = Vector2Add(f1.position, Vector2Scale(Vector2Subtract(f1.position, f2.position), f1.speed));
}
}
}
}
}
};
int main(int argc, char* argv[])
{
// Initialize window and graphics
InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Fish Simulation");
SetTargetFPS(60);
srand(time(NULL));
// Create simulation
Simulation sim;
// Create user-specified number of fish
//std::cout << "Enter number of fish: ";
int numFish = 20;
for (int i = 0; i < numFish; i++)
{
int x = rand() % SCREEN_WIDTH;
int y = rand() % SCREEN_HEIGHT;
int size = MIN_FISH_SIZE + rand() % (MAX_FISH_SIZE - MIN_FISH_SIZE + 1);
int speed = MIN_FISH_SPEED + rand() % (MAX_FISH_SPEED - MIN_FISH_SPEED + 1);
Color color = { (unsigned char)(rand() % 256), (unsigned char)(rand() % 256), (unsigned char)(rand() % 256), 255 };
sim.fishList.push_back(Fish(x, y, size, speed, color));
}
// Run simulation loop
while (!WindowShouldClose())
{
// Update
sim.step();
// Draw
BeginDrawing();
ClearBackground(RAYWHITE);
// Draw fish
for (Fish& f : sim.fishList)
{
DrawCircleV(f.position, f.size, f.color);
for (Vector2& v : f.wavingLines)
{
DrawLineV(v, Vector2Add(v, Vector2Scale(f.position, 0.1f)), f.color);
}
}
// Draw counters
DrawText(std::string("Dead Fishies: " + std::to_string(sim.deadFishCount)).c_str(), 10, 10, 20, BLACK);
DrawText(std::string("Fishies: " + std::to_string(sim.fishList.size())).c_str(), 10, 30, 20, BLACK);
EndDrawing();
}
// Close window and terminate raylib
CloseWindow();
return 0;
}