17 + 4

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
noop

17 + 4

Beitragvon noop » Freitag 25. Februar 2005, 16:50

Hallo wir haben in der schule eine aufgabe bekommen. Wir sollen 17+4 ohne print oder rawinput programieren sondern mit einer console und cputs & cgets.
Wir müssen bei dieser aufgabe keine Klassen benutzen.

Also es soll am anfang des programms eine namen abfrage stattfinden danach soll der computer und der user eine karte ziehen nun hat der user 8 züge d.h er kann 8 mal ziehen(genauso wie der computer).
er kann aber auch aufören oder das spiel beenden. es sollen so viele spiele stattfinden bis der user beenden drückt.
die karten dees computers sollen mit XX dargestellt werden erts in der auswertung wer gewonnen hat steht welche karten der computer gezogen hat.
Ganz am ende soll der punktestand des computers und des user angezeigt werden und wer der gewinner ist.

der computersoll sich ein zufalls ziel zw. 13-17 suchen und erst dann nicht mehr ziehen wenn er es erreicht hat oder drüber ist.

Es wäre super wenn mir jemand helfen könnte.
Vielleicht hat es ja sogar schon jemand geschrieben.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 25. Februar 2005, 16:55

Hi!

1) Lies das. (Ja, das gilt auch für Schüler :wink:)
2) Zeig was Du bis jetzt versucht hast.

Gruß, mawe
Gast

Beitragvon Gast » Freitag 25. Februar 2005, 17:09

oh sorry bin neu.
so ich habs bisher nur mit print und so gemacht und auch kein plan wie ich es mit console macahe.
wie implentiere ich überhaupt die console bei mir aufm rechner.
und wo bekomm ich sie her? so hier mein prog ohne console:


Code: Alles auswählen

#Import
from random import *            # Importieren der Zufallsfunktion
import sys                      # Importieren von Systemfunktionen


#Definition
def zieheKarte(kartenspiel):
    zufall = randint(0,(len(kartenspiel)-1))                  # Funktion, um eine Karte zu ziehen
    kartenziehung = kartenspiel[zufall]                       # Hierbei wird Zufallsauswahl angewandt
    del kartenspiel[zufall]
    return kartenziehung



def stringKarte(karte):             # Funkction, zum Ausgeben der gezogenen Karte
    ausgabestring = str(karte) + "  "
    return ausgabestring



#Hauptprogram
print "Willkommen bei 17+4\n"
username = raw_input("Bitte Ihren Namen eingeben: ")
print 80 * "-" + "\n"
stop = False
while stop == False:
    talon = [2,3,4,7,8,9,10,11,2,3,4,7,8,9,10,11,2,3,4,7,8,9,10,11,2,3,4,7,8,9,10,11,]
    print "Los geht's!\n"
    userkarten = []
    userpunkte = 0
    computerkarte = "XX"
    computerpunkte = 0
    userausgabe = username + ":  "
    computerausgabe = "Computer:  "
    ukarte = zieheKarte(talon)
    userkarten.append(ukarte)
    userausgabe += stringKarte(ukarte)
    userpunkte += ukarte
    print userausgabe
    computerausgabe += stringKarte(computerkarte)
    computerpunkte += zieheKarte(talon)
    print computerausgabe





    verloren = False
    while verloren == False and len(talon) > 0:
        weiterziehen = raw_input("weitere (K)arte ziehen, (a)ufhoeren oder Spiel (b)eenden? ").lower()
        print "\n"
        if weiterziehen == "k":
            ukarte = zieheKarte(talon)
            userkarten.append(ukarte)
            userausgabe += stringKarte(str(ukarte))
            userpunkte += ukarte
            print userausgabe
            print computerausgabe + "\n"
        elif weiterziehen == "a":
            break
        elif weiterziehen == "b":
            stop = True
            break
        elif weiterziehen != "k" and weiterziehen != "a":
            "Fehleingabe. Bitte nochmal versuchen."
        if userpunkte > 21:
            print username + " " + "hat zu viele Punkte und schon hoffnungslos verloren."
            print username + ":" + str(userpunkte)
            print "Computer:" + str(computerpunkte)
            print 80 * "-" + "\n"
            verloren = True
    zufallsgrenze = randint(15,21)
    while computerpunkte <= zufallsgrenze and verloren == False and len(talon) > 0 and stop == False:
        if computerpunkte > userpunkte:
            break
        computerausgabe += stringKarte(computerkarte)
        computerpunkte += zieheKarte(talon)
        print computerausgabe + "\n"
    if computerpunkte > 21 and userpunkte <= 21 and verloren == False and stop == False:
        print "Der Computer hat ueberzogen und somit verloren.\n"
        print username + ":" + " " + str(userpunkte)
        print "Computer: " + str(computerpunkte) + "\n"
        print "Herzlichen Glueckwunsch zum Sieg," + " " + username + "\n"
        print 80 * "-" + "\n"
    if userpunkte > computerpunkte and userpunkte <= 21 and verloren == False and stop == False:
        print 'Herzlichen Glueckwunsch,', username, ',Sie haben gewonnen!!!'
        print username + ":" + " " + str(userpunkte)
        print "Computer:" + " " + str(computerpunkte) + "\n"                        # Spielstandsauswertung
        print 80 * "-" + "\n"
    if userpunkte == computerpunkte and userpunkte <= 21 and verloren == False and stop == False:
        print 'Das Spiel endet unentschieden.'
        print username + ":" + " " + str(userpunkte)
        print "Computer:" + " " + str(computerpunkte) + "\n"
        print 80 * "-" + "\n"
    if userpunkte < computerpunkte and computerpunkte <= 21 and verloren == False and stop == False:
        print 'Herzliches Beileid,', username, ',Sie haben leider verloren.'
        print username + ":" + " " + str(userpunkte)
        print "Computer:" + " " + str(computerpunkte) + "\n"
        print 80 * "-" + "\n"
    if stop == True:
        print "Vielen Dank fürs Spielen und bis zum naechsten Mal!"
        print 80 * "-"


