当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : python让我自己逻辑混乱
帖子发表于 : 2011-03-22 20:20 

注册: 2011-03-22 20:19
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
编程初学者,用while语句就开始逻辑混乱,自己做作业,已经发晕,每次调试都无法改正,求指导


规则是这样的:玩家和电脑,各两颗骰子,如果掷出的两颗骰子没有1,则分数累积,玩家可选择是否继续或结束回合,如果两颗骰子之中有一个1,则所得分数不予累计,强制结束回合,如果掷到两个1,累计的分数全部清零,并且强制结束回合,由电脑继续游戏。如此,直到有一方累计分数达到100或以上的,游戏胜利。题目中给予电脑的条件是只要在一回合中累计得分20点,则结束回合,由玩家继续游戏。


程序代码:
代码:
# Start
# Play control:
play = input('Would you like to play PIG (y/n)? ')# Play control
while play == 'y':

    # Welcome:
    username = input('Great! What is your name? ')
    print('Hi',username)

    # Game:
    scoreP = 0# Player's potential score
    scoreC = 0# Computer's potential score
    turn = 0# Turn control(Player: 0, Computer:1)
   


    # Player's turn:
    print('|------------------- Start Player\'s Turn ---------------------') 

        # Roll or hold:
    while turn == 0:
        hold = input('| Would you like to roll or hold (r/h)? ')
        while hold =='r':
            totalP = 0# Player's turn total
            import random
            dicP1 = random.randint(1,6)# Player's dice 1
            dicP2 = random.randint(1,6)# Player's dice 2
            toP = 0# Total of this turn
            # No 1
            if dicP1 and dicP2 != 1:
                stepP = dicP1 + dicP2# Step total
                toP = totalP + stepP
                scoreP = scoreP + toP
                print('| Die 1:',dicP1,'| Die 2:',dicP2,'| Die total:',stepP)
                print('| Turn total:',toP,'| Potential score:',scoreP)
                print('|')
                hold = input('| Would you like to roll or hold (r/h)? ')
            # If end
                 

            # Single 1
            elif dicP1 or dicP2 == 1:
                stepP = dicP1 + dicP2
                print('| Die 1:',dicP1,'| Die 2:',dicP2,'| Die total:',stepP)
                print('|')
                print('| *** You rolled a ONE - Turn over - No points for you!')
                # Turn end show:
                print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
                print('|------------------- End Player\'s Turn -----------------------')
                print('|------------------- Start Computer\'s Turn -------------------')
                turn = turn + 1
            # Elif end
                 

            # Double 1s
            else:
                stepP = dicP1 + dicP2
                totalP = 0
                print('| Die 1:',dicP1,'| Die 2:',dicP2,'| Die total:',stepP)
                print('|')
                print('| *** Ouch! That hurts! Two ONEs - You lose your entire score!')
                print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
                print('|------------------- End Player\'s Turn -----------------------')
                print('|------------------- Start Computer\'s Turn -------------------')
                turn = turn + 1
            # Else end
                 

            # While End
        else:
            turn = turn+ 1
            print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
            print('|------------------- End Player\'s Turn -----------------------')
            print('|------------------- Start Computer\'s Turn -------------------')
        # while end
           

        # Else end
           


    # While end
    # Player's Turn end
     

    # Computer's turn:
    else:
        # Roll or hold:
        totalC = 0
        while totalC < 20:
            import random
            dicC1 = random.randint(1,6)# Computer's dice 1
            dicC2 = random.randint(1,6)# Computer's dice 2
           

            # No 1
            if dicC1 and dicC2 != 1:
                stepC = dicC1 + dicC2# Step total
                toC = stepC + totalC
                scoreC = scoreC + toC
                print('| Die 1:',dicC1,'| Die 2:',dicC2,'| Die total:',stepC)
                print('| Turn total:',toC,'| Potential score:',scoreC)
                print('|')
            # If end

            # Single 1
            elif dicC1 or dicC2 == 1:
                stepC = dicC1 + dicC2
                print('| Die 1:',dicC1,'| Die 2:',dicC2,'| Die total:',stepC)
                print('|')
                print('| *** Computer rolled a ONE - Turn over - No points for computer!')
                # Turn end show:
                print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
                print('|------------------- End Computer\'s Turn ---------------------')
                turn = turn - 1
            # Elif end
                 

            # Double 1s
            else:
                stepC = dicC1 + dicC2
                totalC = 0
                print('| Die 1:',dicC1,'| Die 2:',dicC2,'| Die total:',stepC)
                print('|')
                print('| *** Ouch! That hurts! Two ONEs - Computer lose entire score!')
                print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
                print('|------------------- End Computer\'s Turn ---------------------')
                turn = turn - 1
            # Else end
        # While end
           

        else:
            print('| *** Kramer\'s score:',scoreP,'| Computer\'s score:',scoreC)
            print('|------------------- End Computer\'s Turn ---------------------')
            turn = turn - 1

           



    # Else end
    # Computer's turn end
     

    # Replay control:
    play = input('Would you like to play again (y/n)? ')
