Vinnaren i pepparkakshustävlingen!
2017-04-07, 13:35
  #1
Medlem
jag sitter här och försöker förstå den här koden, https://gist.github.com/mohd-akram/3057736 , men jag fattar fasiken inte hur de har lagt till flaggorna, för att förstå det, så tänkte jag att jag tar bort allt som har med flaggorna att göra. Men då får jag massa andra problem.

jag tänker att rad...

120,
132,
”flag”:flag, i rad 138,
148,
-len(flags) i rad 158
168
hela 176 till 192
ta bort if set(flaggs) == i rad 205 och bara ha set(mines) kvar?

men när jag gör det, så får jag bara massa fel med ascii…

Tar jag på något sätt bort för mkt/för lite?
Citera
2017-04-07, 14:20
  #2
Medlem
inneskos avatar
Citat:
Ursprungligen postat av melyhna
jag sitter här och försöker förstå den här koden, https://gist.github.com/mohd-akram/3057736 , men jag fattar fasiken inte hur de har lagt till flaggorna, för att förstå det, så tänkte jag att jag tar bort allt som har med flaggorna att göra. Men då får jag massa andra problem.

jag tänker att rad...

120,
132,
”flag”:flag, i rad 138,
148,
-len(flags) i rad 158
168
hela 176 till 192
ta bort if set(flaggs) == i rad 205 och bara ha set(mines) kvar?

men när jag gör det, så får jag bara massa fel med ascii…

Tar jag på något sätt bort för mkt/för lite?

När jag gör de förändringar du har sagt så får jag inga fel. Vad får du för felmeddelande?

Sedan är det inte korrekt att bara ha kvar set(mines) på rad 205, utan här måste du ha någon form av koll om man hittat alla minor.
Citera
2017-04-07, 14:28
  #3
Medlem
Citat:
Ursprungligen postat av innesko
När jag gör de förändringar du har sagt så får jag inga fel. Vad får du för felmeddelande?

Sedan är det inte korrekt att bara ha kvar set(mines) på rad 205, utan här måste du ha någon form av koll om man hittat alla minor.

Så vad skulle du rekommendation vad man kan skriva då? om man inte har en flaggorna? för nu när jag gjorde om allt och tog bort allt som jag sa ovan, så får jag:

https://www.pixeltopic.com/image/ehypctxjijmbjfr/

jag la upp koden där också så blir de lite lättare kanske att läsa av ^^ https://gist.github.com/melyhna/f197...f33ed36e0610fb
__________________
Senast redigerad av melyhna 2017-04-07 kl. 14:32.
Citera
2017-04-07, 14:33
  #4
Medlem
inneskos avatar
Citat:
Ursprungligen postat av melyhna
Så vad skulle du rekommendation vad man kan skriva då? om man inte har en flaggorna? för nu när jag gjorde om allt och tog bort allt som jag sa ovan, så får jag:

https://www.pixeltopic.com/image/ehypctxjijmbjfr/

Du får hålla koll på hur många rutor som inte är öppnade och se om det är samma som antalet minor.

Du måste ju ha kvar if också, att bara skriva set(mines): är inte syntaktiskt korrekt.
Citera
2017-04-07, 14:40
  #5
Medlem
Citat:
Ursprungligen postat av innesko
Du får hålla koll på hur många rutor som inte är öppnade och se om det är samma som antalet minor.
så typ currcell(ngt? eller inget?) == set(mines)


Citat:
Ursprungligen postat av innesko

Du måste ju ha kvar if också, att bara skriva set(mines): är inte syntaktiskt korrekt.

Oj nej, det ska såklart va med ^^tack!
Citera
2017-04-07, 14:56
  #6
Medlem
inneskos avatar
Citat:
Ursprungligen postat av melyhna
så typ currcell(ngt? eller inget?) == set(mines)

