Difference between revisions of "Complete Roguelike Tutorial, using python3+libtcod, part 1 code"

From RogueBasin
Jump to navigation Jump to search
Line 79: Line 79:
<div style="background-color: #EEEEEE; border-style: dotted"><syntaxhighlight lang="python">
<div style="background-color: #EEEEEE; border-style: dotted"><syntaxhighlight lang="python">
#!/usr/bin/env python
#!/usr/bin/env python
import os
import libtcodpy as tcod
import libtcodpy as tcod


# ######################################################################
# Constants and Initial settings
# ######################################################################
# Size of the terminal window in characters
# Size of the terminal window in characters
SCREEN_WIDTH = 80  # characters wide
SCREEN_WIDTH = 80  # characters wide
SCREEN_HEIGHT = 50  # characters tall
SCREEN_HEIGHT = 50  # characters tall
LIMIT_FPS = 20  # 20 frames-per-second maximum
LIMIT_FPS = 20  # 20 frames-per-second maximum
REALTIME = False  # set True for real-time, False for turn-based




# Setup displayed font
# ######################################################################
font_filename = 'arial10x10.png'  # needs to be in same folder as this file
# Exceptions
font_flags = tcod.FONT_TYPE_GREYSCALE | tcod.FONT_LAYOUT_TCOD
# ######################################################################
tcod.console_set_custom_font(font_filename, font_flags)
class GameError(Exception):
 
    """Base Exception for all game errors"""


# Setup window
window_title = 'Python 3 libtcod tutorial'
fullscreen = False
tcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, window_title, fullscreen)


 
class FontError(GameError):
# Limit frames per second
    """Font could not be loaded"""
tcod.sys_set_fps(LIMIT_FPS)
 
 
# Setup player's initial position
player_x = SCREEN_WIDTH // 2
player_y = SCREEN_HEIGHT // 2




Line 119: Line 108:


     Updates:
     Updates:
         player_x (int): x coordinate of player position
         player_x: x coordinate of player position
         player_y (int): y coordinate of player position
         player_y: y coordinate of player position


     Returns:
     Returns:
Line 129: Line 118:
     exit_game = False
     exit_game = False


     # key = tcod.console_check_for_keypress() # real-time
     if REALTIME:
     key = tcod.console_wait_for_keypress(True) # turn-based
        key = tcod.console_check_for_keypress()
     else:
        key = tcod.console_wait_for_keypress(True)


     if key.vk == tcod.KEY_ENTER and key.lalt:
     if key.vk == tcod.KEY_ENTER and key.lalt:
Line 142: Line 133:
     if tcod.console_is_key_pressed(tcod.KEY_UP):
     if tcod.console_is_key_pressed(tcod.KEY_UP):
         player_y = player_y - 1
         player_y = player_y - 1
     elif tcod.console_is_key_pressed(tcod.KEY_DOWN):
     elif tcod.console_is_key_pressed(tcod.KEY_DOWN):
         player_y = player_y + 1
         player_y = player_y + 1
     elif tcod.console_is_key_pressed(tcod.KEY_LEFT):
     elif tcod.console_is_key_pressed(tcod.KEY_LEFT):
         player_x = player_x - 1
         player_x = player_x - 1
     elif tcod.console_is_key_pressed(tcod.KEY_RIGHT):
     elif tcod.console_is_key_pressed(tcod.KEY_RIGHT):
         player_x = player_x + 1
         player_x = player_x + 1
Line 156: Line 144:


# ######################################################################
# ######################################################################
# Main Game Loop
# Game
# ######################################################################
# ######################################################################
exit_game = False
def initialize_game(font_filepath=None, window_title=None, fullscreen=False):
while not tcod.console_is_window_closed() and exit_game is not True:
    """Sets up libtcod and creates a window
    tcod.console_set_default_foreground(0, tcod.white)
 
    tcod.console_put_char(0, player_x, player_y, '@', tcod.BKGND_NONE)
    Updates:
    tcod.console_flush()
        player_x: x coordinate of player position
    tcod.console_put_char(0, player_x, player_y, ' ', tcod.BKGND_NONE)
        player_y: y coordinate of player position
 
    Args:
        font_filepath (str): the path to the font file [default: arial10x10]
        window_title (str): the title to display for the game [default: Python3 Tutorial]
    """
    global player_x, player_y
 
    # Setup displayed font
    font_filepath = font_filepath or 'arial10x10.png'
    font_flags = tcod.FONT_TYPE_GREYSCALE | tcod.FONT_LAYOUT_TCOD
    if not os.path.exists(font_filepath):
        raise FontError("Could not open font file: {}".format(font_filepath))
    tcod.console_set_custom_font(font_filepath, font_flags)
 
    # Setup window
    window_title = window_title or 'Python3 Tutorial'
    fullscreen = fullscreen or False
    tcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, window_title, fullscreen)
 
    # Limit frames per second
    tcod.sys_set_fps(LIMIT_FPS)
 
    # Setup player's initial position
    player_x = SCREEN_WIDTH // 2
    player_y = SCREEN_HEIGHT // 2
 
 
def main():
    initialize_game()
 
    # Game loop
    exit_game = False
    while not tcod.console_is_window_closed() and exit_game is not True:
        tcod.console_set_default_foreground(0, tcod.white)
        tcod.console_put_char(0, player_x, player_y, '@', tcod.BKGND_NONE)
        tcod.console_flush()
        tcod.console_put_char(0, player_x, player_y, ' ', tcod.BKGND_NONE)
 
        # handle keys
        exit_game = handle_keys()
 
 
