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