Det lättaste är att räkna antalet ' ' i currcell skulle jag tro, och jämföra det med numberofmines. Om jag inte tänker fel här nu så kan man göra det med följande kod

Kod:
if sum(map(lambda row: row.count(' '), currgrid)) == numberofmines:

Dock kan ju läsvänligheten hos den raden diskuteras.
Citera
2017-04-08, 09:07
  #7
Medlem
Citat:
Ursprungligen postat av innesko
Det lättaste är att räkna antalet ' ' i currcell skulle jag tro, och jämföra det med numberofmines. Om jag inte tänker fel här nu så kan man göra det med följande kod

Kod:
if sum(map(lambda row: row.count(' '), currgrid)) == numberofmines:

Dock kan ju läsvänligheten hos den raden diskuteras.

Men efter jag gjort alla de där stegen, så får jag när jag kör den att den inte ens skriver ut ngt, eller den skriver ut rutnätet men inte ngn output när jag tex trycker på a1.,

Kod:
import random
import re
import time
from string import ascii_lowercase

#root = Tk()
#screen = Canvas(root, width=500, height=600, background="#ff00ff",highlightthickness=0)
# screen.pack()

def setupgrid(gridsize, start, numberofmines):
    emptygrid = [['0' for i in range(gridsize)] for i in range(gridsize)]

    mines = getmines(emptygrid, start, numberofmines)

    for i, j in mines:
        emptygrid[i][j] = 'X'

    grid = getnumbers(emptygrid)

    return (grid, mines)


def showgrid(grid):
    gridsize = len(grid)

    horizontal = '   ' + (4 * gridsize * '-') + '-'

    # Print top column letters
    toplabel = '     '

    for i in ascii_lowercase[:gridsize]:
        toplabel = toplabel + i + '   '

    print(toplabel + '\n' + horizontal)

    # Print left row numbers
    for idx, i in enumerate(grid):
        row = '{0:2} |'.format(idx + 1)

        for j in i:
            row = row + ' ' + j + ' |'

        print(row + '\n' + horizontal)

    print('')


def getrandomcell(grid):
    gridsize = len(grid)

    a = random.randint(0, gridsize - 1)
    b = random.randint(0, gridsize - 1)

    return (a, b)


def getneighbors(grid, rowno, colno):
    gridsize = len(grid)
    neighbors = []

    for i in range(-1, 2):
        for j in range(-1, 2):
            if i == 0 and j == 0:
                continue
            elif -1 < (rowno + i) < gridsize and -1 < (colno + j) < gridsize:
                neighbors.append((rowno + i, colno + j))

    return neighbors


def getmines(grid, start, numberofmines):
    mines = []
    neighbors = getneighbors(grid, *start)

    for i in range(numberofmines):
        cell = getrandomcell(grid)
        while cell == start or cell in mines or cell in neighbors:
            cell = getrandomcell(grid)
        mines.append(cell)

    return mines


def getnumbers(grid):
    for rowno, row in enumerate(grid):
        for colno, cell in enumerate(row):
            if cell != 'X':
                # Gets the values of the neighbors
                values = [grid[r][c] for r, c in getneighbors(grid,
                                                              rowno, colno)]

                # Counts how many are mines
                grid[rowno][colno] = str(values.count('X'))

    return grid


def showcells(grid, currgrid, rowno, colno):
    # Exit function if the cell was already shown
    if currgrid[rowno][colno] != ' ':
        return

    # Show current cell
    currgrid[rowno][colno] = grid[rowno][colno]

    # Get the neighbors if the cell is empty
    if grid[rowno][colno] == '0':
        for r, c in getneighbors(grid, rowno, colno):
            # Repeat function for each neighbor that doesn't have a flag
            if currgrid[r][c] != 'F':
                showcells(grid, currgrid, r, c)


def playagain():
    choice = input('Play again? (y/n): ')

    return choice.lower() == 'y'


