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