# While end
#
else:
    print('Thanks for playing')


页首
 用户资料  
 
2 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-22 20:47 

注册: 2010-09-27 12:59
帖子: 2061
送出感谢: 0 次
接收感谢: 0 次
額。。 :em06


_________________
生活里,有很多转瞬即逝,像在车站的告别,刚刚还相互拥抱,转眼已各自天涯。很多时候,你不懂,我也不懂,就这样,说着说着就变了,听着听着就倦了,看着看着就厌了,跟着跟着就慢了,走着走着就散了,爱着爱着就淡了,想着想着就算了。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-23 12:56 

注册: 2010-10-21 0:59
帖子: 15
送出感谢: 0 次
接收感谢: 0 次
首先规则没说明好,分数累积是累积几分?
其次这样的代码没法读,不要滥用if else
把判断代码写在def里调用
# Else end这类注释没有必要加


页首
 用户资料  
 
4 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-23 13:56 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
换Perl。就不会这样。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-23 22:09 
头像

注册: 2007-09-29 3:09
帖子: 5777
送出感谢: 0 次
接收感谢: 5
eexpress 写道:
换Perl。就不会这样。

同意


_________________
HUNT Unfortunately No Talent...


页首
 用户资料  
 
6 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-23 22:33 
头像

注册: 2007-09-23 13:36
帖子: 364
送出感谢: 0 次
接收感谢: 2
我贴一个面向对象的
代码:
#!/usr/bin/env python
# encoding: utf-8

from random import randint

class GameOver(Exception):
   def __init__(self, winner):
      self.winner = winner

class Player:
   def __init__(self):
      self.score = 0
      self.turn_score = 0

   def throw(self):
      x, y = randint(1, 6), randint(1, 6)
      if x == 1 and y == 1:
         self.score = 0
         self.turn_score = 0
         print self, '丢出', x, ',', y, '回合结束, 累计得分清零!'
      elif x == 1 or y == 1:
         self.score = self.score - self.turn_score
         self.turn_score = 0
         print self, '丢出', x, ',', y, '回合结束, 得分不累计. 当前累计得分:', self.score
      else:
         score = x + y
         self.score = self.score + score
         self.turn_score = self.turn_score + score
         print self, '丢出', x, ',', y, '得分:', score, '回合得分:', self.turn_score, '累计得分:', self.score
         if self.score >= 100:
            raise GameOver(self)
   
   def turn(self):
      self.turn_score = 0
      self.throw()
      while self.turn_score and self.choose():
         self.throw()

class HumPlayer(Player):
   def choose(self):
      choice = raw_input('继续吗? ')
      return choice == 'y' or choice == 'Y'
   def __str__(self):
      return '玩家'

class ComPlayer(Player):
   def choose(self):
      return self.turn_score < 20
   def __str__(self):
      return '电脑'

if __name__ == '__main__':
   hum = HumPlayer()
   com = ComPlayer()

   try:
      while True:
         hum.turn()
         com.turn()
   except GameOver as e:
      print '--------------------------------'
      print '最终的胜利者是', e.winner
      print hum, '累计得分:', hum.score
      print com, '累计得分:', com.score


页首
 用户资料  
 
7 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-24 0:06 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
HuntXu 写道:
eexpress 写道:
换Perl。就不会这样。

同意


额……其实用Python也不会这样,很多代码可以弄成函数啊~~~


页首
 用户资料  
 
8 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-24 0:45 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
楼主,逻辑太复杂的话,自己先画个图,理清楚再写代码
不然就是越写越乱

某人说用perl就不会有事,别相信!


页首
 用户资料  
 
9 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-24 0:50 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
用函数会死星人。。。
PS:这显然就是 PERL 的风格。。。


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-24 9:10 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
py是为了合作,写给别人看的。语法僵硬。怎么会不影响自己的思维。
:em04


_________________
● 鸣学


页首
 用户资料  
 
11 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-03-24 9:31 
头像

注册: 2007-11-29 9:41
帖子: 8455
送出感谢: 0 次
接收感谢: 0 次
我讨厌python :em20 更讨厌perl


页首
 用户资料  
 
12 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-04-03 11:56 
头像

注册: 2008-09-13 19:17
帖子: 7789
系统: Arch Linux (x86_64)
送出感谢: 10
接收感谢: 77
为什么我感觉不到那是python代码,颇有perl风格


_________________
博客:http://www.lainme.com


页首
 用户资料  
 
13 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-04-03 12:47 
头像