def parseinput(inputstring, gridsize, helpmessage):
    cell = ()
    
    message = "Invalid cell. " + helpmessage

    pattern = r'([a-{}])([0-9]+)(f?)'.format(ascii_lowercase[gridsize - 1])
    validinput = re.match(pattern, inputstring)

    if inputstring == 'help':
        message = helpmessage

    elif validinput:
        rowno = int(validinput.group(2)) - 1
        colno = ascii_lowercase.index(validinput.group(1))
        

        if -1 < rowno < gridsize:
            cell = (rowno, colno)
            message = ''

    return {'cell': cell, 'message': message}


def playgame():
    gridsize = 9
    numberofmines = 10

    currgrid = [[' ' for i in range(gridsize)] for i in range(gridsize)]

    grid = []
    
    starttime = 0

    helpmessage = ("Type the column followed by the row (eg. a5). "
                   "To put or remove a flag, add 'f' to the cell (eg. a5f).")

    showgrid(currgrid)
    print(helpmessage + " Type 'help' to show this message again.\n")

    while True:
        minesleft = numberofmines
 
        prompt = input('Enter the cell ({} mines left): '.format(minesleft))
        result = parseinput(prompt, gridsize, helpmessage + '\n')

        message = result['message']
        cell = result['cell']

        if cell:
            print('\n\n')
            rowno, colno = cell
            currcell = currgrid[rowno][colno]
            

            if not grid:
                grid, mines = setupgrid(gridsize, cell, numberofmines)
            if not starttime:
                starttime = time.time()

            if sum(map(lambda row: row.count(' '), currgrid)) == numberofmines:

                minutes, seconds = divmod(int(time.time() - starttime), 60)
                print(
                    'You Win. '
                    'It took you {} minutes and {} seconds.\n'.format(minutes,
                                                                      seconds))
                showgrid(grid)
                if playagain():
                    playgame()
                return

        showgrid(currgrid)
        print(message)

playgame()
Citera
2017-04-08, 09:22
  #8
Medlem
inneskos avatar
Citat:
Ursprungligen postat av melyhna
Men efter jag gjort alla de där stegen, så får jag när jag kör den att den inte ens skriver ut ngt, eller den skriver ut rutnätet men inte ngn output när jag tex trycker på a1.,

Kod:
import random
import re
import time
from string import ascii_lowercase

#root = Tk()
#screen = Canvas(root, width=500, height=600, background="#ff00ff",highlightthickness=0)
# screen.pack()

def setupgrid(gridsize, start, numberofmines):
    emptygrid = [['0' for i in range(gridsize)] for i in range(gridsize)]

    mines = getmines(emptygrid, start, numberofmines)

    for i, j in mines:
        emptygrid[i][j] = 'X'

    grid = getnumbers(emptygrid)

    return (grid, mines)


def showgrid(grid):
    gridsize = len(grid)

    horizontal = '   ' + (4 * gridsize * '-') + '-'

    # Print top column letters
    toplabel = '     '

    for i in ascii_lowercase[:gridsize]:
        toplabel = toplabel + i + '   '

    print(toplabel + '\n' + horizontal)

    # Print left row numbers
    for idx, i in enumerate(grid):
        row = '{0:2} |'.format(idx + 1)

        for j in i:
            row = row + ' ' + j + ' |'

        print(row + '\n' + horizontal)

    print('')


def getrandomcell(grid):
    gridsize = len(grid)

    a = random.randint(0, gridsize - 1)
    b = random.randint(0, gridsize - 1)

    return (a, b)


def getneighbors(grid, rowno, colno):
    gridsize = len(grid)
    neighbors = []

    for i in range(-1, 2):
        for j in range(-1, 2):
            if i == 0 and j == 0:
                continue
            elif -1 < (rowno + i) < gridsize and -1 < (colno + j) < gridsize:
                neighbors.append((rowno + i, colno + j))

    return neighbors


