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