注册: 2007-04-06 10:24
帖子: 2487
地址: ~/Shanghai
送出感谢: 0 次
接收感谢: 0 次
那个说python语法僵硬的不是人,是神


_________________
http://silenceisdefeat.com/~greco
代码:
''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d


页首
 用户资料  
 
14 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-04-05 4:38 

注册: 2008-07-09 0:39
帖子: 353
送出感谢: 1
接收感谢: 0 次
用Perl (MooseX::Declare) 以相同行数重实现 6楼的脚本,在Ubuntu下先安装 libmoosex-declare-perl
代码:
#!/usr/bin/perl
use strict;
use integer;
use MooseX::Declare;

role Player {
    has 'score', is => 'rw', isa => 'Int', default => 0;
    has 'turn_score', is => 'rw', isa => 'Int', default => 0;
    requires qw(choose type);

    method throw {
        my ($x, $y) = (1+rand(6), 1+rand(6));
        if ($x == 1 and $y == 1) {
            $self->score(0);
            $self->turn_score(0);
            print $self->type() . "丢出 $x,$y,回合结束,累计得分清零!\n";
        } elsif ($x == 1 or $y == 1) {
            $self->score($self->score() - $self->turn_score());
            $self->turn_score(0);
            print $self->type() . "丢出 $x,$y,回合结束, 得分不累计. 当前累计得分: " . $self->score() . "\n";
        } else {
            my $score = $x + $y;
            $self->score($self->score() + $score);
            $self->turn_score($self->turn_score() + $score);
            print $self->type(), "丢出 $x,$y,得分: $score,回合得分: ", $self->turn_score(), ",累计得分: ", $self->score(), "\n";
            die("Winner: " . $self->type()) if ($self->score() >= 100);
        }
    }

    method turn {
        $self->turn_score(0);
        do {$self->throw()} while $self->turn_score() and $self->choose();
    }
}

class HumPlayer with Player {
    method choose {
        print "继续吗?\n";
        my $a = <STDIN>;
        return $a=~/^y$/i;
    }

    method type {'玩家'}
}

class ComPlayer with Player {
    method choose { return $self->turn_score() < 20 }
    method type {'电脑'}
}

my $hum = HumPlayer->new();
my $com = ComPlayer->new();
eval {
    while(1){
        $hum->turn();
        $com->turn();
    }
};
print <<EOF if ($@=~/^Winner: (\S+)/);
--------------------------------
最终的胜利者是: $1
@{[$hum->type()]} 累计得分: @{[$hum->score()]}
@{[$com->type()]} 累计得分: @{[$com->score()]}
EOF


_________________
7号机-----神舟 优雅A460P-i7G D2
CPU: i7-2670QM
RAM: 8G
HD:500G
OS:Fedora 17 x86_64

热衷话题:Package Management\Programming


页首
 用户资料  
 
15 楼 
 文章标题 : Re: python让我自己逻辑混乱
帖子发表于 : 2011-05-12 10:14 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
翻了几下教程,可以写python了。
这种小游戏不用函数也很简单的,不过要先明确一下规矩:
玩家- 两个骰子都无1则分数加入积分,可以选择继续掷或停止回合,两个1则停止,积分清零,一个1也停止,积分不动。
电脑- 两个骰子都无1则分数加入积分,继续掷,两个1则停止,积分清零,一个1也停止,积分不动,如果在一个回合中得到20分或以上,也停止。
游戏结束条件:任何一方积分达到100或以上为赢家。
代码:
#!/usr/bin/python
# encoding: utf-8

#玩家号码:1  电脑号码:0

from random import randrange
sum = [0,0]
string = ['电脑','玩家']
change = ['玩家','电脑']
player = 1
sum_pc = 0

print '*****玩家先掷*****'
while True:
   result = [randrange(1,7),randrange(1,7)]
   print '掷出了 ' + repr(result)
   if 1 in result:   
      print '换' + change[player] + '掷!'
      if result.count(1) == 2: sum[player] = 0
   else:
      sum[player] = sum[player] + result[0] + result[1]
      if sum[player] > 99:
         print '赢的是' + string[player] + '积分 ' + repr(sum[player]) + '。'
         break
      print '积分:' + repr(sum[player])
      if player == 1:
         answer = raw_input('继续掷吗(y/n)?  ')
         if answer == 'y': continue
      if player == 0:
         sum_pc = sum_pc + result[0] + result[1]
         if sum_pc < 20:
             continue
         else:
            print '电脑在此回合得到' + repr(sum_pc) + '分,换玩家掷!'
   sum_pc = 0
   print string[player] + '的积分是:' + repr(sum[player])
   print
   if player == 1:
      player = 0
   else:
      player = 1
   print '*****现在到' + string[player] + '掷!*****'


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译