用户:
有趣的力士甲虫D8IF查看:0 回复:5 评论:0 创建时间:2021-08-05T14:39:42
【作品展示】

【作品介绍】
这是一个跑酷游戏作品!花了长时间打造而成!
具体游戏规则在初始界面已解释!
关于部分功能没有完善,
也只能就这样啦。
具体素材我会放在评论区。
【作品源代码】
from arcade import *
from player import *
from Map import *
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = '奇妙的跑酷'
class MyGame(arcade.Window):
def __init__(self,width,height,title):
super().__init__(width,height,title)
# 提前设置
self.time = 0
self.time_2 = 0
self.g_time = 0
self.spawnpoint_x, self.spawnpoint_y = 100,100
# 游戏关卡设置(当前共四关)
self.level = 0
self.setup()
def setup(self):
# 图片设置
self.aduan = Sprite('aduan.png')
self.aduan.center_x,self.aduan.center_y = SCREEN_WIDTH-90,50
self.game_over_image = Sprite('game_over.png')
self.game_over_image.center_x,self.game_over_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.game_win_image = Sprite('game_win.png')
self.game_win_image.center_x,self.game_win_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
# 背景设置
Image.open('codemao.png').resize((800,600)).save('codemao.png')
self.start_image = Sprite('start.png')
self.start_image.center_x,self.start_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.forest_image = Sprite('forest.png')
self.forest_image.center_x,self.forest_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.sea_image = Sprite('sea.png')
self.sea_image.center_x,self.sea_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.water_image = Sprite('water.png')
self.water_image.center_x,self.water_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.codemao_image = Sprite('codemao.png')
self.codemao_image.center_x,self.codemao_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
# 标志加载
self.forest_sign = Sprite('forest_sign.png')
self.forest_sign.center_x,self.forest_sign.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT-100
self.sea_sign = Sprite('sea_sign.png')
self.sea_sign.center_x,self.sea_sign.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT-100
self.water_sign = Sprite('water_sign.png')
self.water_sign.center_x,self.water_sign.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT-100
self.codemao_sign = Sprite('codemao_sign.png')
self.codemao_sign.center_x,self.codemao_sign.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT-100
# 调用其他文件
self.player = Player()
self.player.player.center_x = self.spawnpoint_x
self.player.player.center_y = self.spawnpoint_y
self.maps = Map()
# 变量设置
self.game_over = False
self.game_win = False
self.air = 10
self.l_time = 0
self.fishes = SpriteList()
self.rains = SpriteList()
self.darkness = False
self.attacks = SpriteList()
# 复活设置
if self.level == 1:
self.set_level('levels/forest.txt',self.spawnpoint_x,self.spawnpoint_y)
if self.level == 2:
self.set_level('levels/sea.txt',self.spawnpoint_x,self.spawnpoint_y)
if self.level == 3:
self.set_level('levels/water.txt',self.spawnpoint_x,self.spawnpoint_y)
if self.level == 4:
self.set_level('levels/codemao.txt',self.spawnpoint_x,self.spawnpoint_y)
# 声音
self.game_over_sound = load_sound('game_over_sound.wav')
self.game_sound = load_sound('lottery.wav')
def on_draw(self):
start_render()
# 背景绘制
if self.level == 0:
self.start_image.draw()
draw_text('奇 妙 跑 酷',SCREEN_WIDTH/2-280,SCREEN_HEIGHT-200,color.ORANGE,font_size=80,font_name=('simhei','PingFang'))
draw_text('按 P 键 开始游戏',SCREEN_WIDTH/2-200,300,color.YELLOW,font_size=40,font_name=('simhei','PingFang'))
draw_text('游戏规则:这是一个跑酷游戏!左右键移动角色,上键跳跃,撞到刺会喵亡,',
0,200,color.PINK,font_size=20,font_name=('simhei','PingFang'))
draw_text('碰到房子过关,星星为存档点,每关也有自己的专属特性,游戏难度较大,',
0,175,color.PINK,font_size=20,font_name=('simhei','PingFang'))
draw_text('请耐心游玩!',0,150,color.PINK,font_size=20,font_name=('simhei','PingFang'))
if self.level == 1:
self.forest_image.draw()
self.forest_sign.draw()
if self.level == 2:
self.sea_image.draw()
self.sea_sign.draw()
draw_text(f'剩余氧气:{self.air}',0,SCREEN_HEIGHT-35,color.RED,font_size=30,font_name=('simhei','PingFang'))
draw_text('屏幕左右会出现河豚,碰到就会喵,左上角显示氧气',250,575,color.RED,font_size=20,font_name=('simhei','PingFang'))
draw_text(',归0喵,碰到白色粗线可恢复氧气',250,550,color.RED,font_size=20,font_name=('simhei','PingFang'))
if self.level == 3:
self.water_image.draw()
self.water_sign.draw()
draw_text('天上会落下水滴,撞到会喵',0,575,color.RED,font_size=20,font_name=('simhei','PingFang'))
if self.level == 4:
self.codemao_image.draw()
self.codemao_sign.draw()
self.aduan.draw()
draw_text('每过一段时间会黑屏,一段时间后恢复正常,屏幕右方有阿短在上下不断移',0,575,color.RED,font_size=20,font_name=('simhei','PingFang'))
draw_text('动发射飞镖,碰到飞镖会喵',0,550,color.RED,font_size=20,font_name=('simhei','PingFang'))
# 角色绘画
if self.level >= 1:
self.player.player.draw()
self.no_images.draw()
for image in self.images:
if image.center_x >= -50 and image.center_x <= SCREEN_WIDTH+50 \
and image.center_y >= -50 and image.center_y <= SCREEN_HEIGHT+50:
self.images.draw()
# 黑暗
if self.darkness:
draw_rectangle_filled(SCREEN_WIDTH/2,SCREEN_HEIGHT/2,SCREEN_WIDTH,SCREEN_HEIGHT,color.BLACK)
# 结束
if self.game_over:
self.game_over_image.draw()
draw_text('按 SPACE 键 重新开始',SCREEN_WIDTH/2-130,SCREEN_HEIGHT-200,color.RED,font_size=20,font_name=('simhei','PingFang'))
if self.game_win:
self.game_win_image.draw()
draw_text('按 SPACE 键 重新开始',SCREEN_WIDTH/2-130,SCREEN_HEIGHT-200,color.RED,font_size=20,font_name=('simhei','PingFang'))
def set_level(self,txt,spawn_x,spawn_y):
self.lists = self.maps.set_level(open(txt))
self.images = self.lists[0]
self.traps = self.lists[1]
self.checkpoints = self.lists[2]
self.houses = self.lists[3]
self.no_images = self.lists[4]
self.helps = self.lists[5]
self.nexts = self.lists[6]
self.maps.set_level(open(txt))
self.player.player.center_x = spawn_x
self.player.player.center_y = spawn_y
def on_update(self,delta_time):
if not self.game_over and not self.game_win:
if self.level >= 1:
# 时间增加
self.time += delta_time
self.time_2 += delta_time
# 音乐的部分
if int(self.time_2) % 73 == 1 and int(self.g_time) != int(self.time_2):
play_sound(self.game_sound)
self.g_time = self.time_2
# 不同关卡的处理
if self.level == 2:
if int(self.time) % 1 == 0 and int(self.l_time) != int(self.time):
self.spawn_fishes()
if int(self.time) % 1 == 0 and int(self.l_time) != int(self.time):
self.air -= 1
self.l_time = self.time
breath = check_for_collision_with_list(self.player.player,self.helps)
if breath:
self.air = 10
if self.level == 3:
if int(self.time) % 1 == 0 and int(self.l_time) != int(self.time):
self.spawn_rains()
self.l_time = self.time
if self.level == 4:
if int(self.time) % 5 == 4:
self.darkness = True
if int(self.time) % 5 == 0:
self.darkness = False
if int(self.time) % 1 == 0 and int(self.l_time) != int(self.time):
self.aduan_attack()
self.l_time = self.time
# 清除
for fish in self.fishes:
if fish.center_x <= -500 or fish.center_x >= 1300:
fish.喵()
for attack in self.attacks:
if attack.center_x <= -100:
attack.喵()
for rain in self.rains:
check = check_for_collision_with_list(rain,self.images)
if check:
rain.喵()
if rain.center_y <= -50:
rain.喵()
# 阿短的移动
if self.aduan.center_y < 50:
self.aduan.center_y = 50
if self.aduan.center_y > SCREEN_HEIGHT-99:
self.aduan.center_y = SCREEN_HEIGHT-99
# 检测角色喵亡
if self.player.rell_y < -500 or self.player.died or self.air <= 0:
self.game_over = True
play_sound(self.game_over_sound)
# 角色处理逻辑
self.player.player.update()
self.player.my_update(self.images,self.traps,self.checkpoints)
self.images.update()
self.aduan.update()
self.no_images.update()
# 过关判断
next_level = check_for_collision_with_list(self.player.player,self.nexts)
if next_level:
self.level += 1
self.spawnpoint_x,self.spawnpoint_y = 100,100
# 清除所有角色
for image in self.images:
image.喵()
for no_image in self.no_images:
no_image.喵()
self.player.player.喵()
if self.game_win:
self.level = 0
self.setup()
# 胜利判断
win = check_for_collision_with_list(self.player.player,self.houses)
if win:
self.game_win = True
# 屏幕移动
if self.player.player.right >= SCREEN_WIDTH-201:
while self.player.player.left >= SCREEN_WIDTH-205:
for image in self.images:
image.center_x -= 5
for no_image in self.no_images:
no_image.center_x -= 5
self.player.player.center_x -= 5
if self.player.player.left <= 201:
while self.player.player.right <= 205:
for image in self.images:
image.center_x += 5
for no_image in self.no_images:
no_image.center_x += 5
self.player.player.center_x += 5
if self.player.player.top >= SCREEN_HEIGHT-151:
while self.player.player.bottom >= SCREEN_HEIGHT-155:
for image in self.images:
image.center_y -= 5
for no_image in self.no_images:
no_image.center_y -= 5
self.player.player.center_y -= 5
if self.player.player.bottom <= 151:
while self.player.player.top <= 155:
for image in self.images:
image.center_y += 5
for no_image in self.no_images:
no_image.center_y += 5
self.player.player.center_y += 5
# 存档点的设置
hit_list_checkpoints = check_for_collision_with_list(self.player.player,self.checkpoints)
if hit_list_checkpoints:
for hit in hit_list_checkpoints:
self.spawnpoint_x = hit.rell_x
self.spawnpoint_y = hit.rell_y
hit.喵()
def on_key_press(self, symbol, modifiers):
if not self.game_over and not self.game_win:
self.player.move(symbol)
if symbol == key.K:
image = get_image(0,0,SCREEN_WIDTH,SCREEN_HEIGHT)
image.save('image.png')
if self.level == 0:
if symbol == key.P:
self.set_level('levels/forest.txt',100,100)
self.level = 1
else:
if symbol == key.SPACE:
# 清除所有角色
for image in self.images:
image.喵()
for no_image in self.no_images:
no_image.喵()
self.player.player.喵()
if self.game_win:
self.level = 0
self.setup()
def on_key_release(self,symbol,modifiers):
if not self.game_over:
self.player.unmove(symbol)
def spawn_fishes(self):
where = random.randint(1,2)
if where == 1:
fish = Sprite('fish2.png')
fish.center_x = -100
fish.change_x = 5
else:
fish = Sprite('fish1.png')
fish.center_x = 900
fish.change_x = -5
fish.center_y = random.randint(50,550)
self.fishes.append(fish)
self.no_images.append(fish)
self.traps.append(fish)
def spawn_rains(self):
for i in range(3):
rain = Sprite('rain.png')
rain.center_y = random.randint(1000,1200)
rain.center_x = random.randint(0,SCREEN_WIDTH)
rain.change_y = random.randint(-5,-3)
self.rains.append(rain)
self.traps.append(rain)
self.no_images.append(rain)
def aduan_attack(self):
attack = Sprite('attack.png')
attack.center_x = self.aduan.center_x
attack.center_y = self.aduan.center_y
attack.change_x = -8
self.aduan.change_y = random.choice([10,-10])
self.attacks.append(attack)
self.traps.append(attack)
self.no_images.append(attack)
if __name__ == '__main__':
game = MyGame(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_TITLE)
run()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn
有趣的力士甲虫D8IF图片素材:aduan
attack
breath
block
check_player_left

