LINUX.ORG.RU

Подскажите по Python

 , ,


1

2

Вопрос, вроде бы, простой но ответа я не нашёл, увы. Вобщем, пробуюсь в питоне (решил начать с него), захотел написать простую прогулю - симулятор игральных костей. Идея в том, что «игрок» нажимает любую клавишу, при этом происходит рандомный выбор значений для 2-х переменных, они сравниваются, и выводится результат. Загвоздка в том, что не могу понять, как заставить программу реагировать на нажатие любой клавиши, без ввода значения.

import random
m = [1, 2, 3, 4, 5, 6, 7, 8, 9]
n = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("Your turn")
nput()
a = random.choice(m)
b = random.choice(n)
if a > b :
    print("You have", a, "its better like", b)
    print("You WON!")
else:
    print("He have", b, "Its better like", a)
    print("YOU LOSE!!")
Как заставить реагировать на ЛЮБОЕ нажатие на ЛЮБУЮ клавишу? Заренее спасибо,



Последнее исправление: beastie (всего исправлений: 2)

Через ncurces проще всего.

P.S.: На лоре есть bb-тег code, в который следует оборачивать код, чтобы он вот так не ехал.

P.P.S.: Если у тебя значения от 1 до 9, то зачем списки и choice? Есть же random.randint(1,9).

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Потому что я всего второй день учусь, и многие вещи я не вижу так, как видите их вы. Но внимание обращу. Спасибо. ) p.s. пока что мне так проще для понимания.

HardMgn
() автор топика
Ответ на: комментарий от mky

Это в 3 раза больше, чем мой код, неужели нет ничего проще? Это, ведь, по сути, просто рекция на нажатие...в стиле read или readln... Разве нет?

HardMgn
() автор топика
Ответ на: комментарий от Psych218

random.randint(1,9) вот это, на порядок лучше...но, опять же, меня эти познания ждут, видимо, дальше )

HardMgn
() автор топика
Ответ на: комментарий от qulinxao

Вполне себе устраивает )) Просто, я до сих пор, нигде этого не видел ) Наверное, всё так же, увижу дальше, но, по-идее, работает, как бы хотелось. Остался один вопрос, со всеми ремарками. Как зациклить? Т.е. чтобы после первого «вброса» не выходил из программы, а возвращался в начало (как бы, с самого начала)


import random
print(«Your turn»)
raw_input()
a = random.randint(1,9)
b = random.randint(1,9)
if a > b :
print(«You have», a, «its better like», b)
print(«You WON!»)
else:
print(«He have», b, «Its better like», a)
print(«YOU LOSE!!»)

Прошу прощения, что не скрываю код, я научусь ))

HardMgn
() автор топика
Ответ на: комментарий от HardMgn

Как зациклить? Т.е. чтобы после первого «вброса» не выходил из программы, а возвращался в начало (как бы, с самого начала)

import random

while True:
    print("Your turn")
    raw_input()
    a = random.randint(1,9)
    b = random.randint(1,9)
    if a > b :
        print("You have", a, "its better like", b)
        print("You WON!")
    else:
        print("He have", b, "Its better like", a)
        print("YOU LOSE!!")

Прошу прощения, что не скрываю код, я научусь ))

Вообще что ли ни разу на форумах не был? Перед кодом напиши слово code в квадратных скобках. После кода /code тоже в квадратных скобках.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 2)
Ответ на: комментарий от Psych218
Т_Т и верно же... циииикл ))) пока верно то, что выполняется, выполнять то - что выполняется ))) Спасибо за подсказку. Еще раз свидетельствует о том, что у меня с логикой - тяжеловато )
HardMgn
() автор топика
Ответ на: комментарий от HardMgn

from : http://rosettacode.org/wiki/Keyboard_input/Obtain_a_Y_or_N_response#Python

#!/usr/bin/env python
 
try:
    from msvcrt import getch
except ImportError:
    def getch():
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch
 
print "Press Y or N to continue"
while True:
    char = getch()
    if char.lower() in ("y", "n"):
        print char
        break

почитай - код вполне прямой. если какие конструкции внови вот так питон и освоишь

qulinxao ★★☆
()
Ответ на: комментарий от Psych218


Личное обращение к вам. )
А как зменить отображение латины на киррилицу?
Ставил в начало кода:
# -*- coding: utf-8 -*-
но получал результат подобно
'\xd0\x95\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb0 S.' |(157927927)|

HardMgn
() автор топика
Ответ на: комментарий от qulinxao

Я ценю, правда, но я по учебнику еще даже до циклов не дошел ) Просто задался вопросом из того, что было в поле зрения. Но, я сохраню код, и в любом случае, его прочитаю ) Однажды ) Сапсибо за участие.

