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