check_player_bottom
check_player_right
check_player_top
checkpoint
codemao
codemao_sign
cool_cool
fish1
fish2
floor
forest
forest_sign
game_over
game_win
grass
house
rain
sand
sea
sea_sign
start
thorn_bottom
thorn_left
thorn_right
thorn_top
water
water_sign
点赞0
评论
有趣的力士甲虫D8IF另一py文件player
from arcade import *
class Player(Sprite):
def __init__(self):
super().__init__()
self.player = Sprite('cool_cool.png')
# 关于坐标
self.rell_y = 100
# 关于移动
self.left_move = False
self.right_move = False
self.max_speed = 8
self.min_speed = 5
self.add_speed = 0.1
self.left_speed = 5
self.right_speed = 5
# 关于跳跃
self.jump_time = 0
self.drop = False
self.jump = 0
self.up = False
# 碰撞箱
self.check_left = Sprite('check_player_left.png')
self.check_right = Sprite('check_player_right.png')
self.check_top = Sprite('check_player_top.png')
self.check_bottom = Sprite('check_player_bottom.png')
# 关于角色
self.died = False
def move(self, symbol):
if symbol == key.LEFT:
self.left_move = True
self.left_speed = self.min_speed
if symbol == key.RIGHT:
self.right_move = True
self.right_speed = self.min_speed
if symbol == key.UP:
self.up = True
def unmove(self,symbol):
if symbol == key.LEFT:
self.left_move = False
if symbol == key.RIGHT:
self.right_move = False
if symbol == key.UP:
self.up = False
def my_update(self,images,traps,checkpoints):
# 与陷阱的碰撞
hit_list_traps = check_for_collision_with_list(self.player,traps)
if hit_list_traps:
for hit in hit_list_traps:
self.died = True
# 设置碰撞箱的位置
self.check_left.right = self.player.right+8.1
self.check_left.top = self.player.top+10
self.check_right.left = self.player.left-8.1
self.check_right.top = self.player.top+10
self.check_top.bottom = self.player.top
self.check_top.left = self.player.left
self.check_bottom.top = self.player.bottom-1
self.check_bottom.left = self.player.left
hit_list_left = check_for_collision_with_list(self.check_left,images)
hit_list_right = check_for_collision_with_list(self.check_right,images)
hit_list_top = check_for_collision_with_list(self.check_top,images)
hit_list_bottom = check_for_collision_with_list(self.check_bottom,images)
# 左右移动
if self.left_move and not hit_list_right:
self.player.center_x -= self.left_speed
if self.left_speed <= self.max_speed:
self.left_speed += self.add_speed
if self.right_move and not hit_list_left:
self.player.center_x += self.right_speed
if self.right_speed <= self.max_speed:
self.right_speed += self.add_speed
if hit_list_bottom and not hit_list_top:
for hit in hit_list_bottom:
self.temp_y = self.player.center_y
self.player.bottom = hit.top + 2
self.rell_y += self.player.center_y - self.temp_y
# 降落
if self.jump > 20 and self.up:
self.center_y += self.jump / 15
self.rell_y += self.jump / 15
self.jump -= 1
if self.drop and not hit_list_bottom:
self.player.center_y -= self.jump_time*3
self.rell_y -= self.jump_time*3
self.jump_time += 0.3
# 跳跃
else:
self.drop = False
self.jump_time = 8
if self.up and self.jump < 20 and not hit_list_top:
self.jump_time -= 0.1
self.player.center_y += self.jump_time*1.5
self.rell_y += self.jump_time*1.5
self.jump += 1
else:
self.jump_time = 0
self.jump = 0
self.drop = True
点赞0
评论
有趣的力士甲虫D8IF另一py文件Map
from arcade import *
class Map(Sprite):
def __init__(self):
super().__init__()
self.images = SpriteList()
self.traps = SpriteList()
self.checkpoints = SpriteList()
self.houses = SpriteList()
self.no_images = SpriteList()
self.helps = SpriteList()
self.nexts = SpriteList()
def set_level(self,txt):
txt = txt.read()
txt = txt.喵().split('\n')
x = 0
y = 0
for t in txt:
y += 50
for t in txt:
for i in t:
if i == '1':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
self.images.append(grass)
if i == '2':
sand = Sprite('sand.png')
sand.center_x,sand.center_y = x,y-50
self.images.append(sand)
if i == '3':
floor = Sprite('floor.png')
floor.center_x,floor.center_y = x,y-50
self.images.append(floor)
if i == '4':
block = Sprite('block.png')
block.center_x,block.center_y = x,y-50
self.images.append(block)
if i == '5':
breath = Sprite('breath.png')
breath.center_x,breath.center_y = x,y-50
self.no_images.append(breath)
self.helps.append(breath)
if i == 'c':
thorn = Sprite('thorn_bottom.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'bottom'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'd':
thorn = Sprite('thorn_left.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'left'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'e':
thorn = Sprite('thorn_top.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'top'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'f':
thorn = Sprite('thorn_right.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'right'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'g':
checkpoint = Sprite('checkpoint.png')
checkpoint.center_x,checkpoint.center_y = x,y-50
checkpoint.rell_x,checkpoint.rell_y = x,y-50
self.checkpoints.append(checkpoint)
self.no_images.append(checkpoint)
if i == 'h':
house = Sprite('house.png')
house.center_x,house.center_y = x,y-50
self.houses.append(house)
self.no_images.append(house)
if i == 'i':
house = Sprite('house.png')
house.center_x,house.center_y = x,y-50
self.nexts.append(house)
self.no_images.append(house)
x += 50
x = 0
y -= 50
return (self.images,self.traps,self.checkpoints,self.houses,self.no_images,self.helps,self.nexts)
点赞0
评论
有趣的力士甲虫D8IFtxt文件forest:
00000000000000001
00000000000000001
00000000000000001
0000000000000000喵0000000111
000000000000000010000000011喵00000111d
0000000000000000喵0000000000000000001d000000000000000000000000000000000ccc000ccc000ccc000ccc000ccc
0000000000000000喵0000000000000000001d0000c00c0000000000000000000000000111000111000111000111000111
0000000000000000111喵0000000000000001000001111d000000000000000000000000eee000eee000eee000eee000eee
000000c00c000000喵0000000000000000000000000001d0cc0000g0000000000000000
000000111喵00000000000000000000000000000000001111100011喵00000000000000000000000000000000000000000000000000000000000000000000000i
000000000000000000000000000000000000000000000000000000000000000000000000000000001110001110001110001110001110001111d0000000c0000000c0000000000000011
1111110000111111111喵0000000000000000000000000000000000000000011喵00000000000000000000000000000000000011100000111000011111
txt文件sea:
00000000000000000000
00000000000000000000
00000000000000000000
000000000000000022200000000000000000000000000000000000000000000000000000000000cc00cc00cc
0000000000000000002000000000000000000000022000022000000000000000000000000000002200220022
000000000000000005200000000000000022000002000000000022000000000000000000000000ee00ee00ee00000000000i
00000000000000002220000000000022000000cg520000000000000022000000000000000000000000000000000022000022
200000000000000000000000002200000000002222000000000000000000000000000000000000000000000000002
2000000222000000ccc00022000000000000000000000000000000000000000c0g520000000200220022002200222000
2000000000000022222200000000000000000000000000000000000000000002222200000222
22222000000000000000
00000000000000000000
txt文件water:
00000000000000000c00000000000000000cccc
0000000000000000040000000000000000044440000000000000000000000000000000000000000000000000000000000000000000000000i
00000000000000000400000000000000000000400000000000000000000000000000000000000000000000444000004440000044400000444
000000000000000004000000000000000c000040000000000000000000000000ccccc00000000000000000400
00000000000000000400000000g000000444df400000000000000000000000044444440000000000000000400
000000000000000004000000004444000004df400000000000000004440000000000000000000000000000444
000000000000000004000000000000000004df400000000000000c00000000000000000000000000000000400
000000000000000004000000000000000004df400000000000044400000000000000000000000000000000400
000000000004400004000000000000ccc444df400000000f40000000000000000000000000000000000000444
000000000000400000000000000044444004d000000000f40000000000000000000000000000000000000000
4000004400004cc000000004400000000004d0000004400000000000000000000000000000000c00c000000g
4000000000004444400400000000000000044444000000000000000000000000000000000000044440000044444444
4444000000000000
0000000000000000
txt文件codemao:
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000003000000
000000000000000000000003000000
000000000000000000000003d000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cccccccc
000000000000000000000003d00003000000000000000000000000000000000000000000000000000000000000000000000000000000000f30003330000000000000f33333333
000000000000000000000003dg0003000000000000000000000000000000000000000000000000000000000000000000000000000000000f30000000000333000000f3
000000000000000000000003330003000000000000000000000000000033300000000000000000000000000000000000000000000000000f30000000000000000000f3
000000000000000000000000000003000000000000000000000000000000000000033300000000000000000000000000000000000000000f30000000000000000000f3
00000000000000000000000000000300000000000000000000333000000000000000000000003330000000000000000000000g000000000330000000000000000000f3
300000000000003333000003330003000000333000333000000000000000000000000000000000000000333000003330000033300033000000000000000000000000f3
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3
30000000333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000h
333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000333
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003330000033300000333
点赞0
评论