Edit (Leonidas): Code in Python Tags gesetzt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: 17 + 4

Beitragvon Leonidas » Freitag 25. Februar 2005, 17:59

noop hat geschrieben:Hallo wir haben in der schule eine aufgabe bekommen. Wir sollen 17+4 ohne print oder rawinput programieren sondern mit einer console und cputs & cgets.

Cget? Cput? Console? Was meinst du damit?

Also wenn du print nicht nutzen darst, nimm sys.stdout.write() und statt raw_input(), str(input()).

Achja, nutze lieber keine * Imports, das führt zu grandiosen Fehlern.

Edit: Bin grade dabei deinen Code etwas umzubiegen. "Hold your breath" ;)

Edit2: Vorabversion, nur etwas aufgeräumt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import random, sys

def zieheKarte(kartenspiel):
    zufall = random.randint(0, len(kartenspiel) - 1)
    kartenziehung = kartenspiel[zufall]
    return kartenziehung

def stringKarte(karte):
    ausgabestring = "%d  " % karte
    return ausgabestring

def main():
    print "Willkommen bei 17+4"
    print
    username = raw_input("Bitte Ihren Namen eingeben: ")
    print 80 * "-"
    print

    stop = False
    while stop != True:
        karten = range(2, 5) + range(7, 12)
        talon = list()
        for karte in karten:
            talon.extend([karte, karte, karte, karte])
   
        print "Los geht's!"
        print
       
        userkarten = []
        userpunkte = 0
       
        computerkarte = "XX"
        computerpunkte = 0
       
        userausgabe = "%s:  " % username
        computerausgabe = "Computer:  "
        ukarte = zieheKarte(talon)
        userkarten.append(ukarte)
       
       
        userausgabe += stringKarte(ukarte)
        #userpunkte += ukarte
        print userausgabe
       
       
        computerausgabe += "XX  "
        computerpunkte += zieheKarte(talon)
        print computerausgabe
       

        verloren = False
        while verloren == False and len(talon) > 0:
           
            weiterziehen = raw_input("weitere (K)arte ziehen, (a)ufhören oder Spiel (b)eenden? ").lower()
            print
           
            if weiterziehen == "k":
                ukarte = zieheKarte(talon)
                userkarten.append(ukarte)
                userausgabe += stringKarte(ukarte)
                userpunkte += ukarte
               
                print userausgabe
                print computerausgabe
                print
               
            elif weiterziehen == "a":
                stop = True
                break
               
            elif weiterziehen == "b":
                break
               
            elif weiterziehen != "k" or weiterziehen != "a":
                "Fehleingabe. Bitte nochmal versuchen."
               
            if userpunkte > 21:
                print "%s hat zu viele Punkte und schon hoffnungslos verloren." % username
                print "%s: %d" % (username, userpunkte)
                print "Computer: %d" % computerpunkte
                print 80 * "-"
                print
                verloren = True
               
        zufallsgrenze = random.randint(15,21)
       
        while computerpunkte <= zufallsgrenze and verloren == False and len(talon) > 0 and stop == False:
            if computerpunkte > userpunkte:
                break
               
            computerausgabe += stringKarte(computerkarte)
            computerpunkte += zieheKarte(talon)
            print computerausgabe
            print
           
        if computerpunkte > 21 and userpunkte <= 21 and verloren == False and stop == False:
            print "Der Computer hat überzogen und somit verloren."
            print
            print "%s: %d" % (username, userpunkte)
            print "Computer: %d" % computerpunkte
            print
            print "Herzlichen Glueckwunsch zum Sieg, %s" % username
            print
            print 80 * "-"
            print
           
        if userpunkte > computerpunkte and userpunkte <= 21 and verloren == False and stop == False:
            print 'Herzlichen Glueckwunsch, %s, Sie haben gewonnen!!!' % username
            print '%s: %d' % (username, userpunkte)
            print "Computer: %d" % computerpunkte
            print
            print 80 * "-"
            print
           
        if userpunkte == computerpunkte and userpunkte <= 21 and verloren == False and stop == False:
            print 'Das Spiel endet unentschieden.'
            print "%s: %d" % (username, userpunkte)
            print "Computer: %d", computerpunkte
            print
            print 80 * "-"
            print
           
        if userpunkte < computerpunkte and computerpunkte <= 21 and verloren == False and stop == False:
            print 'Herzliches Beileid, %s, Sie haben leider verloren.' % username
            print '%s: %d' % (username, userpunkte)
            print "Computer: %d" % computerpunkte
            print
            print 80 * "-"
            print
        if stop == True:
            print "Vielen Dank fürs Spielen und bis zum nächsten Mal!"
            print 80 * "-"

