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