角色响应键盘按键,并在地图上移动及其他功能?

3 投票
1 回答
951 浏览
提问于 2025-04-18 03:41

你好,我今年13岁,已经编程一年半了(其实是从12岁开始的)。我需要一些建议,想知道怎么让角色在地图上用键盘移动,而不使用任何包或者pygame。我希望角色能在我创建的地图上移动,使用特定的按键之类的。我还需要帮助来创建一个菜单系统,这样才能真正启动游戏。以下是我的代码。

class Map(self, keyboard):
    """ View of characted being moved to new location. """    

class Character():
    def Character(object):
        C = player(hero)
        hero = {'name' : 'Hero',
                 'lvl' : 1,
                 'xp' : 0,
                 'lvlNext' : 25,  
                 'stats' : {'str' : 1,
                            'dex' : 1,
                            'int' : 1,
                            'hp' : 30,
                            'atk' : [5, 12]}}
    def update(self, C, map):
        """ Move player based on keys pressed. """
        if keyboard.is_pressed(K_w, C, map):
            self.C
            self.map
            self.y -= 1
        if keyboard.is_pressed(K_s, C, map):
            self.C
            self.map
            self.y += 1
        if keyboard.is_pressed(K_a, C, map):
            self.C
            self.map 
            self.x -= 1
        if keyboard.is_preseed(K_d, C, map):
            self.C
            self.map
            self.x += 1

        else:
            print(" Waiting for your move. ")

class Enemy():
    def Enemy(object):
        f = enemy(fly)
        fly = {'name' : 'Fly',
                 'lvl' : 1,
                 'reward' : 25,
                 'xp' : 0,
                 'lvlNext' : 25,
                 'stats' : {'str': 1,
                            'int' : 1,
                            'hp' : 30,
                            'atk' : [5, 12]}}

    def move(self, f, map):
        """ Move """