if __name__ == '__main__':
    main()


Bin aber noch dran, keine Angst, das wird schon.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 25. Februar 2005, 20:13

Hi Leonidas!

Leonidas hat geschrieben:Bin aber noch dran, keine Angst, das wird schon.

Willst Du ihm jetzt doch die Hausaufgaben machen? Dein Fleiß in allen Ehren, aber lass ihn doch selbst ein wenig herumbasteln, sonst lernt er doch nichts dabei :wink:

Gruß, mawe
Gast

Beitragvon Gast » Freitag 25. Februar 2005, 20:15

so ich habs jetzt soweit mit console und allem geschaft.
jetzt hab ich noch die frage wie ich vor begin eine namens abfrage machen kann.
und das wenn ich schon über 21 habe nicht mehr ziehen kann.


Code: Alles auswählen

# _*_ coding: cp1252 _*_
# BigDigits
# Sebastian Hoopmann DQI04


#Import
import console, random


MAXZIEHEN = 8
RAND = 10


#Definition
def zieheKarte(kartenspiel):
    zufall = random.randint(0,(len(kartenspiel)-1))
    karte = kartenspiel[zufall]
    kartenspiel.remove(karte)
    return karte

def spielAnzeige(karte, runde, cpu, verdeckt):
    con.gotoXY(RAND + runde * 4, 0 + int(not cpu))
    if cpu:
        if verdeckt:
            con.cPuts('XX')
        else:
            con.cPuts('%2d'% (karte))
    else:
        con.cPuts('%2d'% (karte))

def deckeComputerzuegeAuf(computerzuege):
    runde = 0
    for karte in computerzuege:
        spielAnzeige(karte, runde, True, False)
        runde += 1

def auswertung(spielersumme, cpusumme):
       while True:
        if spielersumme > 21 and cpusumme > 21:
            con.gotoXY(0, 7)
            con.cPuts('Es gibt keinen Sieger')
            break
        if spielersumme > 21 and cpusumme <= 21:
            con.gotoXY(0, 7)
            con.cPuts('Der Computer hat gewonnen')
            break
        if spielersumme <= 21 and cpusumme > 21:
            con.gotoXY(0, 7)
            con.cPuts('Sie haben gewonnen')
            break
        if spielersumme == 21 and cpusumme == 21:
            con.gotoXY(0, 7)
            con.cPuts('Der Computer hat gewonnen')
            break
        if spielersumme == 21:
            con.gotoXY(0, 7)
            con.cPuts('Sie haben gewonnen')
        if cpusumme == 21:
            con.gotoXY(0, 8)
            con.cPuts('Der Computer hat gewonnen')
        if spielersumme == cpusumme:
            con.gotoXY(0, 7)
            con.cPuts('Das Spiel endet unentschieden')