HardMgn
() автор топика
Ответ на: комментарий от RelativeLayout

Я уже попробовал...java,c#,html(css), пробовал с паскаля...но, если честно, я как программист не огонь, но в питоне вижу, хотя бы, понятную логику, хоть и не всегда... Не суди строго, каждый начинает свой путь с того, что нравится... ну вот...вроде нравится.

HardMgn
() автор топика
Ответ на: комментарий от Psych218

Виновен, не так выразился...да и не по теме...смотрел в IDE PyChrarm 4 Ошибку понял )

HardMgn
() автор топика
Ответ на: комментарий от anonymous

JetBrains PyCharm 2.7.3 До сохранения результат не дошел, ибо, как только сменил с латины на кирилу, всё сломалось, но Psych218, ответил на вопрос...

HardMgn
() автор топика
Ответ на: комментарий от HardMgn

Спасибо всем за участие в вопросе. Многое, чего нет на просторах интернетов (либо я плохой сыщик), я узнал сегодня, на просторах орга. Спасибо всем огромное. Ваш вклад очень важен для тех, кто начал. Спасибо!

HardMgn
() автор топика
Ответ на: комментарий от HardMgn

Это, ведь, по сути, просто рекция на нажатие...в стиле read или readln... Разве нет?

Нет. Чтобы процесс мог детектить нажатия, он должен попросить об этом. Как то так:

import sys, tty

tty.setraw(sys.stdin.fileno())

while 1:
    c = sys.stdin.read(1)
    print(c)

Только ctrl+c ты тоже сам должен обрабатывать.

redixin ★★★★
()
Ответ на: комментарий от redixin

я от этого пока еще далёк ) не хочу использовать то, чего не понимаю, не вижу смысла. но учту, на будущее.

HardMgn
() автор топика
Ответ на: комментарий от HardMgn

Ты первый начал про четвёртую версию.

shrub ★★★★★
()
Ответ на: комментарий от HardMgn

Ох, сложно, не понимаю о чем речь идет. А нет более простого варианта, под мой вопрос?

Он тебе дал неправильную ссылку.

https://stackoverflow.com/questions/510357/python-read-a-single-character-fro...

Потому что я всего второй день учусь, и многие вещи я не вижу так, как видите их вы.

Тогда лучше сначала что-нибудь другое изучить из Питона раз ты ещё даже до циклов не дошёл.

Видишь ли, так сложилось, что по умолчанию вводимые данные построчно буферизуются, и пользователь может даже редактировать их, пока не введёт \n, нажав Enter (в Линуксе это происходит то ли на уровне ядра, то ли на уровне glibc, не уверен, но точно ниже уровня Питона). Поэтому даже если ты захочешь прочитать один байт, пользователь сможет ввести целую строку (и потом, каждый раз, когда ты будешь читать байты, ты будешь читать их из этой строки, пока она не кончится). Чтобы этого не происходило, буферизацию надо специально отключить или обойти, а встроенных функций для этого нету (но стандартной библиотеки Python достаточно).

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)

Шикарный тред, узнал много нового :).

Virtuos86 ★★★★★
()
Ответ на: комментарий от proud_anon

Оуу...ну, тогда, пожалуй да ) Стоит почитать дальше. Просто, в процессе изучения ,появляются идеи (контроль успеваемости, если угодно) которые, на вид, не сложно реализовать, но как показывает случай, бывают и проблемы. В любом случае, спасибо за пояснение.

HardMgn
() автор топика
Ответ на: комментарий от proud_anon

Потому что я всего второй день учусь, и многие вещи я не вижу так, как видите их вы.

Тогда лучше сначала что-нибудь другое изучить из Питона раз ты ещё даже до циклов не дошёл.


ТС все правильно сделал, начав именно с питона

kto_tama ★★★★★
()
Последнее исправление: kto_tama (всего исправлений: 1)

Примерный код:

def myinput(timeout=None):
  stdin = sys.stdin
  special = False
  while True:
    try:
      r, _, _ = select([stdin], [], [], timeout)
      if not r:
        yield None
        continue
      ch = os.read(stdin.fileno(), 1)
    except InterruptedError:  # "[Errno 4] Interrupted system call"
      continue

for key in myinput():
 print("pressed", key)

true_admin ★★★★★
()
Ответ на: комментарий от proud_anon

нет конечно
питон хорош тем, что человек уже на второй день изучения в состоянии написать простую игрушку
попробуйте тот же фокус провернуть с какой-нибудь сишечкой или жабой ...

kto_tama ★★★★★
()
Ответ на: комментарий от HardMgn

Винда под PyCharm, под линью у меня нетбук, но он сейчас в «ауте»

Как починишь - приходи. А сейчас вали на винфак.

Siado ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.