class Wall()
    def Wall(object):
        P = wall(solid)
        solid = ['name' : 'Solid',
                 'Function' : 








    c = chest
    d = door
    DD = door




map = """

     PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
     P|-----------------------------------------------------|P 
     P|  |--------| |-------|------------|  |---------------|P
     P|  |      |PPDPPPPPPPP|            |  |               |P
     P| C|      |P         P|  f         |  |               |P
     P|  |      |P   f     P|            |  |               |P
     P|  |      |P         P|            d  d               |P
     P|  |      |P         P|            |  |               |P
     P|  |      |P         P|            |  |               |P 
     P|  |      |P         P|            |  |    cccc       |P
     P|  |      |PPPPPPPPPPP|            |  |    c  c       |P
     P|__d_______|P|_________d___________|  |____cccc_______|P       
     PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPDDPPPPPPPPPPPPPPPPPP

      """




class Keyboard(self, character, map):
    """ Key board controls. """
    def update(self):
        """ Move hero based on keys pressed. """
        if keyboard.is_pressed(K_w, p, map):
            self.y -= 1
        if keyboard.is_pressed(K_s, p, map):
            self.y += 1
        if keyboard.is_pressed(K_a, p, map):
            self.x -= 1
        if keyboard.is_preseed(K_d, p, map):
            self.x += 1

hero = {'name' : 'Hero',
                 'lvl' : 1,
                 'xp' : 0,
                 'lvlNext' : 25,
                 'stats' : {'str' : 1,
                            'dex' : 1,
                            'int' : 1,
                            'hp' : 30,
                            'atk' : [5, 12]}}

fly = {'name' : 'Fly',
                 'lvl' : 1,
                 'reward' : 25,
                 'xp' : 0,
                 'lvlNext' : 25,
                 'stats' : {'str': 1,
                            'int' : 1,
                            'hp' : 30,
                            'atk' : [5, 12]}}

def level(char):
    nStr, nDex, nInt = 0, 0, 0
    while char['xp'] >= char['lvlNext']:
        char['lvl'] += 1
        char['xp'] = char['xp'] - char['lvlNext']
        char['lvlNext'] = round(char['lvlNext'] * 1.5)
        nStr += 1
        nDex += 1
        nInt += 1

    print('level:', char['lvl'])

    print('STR {} +{} DEX {} +{} INT {} +{}'.format(char['stats']['str'], nStr,
                                                    char['stats']['dex'], nDex,
                                                    char['stats']['int'], nInt))
    char['stats']['str'] += nStr
    char['stats']['dex'] += nDex
    char['stats']['int'] += nInt

from random import randint

def takeDmg(attacker, defender):
    dmg = randint(attacker['stats']['atk'][0], attacker['stats']['atk'][1])
    defender['stats']['hp'] = defender['stats']['hp'] - dmg
    if defender['stats']['hp'] <= 0:
        print('{} has been slain'.format(defender['name']))
        hero['xp'] += fly['reward']
        level(hero)
        input('Press any key to quite.')
        exit(0)

从这里你可以看到我想做的事情。我需要地图,还有一个叫做 "Game_Sys" 的东西,它相当于菜单,我希望菜单能对我设置的任何按键做出反应。现在我已经建立了关卡系统,它实际上是可以工作的。我还建立了敌人和奖励系统,打败敌人后我的等级会提升,经验值会增加,如果经验值超过当前等级的上限,我就会升级。不过现在我想在没有PYGAME和任何包的情况下,让 "p = player blablabla" 在地图上移动。这个程序是基于文本的,所以希望能让它运行起来。总之,如果有人看到我的错误,能给我一些帮助和建议,我会非常感谢。我的目标是让 "C" 在我创建的地图上移动,如果我靠近 "f",我就会被攻击,或者开始一场战斗,然后再继续。

我可以用livewires打开游戏窗口吗,还是必须用pygame才能打开游戏窗口?我可以找个伙伴来帮忙吗?我确实需要有人帮忙。

1 个回答

3

用文本来做冒险游戏并加上地图,在Python里实现起来会比较困难。Livewires本身不是一个图形界面工具,但课程里很多例子都需要用到pygame。我其实不知道这个工具现在还在维护,它算是个比较老的工具了。

所以,你遇到的问题就是地图的显示。大多数Python解释器的问题在于,要在地图上显示移动,你必须在每次移动时都重新打印整个地图。

my_map = """

 PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 P|-----------------------------------------------------|P 
 P|  |--------| |-------|------------|  |---------------|P
 P|  |      |PPDPPPPPPPP|            |  |               |P
 P| C|      |P         P|  f         |  |               |P
 P|  |      |P   f     P|            |  |               |P
 P|  |      |P         P|            d  d               |P
 P|  |      |P         P|            |  |               |P
 P|  |      |P         P|            |  |               |P 
 P|  |      |P         P|            |  |    cccc       |P
 P|  |      |PPPPPPPPPPP|            |  |    c  c       |P
 P|__d_______|P|_________d___________|  |____cccc_______|P       
 PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPDDPPPPPPPPPPPPPPPPPP

"""

这样做会非常频繁,消耗大量内存。不过,使用这个地图和Pygame,你可以生成一个游戏,利用你已经写的大部分(如果不是全部的话)代码。

你需要做的事情有:

  • 把你的地图转换成数组。 在pygame中,你可以很容易地从图片生成一个地图网格(比如:这是一扇门,这是玩家,这是一只苍蝇,这是一片空地,这是一面墙)。既然你已经有了地图,如果把它转换成数组,你就可以轻松生成地图。你会得到一个数组的数组,然后可以像访问(x,y)坐标那样访问它。

示例伪代码:

for y in final_rows:
    for x in y:
        if x == 'P':
            render_P()
        elif x == 'f':
            render_fly()
        #... etc.
  • 获取用户输入。 现在你还没有获取用户输入。Pygame让这件事变得简单,可以查看文档这个回答了解更多。
  • 创建菜单和其他游戏所需的东西。 你已经知道需要做这些,我只是为了完整性把它写在这里。

如果你还没发现,我非常推荐pygame来处理所有图形界面的事情,但如果你发现它不适合你,可以查看这个页面,那里有一个关于Python图形界面和其他游戏制作工具的详细列表。

祝你好运!

编辑: 这就是我说的把地图做成数组/列表的意思:

my_map = """
 PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 P|-----------------------------------------------------|P 
 P|  |--------| |-------|------------|  |---------------|P
 P|  |      |PPDPPPPPPPP|            |  |               |P
 P| C|      |P         P|  f         |  |               |P
 P|  |      |P   f     P|            |  |               |P
 P|  |      |P         P|            d  d               |P
 P|  |      |P         P|            |  |               |P
 P|  |      |P         P|            |  |               |P 
 P|  |      |P         P|            |  |    cccc       |P
 P|  |      |PPPPPPPPPPP|            |  |    c  c       |P
 P|__d_______|P|_________d___________|  |____cccc_______|P       
 PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPDDPPPPPPPPPPPPPPPPPP
"""

#split map into rows (y-values)
unprocessed_rows = my_map.split('\n')

#initialize list
final_rows = []

#process rows
for row in unprocessed_rows:

    #remove spaces on either side
    row = row.strip()

    #only add the row if it is not empty
    #(the first and last are in the variable my_map)
    if len(row)>0:
        final_rows.append(row)

#see what this created:
print final_rows

    ['PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP', 'P|-----------------------------------------------------|P', 'P|  |--------| |-------|------------|  |---------------|P', 'P|  |      |PPDPPPPPPPP|            |  |               |P', 'P| C|      |P         P|  f         |  |               |P', 'P|  |      |P   f     P|            |  |               |P', 'P|  |      |P         P|            d  d               |P', 'P|  |      |P         P|            |  |               |P', 'P|  |      |P         P|            |  |               |P', 'P|  |      |P         P|            |  |    cccc       |P', 'P|  |      |PPPPPPPPPPP|            |  |    c  c       |P', 'P|__d_______|P|_________d___________|  |____cccc_______|P', 'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPDDPPPPPPPPPPPPPPPPPP']

#it's obviously a list of strings, but it's hard to read.
#Let's print it row by row to make sure everything turned out okay.
for r in final_rows:
    print r

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
P|-----------------------------------------------------|P
P|  |--------| |-------|------------|  |---------------|P
P|  |      |PPDPPPPPPPP|            |  |               |P
P| C|      |P         P|  f         |  |               |P
P|  |      |P   f     P|            |  |               |P
P|  |      |P         P|            d  d               |P
P|  |      |P         P|            |  |               |P
P|  |      |P         P|            |  |               |P
P|  |      |P         P|            |  |    cccc       |P
P|  |      |PPPPPPPPPPP|            |  |    c  c       |P
P|__d_______|P|_________d___________|  |____cccc_______|P
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPDDPPPPPPPPPPPPPPPPPP

#good, no extra lines or random spaces.

#we can now access specific map coordinates like this:
#my_map[y][x] (starting at 0)
print final_rows[0][0]
 #prints P
print final_rows[4][3]
 #prints C

一旦你把地图转换成列表,就可以用我上面给的伪代码来访问它。

撰写回答