# Hauptprogramm


con = console.Console()
random.seed()

while True:
    kartendeck = [2,2,2,2,3,3,3,3,4,4,4,4,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11]
    spielersumme = 0
    cpusumme = 0
    computerzuege = []
    runde = 0
    cpugrenze = random.randint(14,20)
    con.clrScr()
    con.gotoXY(0, 0)
    con.cPuts('Computer:')
    con.gotoXY(0, 1)
    con.cPuts('Spieler:')
    eingabe = 'j'

    while eingabe:                                  # Der Computer zieht eine Karte. Er zeiht so lange,
        if cpusumme < cpugrenze:                    # bis er seine Gefuehlsgrenze ueberschreitet.
            karte = zieheKarte(kartendeck)
            computerzuege.append(karte)
            spielAnzeige(karte, runde, True, True)
            cpusumme += karte
        if eingabe == 'j':                          # Der Spieler zieht, wenn seine eingabe == 'j' ist.
            con.gotoXY(0, 3)
            con.cPuts('Wollen Sie eine Karte ziehen? [j]a oder [n]ein: ')
            eingabe = con.cGets(1)
            con.gotoXY(47, 3)
            con.cPuts(' ')
            if eingabe == 'j':
                karte = zieheKarte(kartendeck)
                spielAnzeige(karte, runde, False, True)
                spielersumme += karte

        runde += 1
        if runde == MAXZIEHEN or (eingabe != 'j' and  cpusumme >= cpugrenze): # Ueberpruefung, ob das Spiel fortgesetzt wird.
            break
    # Ausgabe
    deckeComputerzuegeAuf(computerzuege) # Die Karten des Computers werden aufgedeckt
    auswertung(spielersumme, cpusumme) # Die Auswertung
    con.gotoXY(0, 5)
    con.cPuts('Wollen Sie noch eine Runde spielen? [j]a oder [n]ein: ')
    eingabe = con.cGets(1)

    if eingabe == 'j': # Falls eingabe == 'j', dann wird ein neues Spiel begonne.n
        continue
    else:             # Falls eingabe != 'j' dann wird abgebrochen und der Bildschirm geloescht.
        con.clrScr()
        break


Bitte um hilfe.
und wenn noch was zum verbessern gibt sagt es mir und hilft mir bitte.
die reihen folge in der ich das prog struktoriert habe ist auch ziemlich wichtig so den so hab ich nen überblick was in die defs und was in das Hauptprog gehört usw.

Edit (Leonidas): Code in Python Tags gesetzt. Bitte das nächste mal selbst machen, ok? Sonst kann man die Programme nicht lesen und ausführen.
Gast

Beitragvon Gast » Freitag 25. Februar 2005, 20:20

bei meinem ersten versuch noch ohne import hab ich das mit dem nicht mehr ziehen bei über 21 hin bekommen.
außerdem fand ich es auch besser das man erst alleine zieht und dann erst der com aber wenn ich das ändere bekomm ich immer eine Fehler meldung
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Februar 2005, 20:20

mawe hat geschrieben:Willst Du ihm jetzt doch die Hausaufgaben machen? Dein Fleiß in allen Ehren, aber lass ihn doch selbst ein wenig herumbasteln, sonst lernt er doch nichts dabei :wink:

Naja, hast ja recht. Aber wenn ich sowas wie:

Code: Alles auswählen

kartendeck = [2,2,2,2,3,3,3,3,4,4,4,4,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11]

sehe, dann denke ich: denn muss geholfen werden, das kann man nicht so stehen lassen. :)

Ich sollte mich wirklich nicht von fremden Hausaufgaben hinreißen lassen. :idea:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Beitragvon Gast » Freitag 25. Februar 2005, 20:30

was is an der liste so schlimm?
sollte ich die einfacah über mehr zeilen ziehen oder was?
sagt was ich falsch mache, wie soll ich es lernen wenn mir keiner sagt was daran falsch ist
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Februar 2005, 20:33

Anonymous hat geschrieben:was is an der liste so schlimm?

Sie hat lauter Wiederholungen.

Anonymous hat geschrieben:sagt was ich falsch mache, wie soll ich es lernen wenn mir keiner sagt was daran falsch ist

