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