if __name__ == '__main__':
    main()


    # handle keys
    exit_game = handle_keys()


</syntaxhighlight></div>
</syntaxhighlight></div>

Revision as of 17:45, 15 September 2017

This is part of a series of tutorials; the main page can be found here.

Showing the @ on screen

#!/usr/bin/env python
import os

import libtcodpy as tcod

# Size of the terminal window in characters
SCREEN_WIDTH = 80  # characters wide
SCREEN_HEIGHT = 50  # characters tall
LIMIT_FPS = 20  # 20 frames-per-second maximum


# ######################################################################
# Exceptions
# ######################################################################
class GameError(Exception):
    """Base Exception for all game errors"""


class FontError(GameError):
    """Font could not be loaded"""


# ######################################################################
# Game
# ######################################################################
def initialize_game(font_filepath=None, window_title=None, fullscreen=False):
    """Sets up libtcod and creates a window

    Args:
        font_filepath (str): the path to the font file [default: arial10x10]
        window_title (str): the title to display for the game [default: Python3 Tutorial]
        fullscreen (bool): Run in full screen mode [default: False]
    """
    # Setup displayed font
    font_filepath = font_filepath or 'arial10x10.png'
    font_flags = tcod.FONT_TYPE_GREYSCALE | tcod.FONT_LAYOUT_TCOD
    if not os.path.exists(font_filepath):
        raise FontError("Could not open font file: {}".format(font_filepath))
    tcod.console_set_custom_font(font_filepath, font_flags)

    # Setup window
    window_title = window_title or 'Python3 Tutorial'
    fullscreen = fullscreen or False
    tcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, window_title, fullscreen)

    # Limit frames per second
    tcod.sys_set_fps(LIMIT_FPS)


def main():
    initialize_game()

    # Game loop
    while not tcod.console_is_window_closed():
        tcod.console_set_default_foreground(0, tcod.white)
        tcod.console_put_char(0, 1, 1, '@', tcod.BKGND_NONE)
        tcod.console_flush()


if __name__ == '__main__':
    main()

Github link

Here's a github link.

Moving around

#!/usr/bin/env python
import os

import libtcodpy as tcod

# Size of the terminal window in characters
SCREEN_WIDTH = 80  # characters wide
SCREEN_HEIGHT = 50  # characters tall
LIMIT_FPS = 20  # 20 frames-per-second maximum
REALTIME = False  # set True for real-time, False for turn-based


# ######################################################################
# Exceptions
# ######################################################################
class GameError(Exception):
    """Base Exception for all game errors"""


class FontError(GameError):
    """Font could not be loaded"""


# ######################################################################
# User Interface Control
# ######################################################################
def handle_keys():
    """Handles keyboard input

    Updates:
        player_x: x coordinate of player position
        player_y: y coordinate of player position

    Returns:
        bool: True if exit the game is requested else False
    """
    global player_x, player_y

    exit_game = False

    if REALTIME:
        key = tcod.console_check_for_keypress()
    else:
        key = tcod.console_wait_for_keypress(True)

    if key.vk == tcod.KEY_ENTER and key.lalt:
        # Alt+Enter: toggle fullscreen
        tcod.console_set_fullscreen(not tcod.console_is_fullscreen())

    elif key.vk == tcod.KEY_ESCAPE:
        exit_game = True  # exit game

    # movement keys
    if tcod.console_is_key_pressed(tcod.KEY_UP):
        player_y = player_y - 1
    elif tcod.console_is_key_pressed(tcod.KEY_DOWN):
        player_y = player_y + 1
    elif tcod.console_is_key_pressed(tcod.KEY_LEFT):
        player_x = player_x - 1
    elif tcod.console_is_key_pressed(tcod.KEY_RIGHT):
        player_x = player_x + 1

    return exit_game


# ######################################################################
# Game
# ######################################################################
def initialize_game(font_filepath=None, window_title=None, fullscreen=False):
    """Sets up libtcod and creates a window

    Updates:
        player_x: x coordinate of player position
        player_y: y coordinate of player position

    Args:
        font_filepath (str): the path to the font file [default: arial10x10]
        window_title (str): the title to display for the game [default: Python3 Tutorial]
    """
    global player_x, player_y

    # Setup displayed font
    font_filepath = font_filepath or 'arial10x10.png'
    font_flags = tcod.FONT_TYPE_GREYSCALE | tcod.FONT_LAYOUT_TCOD
    if not os.path.exists(font_filepath):
        raise FontError("Could not open font file: {}".format(font_filepath))
    tcod.console_set_custom_font(font_filepath, font_flags)

    # Setup window
    window_title = window_title or 'Python3 Tutorial'
    fullscreen = fullscreen or False
    tcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, window_title, fullscreen)

    # Limit frames per second
    tcod.sys_set_fps(LIMIT_FPS)

    # Setup player's initial position
    player_x = SCREEN_WIDTH // 2
    player_y = SCREEN_HEIGHT // 2


def main():
    initialize_game()

    # Game loop
    exit_game = False
    while not tcod.console_is_window_closed() and exit_game is not True:
        tcod.console_set_default_foreground(0, tcod.white)
        tcod.console_put_char(0, player_x, player_y, '@', tcod.BKGND_NONE)
        tcod.console_flush()
        tcod.console_put_char(0, player_x, player_y, ' ', tcod.BKGND_NONE)

        # handle keys
        exit_game = handle_keys()


if __name__ == '__main__':
    main()

Github link

Here's a github link.