Ich habe es nicht nur gesagt, ich habe es bereits in mein Programm eingebaut (siehe oben).

Code: Alles auswählen

karten = range(2, 5) + range(7, 12)
talon = list()
for karte in karten:
    talon.extend([karte, karte, karte, karte])

Warum so eine list schreiben, wenn es doch nur Wiederholungen sind und man das generieren kann?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Beitragvon Gast » Freitag 25. Februar 2005, 20:39

es wiederhol sich alles weil jede karte 4 mal im deck ist und das prog was geändert wurde hat irgendwie bei mir komische fehler z.B wenn ich über 21 habe bricht er nicht von selber ab hat er vorher aber.

Bei meinem neuen prog mit console bekomm ich auch einiges nicht so hin wie ich will ich sag ma so ich muss das prog heute abgeben und bin zufreiden mit dem was ich geschafft habe hätte nicht gedacht das ich es ohne print zum laufen bekomme.
also wenn ihr mir nur sagt was ich besser machen könnte und mir noch ein paar tipps gebt wäre kich euch dankbar ihr müsst mir ja nicht das prog schreiben

*gg was ich natürlich auch nicht schlecht finden würde
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Februar 2005, 21:07

Anonymous hat geschrieben:es wiederhol sich alles weil jede karte 4 mal im deck ist und das prog was geändert wurde hat irgendwie bei mir komische fehler z.B wenn ich über 21 habe bricht er nicht von selber ab hat er vorher aber.

Deswegen habe ich ja vorgeschlagen, dieses vierfache Einfügen automatisch zu machen. Macht auch eindruck bei Lehrern, wenn dein Programm auch noch elegant ist.

Der Rest ist ein typischer Fall für print-Debugging

Anonymous hat geschrieben:also wenn ihr mir nur sagt was ich besser machen könnte und mir noch ein paar tipps gebt wäre kich euch dankbar ihr müsst mir ja nicht das prog schreiben

Eine Sammlung Tipps hält Python selbst für dich bereit:

Code: Alles auswählen

import this

Weitere: keine * imports, main()s nutzen, Modularität, übersichtlicher Code.

Anonymous hat geschrieben:*gg was ich natürlich auch nicht schlecht finden würde

Ich werde mich diesmal an mawe's Tipp halten und es nicht machen. Ist nur zu deinem eigenen besten, wie man so schön sagt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 25. Februar 2005, 21:30

Leonidas hat geschrieben:Ich werde mich diesmal an mawe's Tipp halten und es nicht machen. Ist nur zu deinem eigenen besten, wie man so schön sagt.

Na toll, jetzt bin ich wieder der Böse :D
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 25. Februar 2005, 21:36

Leonidas hat geschrieben:

Code: Alles auswählen

karten = range(2, 5) + range(7, 12)
talon = list()
for karte in karten:
    talon.extend([karte, karte, karte, karte])

Hi. Das kann ich wiederum nicht stehen lassen:

Code: Alles auswählen

karten=reduce(lambda a,b:a+b,[(i,)*4 for i in xrange(2,12) if i not in (5,6)],())

Ist aber genausoschön, wie die lange Liste voller Zahlen :wink:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Februar 2005, 21:52

mawe hat geschrieben:Na toll, jetzt bin ich wieder der Böse :D

Ne, du hast mich einfach wieder an die Forenprinzipien erinnert. 8)

Milan hat geschrieben:Hi. Das kann ich wiederum nicht stehen lassen:

Code: Alles auswählen

karten=reduce(lambda a,b:a+b,[(i,)*4 for i in xrange(2,12) if i not in (5,6)],())

Ist aber genausoschön, wie die lange Liste voller Zahlen :wink:

Das ist aber wirklich eine nette Konstruktion :) Ich habe schon überlegt wie man es in eine Zeile umwandeln kann, aber mit den shcweren labda Geschützen wollte ich dann doch nicht anfangen. Aber bei der besprechung der Hausaufgabe sollte man vielleicht doch verstehen was so ein lambda Konstrukt überhaupt macht. Sonst wäre das ja so wie diese tollen Deutschrefereate, in denen Wörter vorkommen, die man nicht kennt geschweige denn aussprechen kann.

Code: Alles auswählen

talon = []
for karte in range(2, 5) + range(7, 12):
    talon.extend([karte] * 4)

Wäre das kürzeste was mir noch lesbar und erklärbar erscheint. :idea:
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]