def getmines(grid, start, numberofmines):
    mines = []
    neighbors = getneighbors(grid, *start)

    for i in range(numberofmines):
        cell = getrandomcell(grid)
        while cell == start or cell in mines or cell in neighbors:
            cell = getrandomcell(grid)
        mines.append(cell)

    return mines


def getnumbers(grid):
    for rowno, row in enumerate(grid):
        for colno, cell in enumerate(row):
            if cell != 'X':
                # Gets the values of the neighbors
                values = [grid[r][c] for r, c in getneighbors(grid,
                                                              rowno, colno)]

                # Counts how many are mines
                grid[rowno][colno] = str(values.count('X'))

    return grid


def showcells(grid, currgrid, rowno, colno):
    # Exit function if the cell was already shown
    if currgrid[rowno][colno] != ' ':
        return

    # Show current cell
    currgrid[rowno][colno] = grid[rowno][colno]

    # Get the neighbors if the cell is empty
    if grid[rowno][colno] == '0':
        for r, c in getneighbors(grid, rowno, colno):
            # Repeat function for each neighbor that doesn't have a flag
            if currgrid[r][c] != 'F':
                showcells(grid, currgrid, r, c)


def playagain():
    choice = input('Play again? (y/n): ')

    return choice.lower() == 'y'


def parseinput(inputstring, gridsize, helpmessage):
    cell = ()
    
    message = "Invalid cell. " + helpmessage

    pattern = r'([a-{}])([0-9]+)(f?)'.format(ascii_lowercase[gridsize - 1])
    validinput = re.match(pattern, inputstring)

    if inputstring == 'help':
        message = helpmessage

    elif validinput:
        rowno = int(validinput.group(2)) - 1
        colno = ascii_lowercase.index(validinput.group(1))
        

        if -1 < rowno < gridsize:
            cell = (rowno, colno)
            message = ''

    return {'cell': cell, 'message': message}


def playgame():
    gridsize = 9
    numberofmines = 10

    currgrid = [[' ' for i in range(gridsize)] for i in range(gridsize)]

    grid = []
    
    starttime = 0

    helpmessage = ("Type the column followed by the row (eg. a5). "
                   "To put or remove a flag, add 'f' to the cell (eg. a5f).")

    showgrid(currgrid)
    print(helpmessage + " Type 'help' to show this message again.\n")

    while True:
        minesleft = numberofmines
 
        prompt = input('Enter the cell ({} mines left): '.format(minesleft))
        result = parseinput(prompt, gridsize, helpmessage + '\n')

        message = result['message']
        cell = result['cell']

        if cell:
            print('\n\n')
            rowno, colno = cell
            currcell = currgrid[rowno][colno]
            

            if not grid:
                grid, mines = setupgrid(gridsize, cell, numberofmines)
            if not starttime:
                starttime = time.time()

            if sum(map(lambda row: row.count(' '), currgrid)) == numberofmines:

                minutes, seconds = divmod(int(time.time() - starttime), 60)
                print(
                    'You Win. '
                    'It took you {} minutes and {} seconds.\n'.format(minutes,
                                                                      seconds))
                showgrid(grid)
                if playagain():
                    playgame()
                return

        showgrid(currgrid)
        print(message)

playgame()


Du har tagit bort för mycket, du verkar ha tagit bort rad 176 till 203, du ska bara ta bort rad 176 till 191 och ersätta elif på rad 192 med if. (Jag pratar om de radnummer du hittar på github sidan.)
__________________
Senast redigerad av innesko 2017-04-08 kl. 09:41.
Citera
2017-04-08, 12:12
  #9
Medlem
Citat:
Ursprungligen postat av innesko
Du har tagit bort för mycket, du verkar ha tagit bort rad 176 till 203, du ska bara ta bort rad 176 till 191 och ersätta elif på rad 192 med if. (Jag pratar om de radnummer du hittar på github sidan.)


Åh tack så mkt! nu fungerar det!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback