在线时间 482 小时 最后登录 2026-9-11 注册时间 2023-7-11 听众数 4 收听数 0 能力 0 分 体力 7953 点 威望 0 点 阅读权限 255 积分 2978 相册 0 日志 0 记录 0 帖子 1183 主题 1198 精华 0 分享 0 好友 1
该用户从未签到
这款简易版的球球大作战是一款单人游戏,玩家需要控制一个小球在地图上移动,吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。1 x+ w0 o/ r- w$ X2 ~
8 i; ]: {0 G0 f. ?+ H, o7 F 在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:
. d: X% ~. f; @6 ^ % \$ V! E) T$ b' H$ B8 k% ?3 h
游戏界面:游戏界面是一个矩形区域,玩家可以在这个区域内控制球的移动。
! ^9 O; I. H: @& U, e% G; t ! `. H' W7 G. G4 e* ^
玩家小球:玩家控制的小球可以在游戏界面内自由移动,按下空格键可以加速。
1 q5 ~3 b, _$ y& u# I, |
+ w9 R7 n1 V0 w( a 其他小球:其他小球又分为食物小球,和ai控制的小球) a& g4 W2 q9 }* q# e: [1 D( ]0 T# ^
0 G8 s3 T( o. R/ N
体积:玩家每吃一个其他小球体积就会增大一点,ai小球也可以通过吃食物和玩家小球增大体积。/ v* Z5 N+ m( x% a5 t, O+ o
% }. g8 N% x+ z+ q' N
玩家被吃:当玩家小球被ai小球吃了,玩家小球就会回到初始点,体积也会变成初始大小。1 u: `2 [- r9 U8 a; }7 ]
% Z8 \$ [4 g0 h/ j/ z) g ai小球的追击和逃跑:当玩家小球与ai小球靠近时,ai小球会根据自身体积的大小选择追击玩家小球或者逃跑。
- a; P) M& S, `. ~* q3 x5 E 7 t* j; m- g: r/ N2 r( H
接下来,我们将通过以下几个步骤来实现这个游戏:4 \6 q+ E; ~# b
9 V& h: s" f0 @' g1 P* L
初始化游戏界面和小球的信息。
, A0 `7 k$ W g0 A; o" L. ~5 @' U/ J 5 [7 U5 B/ \$ d/ A
处理键盘输入,实现玩家小球的移动和加速。
X( G& @5 E5 l( R: a
! K' Q6 z, X, B3 A1 f) i 生成足够数量的食物小球。
" c3 m6 y V8 N9 t. h( K: n6 p
- G+ T, T) R: o) Q5 E 生成ai小球,并控制其移动。
V0 C0 ?) c; C4 ^; k% h
# | i I5 D/ X+ Q 检测小球之间的吞噬关系,增加相应的体积。6 H( K( E3 V* l* B0 N* q
# I% Y$ o$ _2 H' v9 y) b
通过学习这个游戏的开发过程,初学者将能够掌握C语言编程和easyx图形库的基本技巧。7 w( j- p: v( K& x( r% y/ z
: j" T+ c5 c* z/ C 1. 小球的要素
! N% `. i1 V! c& H$ f8 O, e; I 在此游戏中一个小球的要素无非就是小球所在的位置(坐标)、小球的半径、以及小球的颜色,这里我们可以用一个结构体数组来存放这些要素,以方便初始化小球的信息。
; ^/ r! d! C5 `3 b- v% A
5 w, Y$ ?: S& z3 I" r" A& g) ?2 G struct Ball
; r2 l, W8 r K! |$ @ {5 [* o/ I3 V! x# V* z' b- V- M3 R
int x;7 r( o) ]3 q' d3 |3 S n) y
int y;( R* e$ \# Y1 H+ q$ i
float r;) n3 u' Z# r1 d7 x9 z/ J; T7 Z& \/ l
DWORD color;* d3 _+ X% [% d! x3 C
};+ E# n6 V, z: t' q/ p
2. 初始化小球的信息
+ n, V! K9 ~* s7 S9 ?0 V, p, D 将玩家小球的初始位置设置在窗口的中间,半径大小为10。食物小球和ai小球的位置则通过rand函数、srand函数和time函数生成的随机数,随机分布在地图的各个位置,食物小球半径为1-5,ai小球的半径10.其中在这里使用了RGB随机生成一个颜色,使每个食物小球的颜色都不尽相同。
! m- ], e5 g: o+ b/ X1 f' p8 H 0 Y/ t) p. f: E6 R8 {$ W
RGB色彩模式是一种工业标准,它通过红(R)、绿(G)、蓝(B)三个颜色通道的组合来表示不同的颜色。每个通道通常分配一个0到255之间的数值,其中0表示该颜色通道没有亮度,255表示该颜色通道的最大亮度。通过调整这三个通道的值,可以生成几乎所有人类视觉系统能够感知的颜色。例如:
* o6 M; g+ Y9 R6 _. R, t1 c& N
' g9 i5 L( ?2 n: Q5 A, A 橙色可以通过RGB值(255, 128, 0)来表示。
# F7 s2 U) w2 q1 u: ? 黄色的RGB值为(255, 255, 0)。
/ g7 f8 x7 w* N 绿色的RGB值是(0, 255, 0)。5 \, v1 Q1 X# ?' { B4 p0 g
蓝色的RGB值为(0, 0, 255)。$ x6 X* E) S5 B( [8 t8 u8 O! r! J
紫色可以通过RGB值(170, 0, 255)来表示。
* G8 C' T4 d$ g! i 黑色的RGB值为(0, 0, 0)。
9 K9 N, N8 k; f: z0 U( l 白色的RGB值为(255, 255, 255)。
! N7 m7 e6 G0 x7 C, f1 k' i7 R8 w 灰色的RGB值可以是(128, 128, 128),其中三个值相等即可,值越接近255,颜色就越接近白色,反之亦然。void Inset() R1 I* }5 Z) ^. }, d- @
{
$ J3 s5 f, Z8 i! c //玩家小球
: `- c( ^+ ~+ h& s3 d; S$ N3 \ srand((unsigned)time(NULL)); W# @) C: b, [# u6 \
player.x = Wide / 2;
8 V1 Y* f\" |$ C' Z8 n1 O5 \ player.y = Hight / 2;+ I/ q- n o7 Q$ N; n
player.r = 10;: y8 q$ o! V) Q3 Q3 M
//食物小球( r% a/ d& X9 F z0 \
for (int i = 0; i < Food_num; i++)' [$ C7 \: Y$ u; q
{
% l P; L5 F# o2 O5 s8 O Food[i].x = rand() % Wide_map;
}! s/ c& W\" \\" Q q3 @# ^ Food[i].y = rand() % Hight_map;
q9 d6 R) M/ j; ]& N' @: K' C Y Food[i].r = rand() % 5 + 1;
' @9 C+ @0 O6 f* w' Y7 {' [) a/ [2 A Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
) |) L: Y& i6 ~4 p5 U7 v4 U: X n5 I }0 t. j7 t2 T( l+ F
//ai小球7 l. o\" w7 e7 b) Y# M0 P
for (int i = 0; i < Enemy_num; i++)
' V: a/ w& w/ `3 l6 y. C1 O# n\" O- O {
; M; r! |& b. H: o h+ } Enemy[i].x = rand() % Wide_map;4 t. Z6 @$ z! g( i2 l f\" T7 o: p
Enemy[i].y = rand() % Hight_map;
# K* K8 L8 \: Z* _- y3 Q Enemy[i].r = 10;
+ Z, l A3 l# t5 b/ \9 E% ~ Enemy[i].color = RGB(0,255,0);
- T8 C, ]+ \& }\" t, m }
. e: r! @1 Y3 l3 C ~
' l9 W, T( f\" x; k\" S3 p$ u3 v' z1 O } 复制代码 3. 玩家操作小球
$ u% | D9 H: Y! p 在这里需要用到GetAsyncKeyState(vk virtual key)函数获取异步按键状态,其中vk virtual key是虚拟键值,如果接受到这个虚拟键值,它会返回真。VK_UP、VK_DOWN、VK_LEFT、VK_RIGHT、0x20分别是上箭头键、下箭头键、左箭头键、右箭头键、空格键的虚拟键值。void Player_move()
! V' l0 F' x; y- L: R# |7 ]% g9 h {# ^' Q3 W9 ^5 c0 i0 L* J0 J
if (GetAsyncKeyState(VK_UP))
4 c3 ]* J7 N2 c# v& l {. ]% s+ e\" `. r0 I6 Z
if (player.y > 0)% m/ m\" m. x. G6 r1 p8 v
{$ E6 m _) j2 r I0 v
player.y -= player_sleep;
: T+ L' Z3 d- E( H }
8 y/ |4 y) p% u0 q6 j- q# X# a8 J }
( Z\" j( M$ Z$ o# G- I if (GetAsyncKeyState(VK_DOWN))
4 L$ A4 _2 b- l9 R {
, F: g; H0 k: z8 ]4 x4 D4 P! F) b9 a6 k5 e if (player.y < Hight_map)0 g5 @0 D- Z( f- ~$ v2 K
player.y += player_sleep;
7 ~3 v9 o; W' X }
5 Y/ p/ o$ j: [# ^7 E; G% i if (GetAsyncKeyState(VK_LEFT))9 z2 Q- k5 s7 |2 a; h2 j
{
* L1 p P5 Y, z8 z7 t+ n5 g if (player.x > 0)
5 ]& y4 @( m5 C0 L player.x -= player_sleep;
9 e6 m0 \* x& w3 S L }
- R6 S! g/ I8 S7 d0 m% ?; L if (GetAsyncKeyState(VK_RIGHT))
& r( t2 \0 }2 r0 [- _2 ^ {
: g+ _' y; Q5 [0 L4 S if (player.x < Wide_map)0 p2 w: @ [& V' f I) f
player.x += player_sleep;
$ V/ ?. J. p+ z, o9 } }, c! v5 A4 ~3 C3 k
if (GetAsyncKeyState(0x20))
J$ k\" |9 Z; _ {
\" G) b# l; }, r7 {1 _9 w* z2 B5 a player_sleep = l + 5;
; y8 l2 a! r* G/ v }
( X; w- ^ }( `. _ else: Q. v5 J- r2 n% v V
{
5 @* M. D/ |( z2 Q3 h player_sleep = l;
, j* u. k( X8 \ }3 e' G; x, s1 b
} 复制代码 4. 显示出小球
0 ?+ H9 \& I5 t5 ]7 d 在此游戏中,小球是一个实心圆,在easyx图形库中提供了一个画实心圆的函数—solidcircle函数,通过它我们就可以在窗口中显示小球了,但显示出的小球默认颜色为白色,为了区分不同的小球,我们还需使用setfillcolor函数来改变小球的颜色。因为显示的函数、玩家操作小球的函数等函数都是放在同一个while循环重复执行的,这样就会重复显示小球,所以我们还需要用到一个清屏函数cleardevice。为了使窗口更好看可以使用setbkcolor函数修改窗口的背景颜色,以及使用line函数在窗口中画一些线,函数setlinecolor可以改变线的颜色。void Show()6 `\" _6 j. t* \% }2 h
{
4 \! s/ _1 `: \ e* B! t( G
' t# Y r5 r* ^% R //设置地图
6 |( ?3 G' w0 s, f3 ^ SetWorkingImage(&map);' z( {; y/ Q0 F6 A. Q
//清屏/ A! k8 y3 _3 P. P) N- |, ?! c
cleardevice();
, B# `7 V0 A: z8 D% v6 p //背景颜色
+ I% ?0 z7 J* c setbkcolor(WHITE);
% ?5 Q, X6 ]' p- G3 j //划线颜色$ P* i8 p2 `/ Z4 u, b) H
setlinecolor(RGB(230,231,239));9 F' c5 b0 g3 E
//划线0 ^0 j. E, ?6 A# u+ G A
for (int i = 0; i < Wide_map; i += 10)
+ ~: t\" p) q2 k$ T {8 ]' k% S' q( w; f0 k/ ~
line(i, 0, i, Hight_map);; Q, v2 ^( i+ c* x
}
) g6 |. b& g( c( f2 u6 o for (int i = 0; i < Hight_map; i += 10)2 m$ w0 O5 a# }! f8 O
{
8 N V4 e* e) `. Q line(0, i, Wide_map, i);
& j) B1 b- x8 y% v/ ^ }! k\" L* _\" Y0 O8 y$ V0 F! S
//食物4 q9 ^7 r4 Z- `; R; ~
for (int i = 0; i < Food_num; i++)
8 k) O! d) n6 ?* S {( o- b: r; ?6 M9 V2 @4 r7 C! h/ o
setfillcolor(Food[i].color);
0 J& C# x$ I0 h1 b2 K solidcircle(Food[i].x, Food[i].y, Food[i].r);, T9 [. L& e& e/ X- ]
}
+ f- V) a4 A2 F9 \* P f //敌人
2 \) P' Z5 h7 e. T: S. ]6 f for (int i = 0; i < Enemy_num; i++)$ Y' C- i$ M! [5 {3 @
{
, T. l7 r) _* P setfillcolor(Enemy[i].color);5 ~0 P# Z8 r; `1 P
solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);1 q8 Q9 g# I2 {: @, Z' j9 B: W
}' c+ V, M, \3 @& m E# E5 [
//玩家
- B\" r4 s- t/ c setfillcolor(RED);1 q9 X$ D; e4 @
solidcircle(player.x, player.y, player.r);
0 v- Z3 F: e( e7 o9 G# U2 x- X SetWorkingImage();1 m1 d4 A1 D- D- p5 t
/ a) r; l1 @\" l- o: u; v
int x = player.x - (Wide / 2);7 k1 d* t- J1 `- ^% V: N
int y = player.y - (Hight / 2);$ W! w7 P4 L; Z7 u* J& G) m/ T\" W* a
//防止窗口越界
2 R- y( F. n0 o6 `7 r+ Z6 d/ S; G if (x < 0)/ P3 a8 a, V7 G. M) s# i+ Q
{$ h6 E# g\" F8 h* T4 |
x = 0;1 i' D7 s( W2 n# M/ ?- p' G
}4 a, Q0 \- [7 K7 c9 q! B
if (y < 0)7 D: p$ R: s9 Z6 ?. z
{
\" D. { D. u( p% J+ i4 D1 V y = 0;$ S; K& u* V6 A\" r8 u
}1 o; _6 T( G9 o. W; S
if (x > Wide_map - Wide)
3 g\" o. I3 Y2 T) X2 ] {
3 |9 C\" `8 ]5 e% R, a' F- f x = Wide_map - Wide;9 Z( b1 r# y9 n w1 p8 \0 q, ^% L
}4 p: A, |9 U, Y3 ~9 k
if (y > Hight_map - Hight)/ d- U6 R8 J5 \+ E( N6 Y: M' C q
{1 t4 n! m- o3 i ?0 A3 s5 x1 O
y = Hight_map - Hight;! ^& w$ K H3 y; l; l' \
} e; [5 E, V1 ~6 r. r0 O$ T2 j4 ]
//把map输出到窗口上
1 _: C% ^) k+ [; d! r putimage(0, 0, Wide, Hight, &map, x, y);8 c1 E1 a7 d5 @% J; R
} 复制代码 5. 生成地图" R: R7 n3 `& C0 P- Z& u, [
可以使用IMAGE map(Wide_map, Hight_map) 创建一个图像映射,其中 Wide_map 代表图像的宽度,而 Hight_map 代表图像的高度。然后使用SetWorkingImage(&map),将map的地址作为参数传递给SetWorkingImage函数。这个函数的作用是将map作为当前操作的对象,以便在后续的图像处理过程中使用。最后使用putimage(0, 0, Wide, Hight, &map, x, y) 将地址绘制到窗口上,其中要让玩家小球始终出现在窗口的中央位置,那么其中的x=player.x - (Wide / 2);y=player.y - (Hight / 2);但是单单这样写就会出现窗口越界的情况,所以我们还需要限制x和y的范围://防止窗口越界: v5 T2 |6 k ]3 W6 i# B, u
if (x < 0)
! q: {/ L; D! ^4 D( ]$ n! Q* t {( k4 i! ~' A- m& K3 C
x = 0;
: L5 ~0 f\" g0 q# R9 b6 ^7 x }
7 Z4 w, N. O% Z1 |4 i s if (y < 0)
0 D* D2 ?& L2 x7 s; M# z {
& j* e0 ?' s6 q; R4 }* W' R# i1 h Y% e y = 0;
3 C5 j5 Q) T8 O) {2 { }; S4 i0 y2 r\" X0 p+ Q; N9 i
if (x > Wide_map - Wide)9 t7 b: \ Q/ W! f& x8 F! I
{' ]0 w4 X1 y% c* J
x = Wide_map - Wide;
( h9 V: A9 S6 t/ i2 n }) X6 Y. c( j\" s5 e: `& P4 M8 l
if (y > Hight_map - Hight)- L& H( N B f* \\" q$ Z4 R
{
9 ?% o, r\" q( D y = Hight_map - Hight;
\" C( d4 H, z8 S' r: ? } 复制代码 putimage(0, 0, Wide, Hight, &map, x, y) 这个函数调用是用于在屏幕上的特定位置绘制或显示一个图像。下面是对这个函数调用中各个参数的具体解释:9 x A2 J; w6 c5 y- N3 d( Z- r
( E# l( w5 a7 I, D& U' H (0, 0):这是图像要绘制的目标位置的左上角坐标,即x=0和y=0,通常表示屏幕的左上角。- F" p) h" d) R# ?9 N' \# L$ n; R
: x3 n; |4 Q/ u% I
Wide:这个参数指定了要绘制的图像的宽度。
" e: R8 @0 s9 \# O+ O' d- T
T t2 m4 v& |/ _ Hight:这个参数指定了要绘制的图像的高度。 T: ?" V" m; X
# n5 Q0 J0 V! E% V3 ]
&map:这是一个指向图像内存地址的指针,该图像将被绘制到屏幕上。在这个上下文中,map可能是一个包含了图像数据的数据结构或数组。
9 b) r! n( Q) x. ?. W
7 t; S. j5 n6 x4 l x:这个参数通常指定了要开始绘制图像的起始点的x坐标(在图像数据中)。 Y9 Z1 g/ d: ]# N! q
3 e5 h. w# X: U5 m6 d, \( a y:这个参数通常指定了要开始绘制图像的起始点的y坐标(在图像数据中)。" n: w! @: Z+ }/ z
6. ai小球的移动7 R8 h D/ I: Q, U
随机生成0-3的数字分别代表ai小球上下左右的移动,这样小球就会自由移动了。当玩家小球与ai小球靠近时,ai小球会追击或者逃跑,这里我们需要先计算小球的之间的距离,小球之间的距离就是两小球的圆心坐标的x相减的平方加上y相减的平方再开根号。开根号的函数为sqrt,它的头文件是<math.h>。//距离
; X2 s0 c. b8 q+ U3 Q: C int Distance(int x, int y, int x1, int y1)
f, O0 F7 z: x4 _ {2 u$ d9 N9 z9 Y\" M
return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
+ w. W ~: x$ {9 H& }- e\" d: L3 U } 复制代码 然后判断两小球的距离是否小于50个像素点,即判断是否小于玩家小球的半径 + ai小球的半径 + 50。判断完后比较两小球的半径大小,如果ai小球的半径大于玩家小球的半径,那么ai小球就要追击玩家小球,即ai小球的坐标需要靠近玩家小球的坐标,就是如果ai小球的x大于玩家小球的x那么ai小球的x就减小,同理可得剩下的操作。void Enemy_move()) E6 c& k0 X+ r# g\" h; O. b
{
; \6 v- A2 T8 r srand((unsigned)time(NULL));
3 \% o\" W, x8 L$ b9 E for (int i = 0; i < Enemy_num; i++)7 C {( _0 s7 O0 Q
{. r( X! \, ^( B\" u/ k
int direction = rand() % 4;
! o' R) g0 I3 `! W& l8 y 6 v' ]% \! O; J5 b
if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) > player.r + Enemy[i].r + 50)
; B0 j6 i6 B& f2 D( J {: z8 j' j9 c f8 M7 @
if (direction == 0), _% J# J\" h; d: {
{) [$ \: `* e2 T
if (Enemy[i].y > 0)//防止小球越界的判断语句4 y1 E+ j5 y0 R( S- a9 s) F% k
{
: a% L3 Q' j3 v/ a Enemy[i].y -= enemy_sleep;
7 v) q5 v0 P6 j$ h b* ~ }' v* p! r5 l7 Q' G0 D+ l l
}
; Y' W, @' X8 l, s if (direction == 1)
/ v0 G' n2 w# r4 q# j1 { {4 W, d* E& w: }\" u! I# t6 x2 M
if (Enemy[i].y < Hight_map)
( a% k. U) F0 i! h\" X Enemy[i].y += enemy_sleep;4 ?* I9 Z0 ?6 r, S9 [5 u* [\" ?/ y2 W\" g
}
\" Q$ H4 V) u' W) a if (direction == 2)% j0 v* L) ^) m' _* e9 c+ N
{0 G5 a1 }0 ~* X7 K0 s1 `2 k
if (Enemy[i].x > 0)
+ I& f5 C3 ]; _4 n5 ?5 n# U Enemy[i].x -= enemy_sleep;. n0 B1 {4 O% D2 L; {0 h
}: n1 V. g& Z, n1 Y5 z2 N6 W
if (direction == 3)7 p j) v3 T! Y0 ^
{
9 Z9 j& e) v5 P7 x9 _& X$ G9 ^ u if (Enemy[i].x < Wide_map)
0 ~1 S, z }. ? Enemy[i].x += enemy_sleep;0 Z# C% j4 O* O6 }% D2 J2 X
}
5 e7 X { r& D6 e }0 j7 M) f! u' F+ l1 } O9 [4 P: W
//敌人追击玩家) p6 B3 o# j2 Q p, g. e
if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) < player.r + Enemy[i].r + 50)8 X [& u% m# y/ @% e1 H
{
% X+ _1 D5 }; z8 \\" B& k+ T/ K* u if (Enemy[i].r > player.r)
. J Q6 G3 ~ V6 |+ y8 u3 ]0 t2 Q4 ^ {2 _$ z5 m! M/ r( K2 I& J
if (Enemy[i].x < player.x)
3 \, w* e/ _; b- O/ P {
$ W) I9 w7 B v7 H. G/ h s if (Enemy[i].x < Wide_map): q' e; m* J4 \
{
4 g' q! U2 X* u3 s( s9 b& D Enemy[i].x += enemy_sleep;# |: L$ U! v# e$ h7 K ?
}
, E3 l7 o. z2 N! ^0 i* y }
+ e' `; a, [3 G+ f. B\" l if (Enemy[i].x > player.x). l) J* q8 a7 }1 C. W) X
{
/ \$ h# k+ b+ k if (Enemy[i].x > 0)
8 F/ U0 [8 D2 U( o9 Q\" L {
& x+ J! h; |8 W0 ~ Enemy[i].x -= enemy_sleep;
. W9 Y6 h$ c. j; ^% h }+ \* p3 t7 |5 B
}
& d1 l6 ^2 h: N+ U+ X if (Enemy[i].y < player.y)+ m: w$ }8 O( I- E I# v
{
. ` M1 ^6 L& ~ if (Enemy[i].y < Hight_map)
* ~- G: o# {. U8 W* w { R: n; o8 a& k2 c6 U
Enemy[i].y += enemy_sleep;
* @- G7 _# E7 f }
. N9 g5 F, Q& X' x3 a' F }
+ a8 W# S$ j% H( x if (Enemy[i].y > player.y). V9 ?% G5 p0 X/ k
{
5 Y) k* }! k4 j2 A ] if (Enemy[i].y > 0)\" ?3 E3 u5 F/ p. y; C* F
{
+ p6 y2 a\" H1 e- @# k Enemy[i].y -= enemy_sleep;
/ N+ n- R# c2 _8 l6 [$ `' A }9 V0 O3 R: O- D' U$ R
}4 Q4 ]$ B6 m9 U\" w+ O( W' W5 W ?$ g
}
`. _1 Z\" q2 @. e* J B' u //敌人逃跑( P- ?0 n+ B1 _1 F
else
# {4 G7 ?\" \& |/ l8 _! D% O {: `6 f1 B: j6 R7 T; u
if (Enemy[i].x < player.x)* l3 L2 O& C K1 h: C
{! ]2 l8 p2 u3 u7 ~5 k1 T. V
if (Enemy[i].x > 0)
7 G1 A# E. B2 ^ {
: J$ P2 a. e# `2 f# e Enemy[i].x -= enemy_sleep;
) K, {- P. a* A$ U\" J3 J }* J/ x0 J- w& `- ]3 v
}/ G7 c& I; R4 N- e
if (Enemy[i].x > player.x)
. ?6 T- }: V2 r {
3 c, w+ y$ A1 t if (Enemy[i].x < Wide_map)
4 ^, p! ^: S, S/ W4 H {8 d6 d3 q4 P; {0 R5 Z
Enemy[i].x += enemy_sleep;; J1 U# d2 }* a6 c u# ]
}\" C# L- j, d/ o9 t, Y
}
* j; A$ v: Y$ g Y9 [ if (Enemy[i].y < player.y)& d6 h, Y: V# Q
{8 \6 ^: [\" N8 L0 s
if (Enemy[i].y > 0)
+ [3 P$ l0 o$ X3 Q {( \# z: s- e$ ]( o
Enemy[i].y -= enemy_sleep;4 x5 K$ r* q T) ]5 _' c2 y m
}
6 u' ? P7 e: d, E& Z }* a* i6 A, m+ j @- q% D) g6 \
if (Enemy[i].y > player.y)
\" d8 G& ^/ j B w) S {- T& p) J8 I% o' e
if (Enemy[i].y < Hight_map)
% W\" B\" u) P9 } {
* d& P8 v) P* X# L5 a/ n# b/ I/ r Enemy[i].y += enemy_sleep; T( [5 y\" M9 K7 S
}7 z# w2 Y9 ~3 V% b
}* K- Y8 ]: J4 l9 p8 E$ v8 t
}
8 D/ q0 V# k8 I8 K0 u+ p3 R }
0 e2 X3 v7 x8 J( A( [7 } }
& M0 ^2 r4 m: `. ]/ c Q. Z } 复制代码 7. 小球之间的吞噬关系
0 C& x, n; ?+ g9 Y% \. E! x 玩家小球与ai小球、ai小球与ai小球:
当两小球的圆心小于最大的那个圆的半径时,小的那个球就会被吃掉。吃点就是那个小球重新找个位置生成。吃完后,吃的那个小球半径增加被吃小球半径的十分之一。
ai小球与食物小球、玩家小球与食物小球:同上
void EatFood()
- b( J) C1 x' y- S8 Z a {, |+ J% W% E% ^/ \8 h
for (int i = 0; i < Food_num; i++)
Y2 o2 f- ~ F3 t: u {' ^+ E u- `! K# B
//玩家吃食物2 i+ a* L$ F% N) u$ e
if (Distance(player.x, player.y, Food[i].x, Food[i].y) < player.r)' @9 W. Y8 t1 k& V
{. e, U! o, g+ O+ F* c
player.r += Food[i].r / 100;
8 W8 l8 Z\" I1 `7 j' B# P Food[i].x = rand() % Wide_map;2 Z l; ^( n\" G
Food[i].y = rand() % Hight_map;
: q% |# w ~* p2 l( y Food[i].r = rand() % 5 + 1;1 s2 d& j7 B' _! O. l% d7 M* Z7 Y% z
Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);7 ]3 d6 ?$ U3 e1 R
}( m+ ]- m( N) C. ~
* \7 k; ~5 F B- A }4 Z. c3 X7 G# ]/ L0 j
for (int j = 0; j < Enemy_num; j++)
. J# n Q/ z+ B! C/ a/ R {# t) U( x5 R8 M2 H9 v\" V! Q' Z
//敌人吃食物
9 @, J; |4 Z! c3 E$ O\" r for (int i = 0; i < Food_num; i++)3 C+ e2 L# A0 P: B% R, ^5 Z
{
2 C! A- ^6 S9 Q6 F# T if (Distance(Enemy[j].x, Enemy[j].y, Food[i].x, Food[i].y) < Enemy[j].r)
, c. Z l4 C4 S\" Q0 q2 Q {2 c( e. a9 P' ^: e
Enemy[j].r += Food[i].r / 50;
9 z. i( b# Y8 l0 i. v& V Food[i].x = rand() % Wide_map;& g5 B. z) r0 z' p4 A
Food[i].y = rand() % Hight_map;1 c( M' _) O4 T/ f0 |$ D6 G
Food[i].r = rand() % 5 + 1;/ ]) K+ K' x* }7 T
Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
8 u' z# p5 k4 d+ X f }
% o7 T8 L1 }3 \/ N7 \ }
% E6 e5 U& J$ Q* ^8 X //敌人吃敌人* @6 i4 _! ], X4 T* l- A
for (int i = 0; i < Enemy_num; i++)' _) G! L Z, A) u1 X7 G* |( j
{) Q9 `- r- o/ Y
if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r&& Enemy[j].r > Enemy[i].r)
, E( Q: h8 M; ]4 ]+ a+ e7 l* Q {+ f% u+ t0 M2 F, ~% |
Enemy[j].r += Enemy[i].r / 10;+ F- h+ _ r5 K
Enemy[i].x = rand() % Wide_map;
) Z- b$ _: U: ]' t w& l4 n- K8 E Enemy[i].y = rand() % Hight_map;
- N* ~ U9 G4 |\" [0 \ Enemy[i].r = 10;
0 X5 {5 d8 o. f Enemy[i].color = RGB(0, 255, 0);
# ]9 y ^! W. X4 b- ~3 \! { }
! g. F+ ?* z. s. R% o if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[i].r && Enemy[j].r < Enemy[i].r)
, W9 e( t$ l3 u3 U5 Y- f {\" e\" v5 |, ^7 U9 h
Enemy[i].r += Enemy[j].r / 10;/ G! P( ^% \# t* x& ]
Enemy[j].x = rand() % Wide_map;! y7 T; K: Y# \
Enemy[j].y = rand() % Hight_map;4 o\" ^ p. k% P6 o
Enemy[j].r = 10;
2 i0 H0 ^# g0 F9 E! O1 y; D Enemy[j].color = RGB(0, 255, 0);7 P1 V\" ^8 {! Q; ]2 h
}4 N0 S* S b7 n' v
}
$ P0 Q! u4 x$ U' Z( y if (Distance(player.x, player.y, Enemy[j].x, Enemy[j].y) < player.r)$ ]; M* b4 b9 j, p' F& q% Q/ M% S
{
: \5 t0 _1 y! @ //玩家吃敌人$ E/ C- x/ P- c+ W( V9 k+ a
if (player.r > Enemy[j].r)
5 S2 k- p, w\" G, j\" k7 I; Z2 y {
% u8 F3 _6 g* i8 N player.r += Enemy[j].r / 10;/ Y1 h0 f4 I2 P) v# o0 V
Enemy[j].x = rand() % Wide_map;
' j* A# |1 ~) x7 T1 ` Enemy[j].y = rand() % Hight_map;
( a; G& Y- U/ f, Q' c2 @* W3 ~; A1 H Enemy[j].r = 10;9 |) _7 n8 c& p1 \0 q
Enemy[j].color = RGB(0, 255, 0);) g. ]0 c7 Y3 z4 O0 J! a) J
}$ ^\" d0 G1 i2 Y) x7 R' e8 P
//敌人吃玩家! D2 y: j! u ?! L
else0 u( h& G: \- [
{9 H$ S/ Z! j- a& }
if (invincibility == 0)2 [4 p% i7 i0 O6 g4 I
{
# f& s6 e1 E F/ v Enemy[j].r += player.r / 10;
4 g) }- j4 R% F3 \/ s' s! r4 q player.x = Wide / 2;
2 ^: T1 {4 D6 Q' Y8 {( s1 } player.y = Hight / 2;5 W0 ~, H8 G2 D' Y& s8 P! u( f) [
player.r = 10;/ b9 Y, p( v7 L. B3 O
invincibility = 10;
* a! Z$ x& D+ V! a: e. Y. }6 } }, I0 E- T7 W- n4 x4 B
}* w. `5 T! @3 Q. R: \& ^$ r- m( V
}\" f% n- @! r- O1 A( L; O& T
}0 Q5 V8 r# F; P3 P' g' ~6 D
} 复制代码 完整代码见附件:. r' f+ Q& t) U# V& o( k
8 O& y0 P( l1 M$ s. T1 V B
8 V7 z' j- `* |: w7 I
6 z$ _3 r0 W3 V g% k
代码.txt
8.72 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录 ]
[购买 ]
zan