0

cursesPython のライブラリを使用して、高校時代にプレイした TI-83 電卓ゲーム「Falldown」に似たゲームを作ろうとしています。永遠に落下するボールが穴を通り抜ける必要があり、穴にたどり着かないと、ボールは画面の上部で押しつぶされます (YouTube it)。

これまでのところ、まだ穴のない Obstacle クラスしかありません。障害物を永遠に「スクロールアップ」させたいだけです。1 つの障害 ( ) に対しては機能させることができますがobs1、2 つ目の障害 ( ) を追加しようとするとobs2、悪いことが起こります。以下のコードでは、両方の障害物が画面上に表示されていますが、2 つの障害物が重なり合っているため、1 つの障害物にしか見えません。

基本的に、画面の半分まで到達したobs2ときにどのように開始できますか?obs1

#!/usr/bin/python

import curses
import time
import random

class obstacle:
  def __init__(self):
    self.pos = dims[0]-1
    self.s = ''
    for x in range(0,dims[1]-1):
      self.s += '='

  def scroll(self):
    self.pos -= 1


screen = curses.initscr()

curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
screen.nodelay(1)
dims = screen.getmaxyx()

q=-1
obs1 = obstacle()
obs2 = obstacle()

while q < 0:
  q = screen.getch()
  if obs1.pos < 0:
    obs1 = obstacle()
  if obs2.pos < 0:
    obs2 = obstacle()
  screen.clear()
  screen.addstr(obs1.pos, 0, obs1.s, curses.color_pair(1))
  screen.addstr(obs2.pos, 0, obs2.s, curses.color_pair(1))
  obs1.scroll()
  obs2.scroll()
  screen.refresh()
  time.sleep(.04)
screen.getch()
curses.endwin()

最終的には、画面上に一度に約 4 つの障害物が必要になり、永遠に上にスクロールします。2から始めるためのヒントはありますか?

4

1 に答える 1

0

何が欲しいかよく考える必要があります。画面の途中まではobs2何がありますか? obs1何もないのですか?画面外の障害物?正常に動作するが、描画されない障害物はありますか?

あなたが決定するものは何でも、コード化するのはとても簡単です。最も難しいものを選んで、それを機能させる方法を示します。十分にうまくいくまで作成することさえしませobs2obs1。これはif obs2 is not None、それを使用するすべての場所をチェックしてから、適切なタイミングでそれを作成する行をどこかに追加する必要があることを意味します。したがって、次のようなものです。

obs1 = obstacle()
obs2 = None

while q < 0:
  q = screen.getch()
  if obs1.pos < 0:
    obs1 = obstacle()
  if obs2 is not None and obs2.pos < 0:
    obs2 = obstacle()
  # Here's where we create obs2 on the fly
  if obs2 is None and obs1.pos == dims[0]/2:
    obs2 = obstacle()
  screen.clear()
  screen.addstr(obs1.pos, 0, obs1.s, curses.color_pair(1))
  if obs2 is not None:
    screen.addstr(obs2.pos, 0, obs2.s, curses.color_pair(1))
  obs1.scroll()
  if obs2 is not None:
    obs2.scroll()
  screen.refresh()
  time.sleep(.04)

obs2代わりに、 から少しオフセットを開始したいとしましょうobs1。その場合、最初は別のコードで構築したいだけで、pos他のすべては元のコードから変更されていません。

class obstacle:
  def __init__(self, offset=1.0):
    self.pos = int((dims[0]-1) * offset)
    self.s = ''
    for x in range(0,dims[1]-1):
      self.s += '='

  def scroll(self):
    self.pos -= 1

screen = curses.initscr()

curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
screen.nodelay(1)
dims = screen.getmaxyx()

q=-1
obs1 = obstacle()
obs2 = obstacle(.5)

while q < 0:
  q = screen.getch()
  if obs1.pos < 0:
    obs1 = obstacle()
  if obs2.pos < 0:
    obs2 = obstacle()
  screen.clear()
  screen.addstr(obs1.pos, 0, obs1.s, curses.color_pair(1))
  screen.addstr(obs2.pos, 0, obs2.s, curses.color_pair(1))
  obs1.scroll()
  obs2.scroll()
  screen.refresh()
  time.sleep(.04)
screen.getch()
curses.endwin()
于 2013-01-26T01:04:37.483 に答える