Posts Issued in July, 2014

  • CMS Open Real Estate
  • EximusCommerce
  • Cобрать магазин из расширений: Nested Sets, EAV, Shopping Cart.
  • CMS Open Real Estate - это бесплатный скрипт для создания сайта агентства недвижимости, разработанный на Yii фреймворке.Распространяется под общедоступной открытой лицензией GNU GPL второй редакции.http://monoray.ru/products

  • Вы можете без ограничений использовать EximusCommerce на своем локальном компьютере в целях тестирования, но для работы на публичном сервере нужна лицензия. http://eximuscommerce.com/download

  • Nested Sets. Подход к созданию каталогов: использование nested sets.

  • EAV. Часто нужно задать большое количество полей для разных видов записей. Плюс поля должны быть разными для каждого вида (типа), одним словом динамическое число характеристик товара, или записи. Используется принцип моделей EAV (Entity–Attribute–Value, Сущность-Атрибут-Значение), готовое расширение

  • Shopping Cart. Основные функции: положить товар в корзину, вернуть все позиции, удалить/обновить позицию и посчитать общую стоимость товара в корзине, [готовое решение]( - http://yiiext.github.io/extensions/shopping-cart-component/readme.ru.html)

Docs * http://www.php.net/manual/ru/book.mongo.php * http://www.yiiframework.com/extension/yiimongodbsuite/ * http://canni.github.io/YiiMongoDbSuite/

Для начала работы с монго из php нужно установить php-драйвер для работы с ней. Добавить extension=mongo.so в php.ini и перезапустить сервер. Если всё правильно - сейчас стало возможным использовать классы драйвера, но мы хотим, чтобы использование монго было таким же, как использование обычных AR-моделей.Для этой цели давайте воспользуемся расширением YiiMongoDbSuite. Подключаем его как написано в документации:

'import' => array(
  ...
  'ext.YiiMongoDbSuite.*',
),
…
'components' => array(
  ...
  'mongodb' => array(
      'class'            => 'EMongoDB',
      'connectionString' => 'mongodb://localhost',
      'dbName'           => 'testdb',
      'fsyncFlag'        => true,
      'safeFlag'         => true,
      'useCursor'        => false
  ),
),

Описание модели:

class Users extends EMongoDocument
{
    public $username;
    public $passowrd;
    public $email;
    public $is_active;
 
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function getCollectionName()
    {
        return 'users';
    }
 
    public function rules()
    {
        return array(
            array('username, password, email', 'required'),
            array('username, password, email', 'length', 'max' => 255),
            array('is_active', 'numerical', 'integerOnly' => true),
        );
    }
 
    public function attributeLabels()
    {
        return array(
            'username'  => 'Имя пользователя',
            'password'   => 'Пароль',
            'email'   => 'E-mail',
            'is_active' => 'Актывный пользователь?'
        );
    }
}
  • Определяем, чтобы дата в формате mm/dd/yyyy была в будущем
  • Валидируем время в формате g:i a (10:05 am)
  • Валидируем чтобы дата окончания была больше начальной даты (endDate > startDate)
  • Пароль должен содержать хотя бы 1 заглавную букву и хотя бы 1 цифру
  • Пароль должен содержать хотя бы 1 заглавную букву и хотя бы 1 цифру
  • Пароль должен содержать хотя бы 1 заглавную букву и хотя бы 1 цифру
  • Исключение валидации для определенных сценариев
  • Исключение валидации для определенных сценариев
  • Уникальность с условием
  • Работа с внешними ключами
  • List Item Определяем, чтобы дата в формате mm/dd/yyyy была в будущем
array('startDate, endDate', 'date', 'format' => 'MM/dd/yyyy'),
array('startDate, endDate', 'compare', 'compareValue' => date('m/d/Y'), 'operator' => '>=', 'message'=>'{attribute} must be later or equal than Now.'),
  • Валидируем время в формате g:i a (10:05 am)
array('startTime, endTime', 'date', 'allowEmpty' => true, 'format' => 'M:m a'),
  • Валидируем чтобы дата окончания была больше начальной даты (endDate > startDate)
array('startDate',
 'ext.validators.dateCompare.EDateCompare',
 'dateFormat' => 'm/d/Y',
 'compareAttribute' => 'endDate',
 'operator' => '<=',
 'message' => 'Start date must be before end date.'
),
array('endDate',
 'ext.validators.dateCompare.EDateCompare',
 'dateFormat' => 'm/d/Y',
 'compareAttribute' => 'startDate',
 'operator' => '>=',
 'message' => 'End date must be after start date.'
),
  • Пароль должен содержать хотя бы 1 заглавную букву и хотя бы 1 цифру
array('password', 'match', 'pattern'=>'/[A-Z]{1}/', 'message' => 'Password must contain at least 1 capital letter.'),
array('password', 'match', 'pattern'=>'/\d+/', 'message' => 'Password must contain at least 1 number.'),
  • array('password', 'match', 'pattern'=>'/[A-Z]{1}/', 'message' => 'Password must contain at least 1 capital letter.'), array('password', 'match', 'pattern'=>'/\d+/', 'message' => 'Password must contain at least 1 number.'),
public static function getOptions() {
  return array(
    self::GENDER_FEMALE=>'Female',
    self::GENDER_MALE=>'Male',
    self::GENDER_NONE=>'None',
  );
}
И валидация:
array('gender', 'in', 'range'=>array_keys(self::getOptions()))
  • Устанавливаем значение по-умолчанию.
Валидация не производится, а просто задается значение. Используется при $model->save() или $model->validate()
array('user_id', 'default', 'value'=>Yii::app()->user->id),
  • Исключение валидации для определенных сценариев
array(
  'first_name, last_name, primary_phone, address1, country_id, state_id, email',
  'required',
  'except' => array('register'),
),
  • Поля first_name, last_name, middle_name должны содержать только текст
rray('first_name, last_name, middle_name', 'match', 'pattern'=>'/[a-zA-Z]+$/s', 'message'=>'Must contains only letters.'),
  • Уникальность с условием
Проверяем уникальность имени при условии что owner_id = id-добавляющего имя пользователя. Получаем что пользователь не может добавить одинаковые имена.
array('name', 'unique', 'criteria'=>array(
  'condition'=>'owner_id=:owner_id',
  'params'=>array(':owner_id'=>Yii::app()->user->id)),
),
  • Работа с внешними ключами
Значения полей from_id и to_id должны существовать как значения атрибута id в моделе User. В данном случае form_id и to_id - внешние ключи.
'exists', 'className' => 'User', 'attributeName' => 'id')

Разберем создание диалоговых окон yii на примере формы обратной связи.

class QuickForm extends CFormModel
{
    public $name;
    public $phone;
    public $timeToCall;
 
    public function rules()
    {
        return array(
            array('name, phone', 'required'),
            array('timeToCall', 'safe'),
        );
    }
 
    public function attributeLabels()
    {
        return array(
            'name'=>'Ваше имя',
            'phone'=>'Телефон',
            'timeToCall'=>'Время звонка',
        );
    }
}

2) Т.к. ссылка на форму видна на каждой странице сайта, в /views/layouts/main.php вставляем следующий код:

$this--->beginWidget('zii.widgets.jui.CJuiDialog', array(
                    'id' => 'mydialog',
                    'options' => array(
                        'title' => 'Отправить сообщение',
                        'autoOpen' => false,
                        'modal' => true,
                        'resizable'=> false
                    ),
                ));
                $qForm = new QuickForm;
 
                $form = $this->beginWidget('CActiveForm', array(
                            'id' => 'quick-form',
                            'enableClientValidation' => true,
                            'clientOptions' => array(
                                'validateOnSubmit' => true,
                            ),
                            'action' => array('site/quick'),
                        ));
                ?>
 
                    <!--?php echo $form--->errorSummary($qForm); ?>
 
                        <!--?php echo $form--->labelEx($qForm,'name'); ?>
                        <!--?php echo $form--->textField($qForm,'name', array('size'=>35)); ?>
                        <!--?php echo $form--->error($qForm,'name'); ?>
 
                        <!--?php echo $form--->labelEx($qForm,'phone'); ?>
                        <!--?php echo $form--->textField($qForm,'phone', array('size'=>35)); ?>
                        <!--?php echo $form--->error($qForm,'phone'); ?>
 
                        <!--?php echo $form--->labelEx($qForm,'timeToCall'); ?>
                        <!--?php echo $form--->textField($qForm,'timeToCall', array('size'=>35)); ?>
                        <!--?php echo $form--->error($qForm,'timeToCall'); ?>
 
 
                        <!--?php echo CHtml::submitButton('Отправить'); ?-->
 
                <!--?php
                $this--->endWidget();
                $this->endWidget('zii.widgets.jui.CJuiDialog');
                ?>`

3) экшен (site/quick):

public function actionQuick() {
        $model=new QuickForm;
            $model->attributes=$_POST['QuickForm'];
            if($model->validate()) {
                $headers="From: light-net@light-net.ru\r\nReply-To: light-net@light-net.ru";
                $body = "\n\nОтправитель: ".$model->name."\t Телефон: ".$model->phone."\t Время звонка: ".$model->timeToCall;
                mail(Yii::app()->params['adminEmail'],'ПЕРЕЗВОН!',$body,$headers);
            }
        $this->redirect(array('site/index'));
}

4) ссылкa на диалоговое окно:

<!--?php echo CHtml::link('Оставьте номер', '#', array('onclick' =--> '$("#mydialog").dialog("open"); return false;',)); ?>и мы Вам перезвоним!

Теперь при нажатии на ссылку появляется модальное окно, после ввода данных они передаются в экшен контроллера и отправляются нам на e-mail, и делается редирект на главную страницу.

Bыбрать из базы сгрупированные данные по дню и сложить значение одного поля. Оказалось что привычным мне классом CDbCriteria() этого не сделать - нужно использовать DAO

$model = Yii::app()->db->createCommand()
    ->select('created_date, SUM(amount) as total')
    ->from('payment p')
    ->group('created_date')
    ->order('created_date DESC')
    ->queryAll();

Output

foreach($model as $m) {
    echo $m['created_date'].' - '.$m['total'];
}
CHtml::link()
CHtml::button()
CHtml::textField()
CHtml::listData()
CHtml::dropDownList()


Метод CHtml::link()

public static string link(string $text, mixed $url='#', array $htmlOptions=array ( )) Генерирует тег Пример 1: Ссылка на определённых экшен контроллера:

<?php echo CHtml::link('Link Text',array('controller/action')); ?>

На выходи, получаем HTML:

Link Text Пример 2: Ссылка на экшен с передачей дополнительных параметров:

<?php echo CHtml::link('Link Text',array('controller/action', 'param1'=>'value1')); ?>

Код HTML:

Link Text Пример 3: Аналогичен предыдущему, но передаем несколько параметров:

<?php echo CHtml::link('Link Text',array('controller/action', 'param1'=>'value1', 'param2'=>'value2', 'param3'=>'value3')); ?>

Код:

Link Text Пример 4: Ссылка, открывающая страницу в новой вкладке:

<?php echo CHtml::link('Link Text',array('controller/action', 'param1'=>'value1'), array('target'=>'_blank'); ?>

Код:

Link Text Пример 5: Ссылка, на экшен, внутри одного контроллера:

(предположим что нужно добавить ссылку из PostController/view на PostController/create)

<?php echo CHtml::link('Link Text',array('action')); ?> Пример 6: Ссылка из корневя сайта:

(предположим нужна ссылка из модуля на какой-либо контроллер корневого сайта)

<?php echo CHtml::link('Link Text',array('/controller/action')); ?> Пример 7: Ссылка на экшен модуля:

<?php echo CHtml::link('Link Text',array('/module-id/controller/action')); ?> Пример 8: Ссылка на экшен внутри модуля:

<?php echo CHtml::link('Link Text',array('/{$this->module->id}/controller/action')); ?> Метод CHtml::button()

public static string button(string $label='button', array $htmlOptions=array ( )) Генерирует кнопку. Пример 1: Подключение кнопки к какому-либо экшену контроллера:

<?php echo CHtml::button('Button Text', array('submit' => array('controller/action'))); ?> Код:

Метод CHtml::textField()

public static function textField($name,$value='',$htmlOptions=array())

Генерирует текстовое поле. Пример 1: Генерация пустого поля, с именем

<?php echo CHtml::textField('Text'); ?> Пример 2: Генерация поля с именем и значением:

<?php echo CHtml::textField('Text', 'some value'); ?> Пример 3: Генерация поля с дополнительными HTML параметрами

<?php echo CHtml::textField('Text', 'some value', array('id'=>'idTextField', 'width'=>100, 'maxlength'=>100); ?> Пример 4: Генерация выключенного поля

<?php echo CHtml::textField('Text', 'some value', array('disabled'=>'disabled'); ?> Метод CHtml::listData()

public static function listData($models,$valueField,$textField,$groupField='')

Генерирует данные для dropDownList и listBox в формате $key=>$value Пример 1: Генерация категорий:

<?php /you can use here any find method you think proper to return your data from db/ $models = categories::model()->findAll();

 // format models resulting using listData    
 $list = CHtml::listData($models,
            'category_id', 'category_name');   

 print_r($list);

Вывод HTML:

array("1" => "Arts", "2" => "Science", "3" => "Culture"); Пример 2: Генерация сортированных списков с использованием findAll()

<?php $models = categories::model()->findAll( array('order' => 'category_name'));

 $list = CHtml::listData($models,
            'category_id', 'category_name');   

 print_r($list);

Метод CHtml::dropDownList()

public static function dropDownList($name,$select,$data,$htmlOptions=array()) Генерирует выпадающий список Пример 1: Генерация простого выпадающего списка для выбора пола

<?php echo CHtml::dropDownList('listname', $select, array('M' => 'Male', 'F' => 'Female')) Пример 2: Генерация выпадающего списка с пустым элементом

<?php echo CHtml::dropDownList('listname', $select, array('M' => 'Male', 'F' => 'Female'), array('empty' => '(Select a gender)')); Пример 3: Генерация списка с использованием данных из модели:

В модели: public function getGenderOptions(){ return array('M' => 'Male', 'F' => 'Female'); } В представлении: <?php echo CHtml::dropDownList('listname', $select, $model->genderOptions, array('empty' => '(Select a gender')); Пример 4: Использовании данных из базы

// retrieve the models from db $models = categories::model()->findAll( array('order' => 'category_name'));

// format models as $key=>$value with listData $list = CHtml::listData($models, 'category_id', 'category_name'); <?php echo CHtml::dropDownList('categories', $category, $list, array('empty' => '(Select a category'));

First ever lines of code in Py. For testing go to cloud www.codesculptor.org and paste the code in canvas, then press run. Week 7 - 8, Spaceship game is final assignment.

# program template for Spaceship
import simplegui
import math
import random
 
# globals for user interface
WIDTH = 760
HEIGHT = 540
score = 0
lives = 3
time = 0
 
class ImageInfo:
    def __init__(self, center, size, radius = 0, lifespan = None, animated = False):
        self.center = center
        self.size = size
        self.radius = radius
        if lifespan:
            self.lifespan = lifespan
        else:
            self.lifespan = float('inf')
        self.animated = animated
 
    def get_center(self):
        return self.center
 
    def get_size(self):
        return self.size
 
    def get_radius(self):
        return self.radius
 
    def get_lifespan(self):
        return self.lifespan
 
    def get_animated(self):
        return self.animated
 
 
# art assets created by Kim Lathrop, may be freely re-used in non-commercial projects, please credit Kim
 
# debris images - debris1_brown.png, debris2_brown.png, debris3_brown.png, debris4_brown.png
#                 debris1_blue.png, debris2_blue.png, debris3_blue.png, debris4_blue.png, debris_blend.png
debris_info = ImageInfo([320, 240], [640, 480])
debris_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/debris2_blue.png")
 
# nebula images - nebula_brown.png, nebula_blue.png
nebula_info = ImageInfo([400, 300], [800, 600])
nebula_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/nebula_blue.png")
 
# splash image
splash_info = ImageInfo([200, 150], [400, 300])
splash_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/splash.png")
 
# ship image
ship_info = ImageInfo([45, 45], [90, 90], 35)
ship_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/double_ship.png")
center_dest_ship = (120,140)
# missile image - shot1.png, shot2.png, shot3.png
missile_info = ImageInfo([5,5], [10, 10], 3, 50)
missile_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/shot2.png")
 
# asteroid images - asteroid_blue.png, asteroid_brown.png, asteroid_blend.png
asteroid_info = ImageInfo([45, 45], [90, 90], 40)
asteroid_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/asteroid_blue.png")
 
# animated explosion - explosion_orange.png, explosion_blue.png, explosion_blue2.png, explosion_alpha.png
explosion_info = ImageInfo([64, 64], [128, 128], 17, 24, True)
explosion_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/explosion_alpha.png")
 
# sound assets purchased from sounddogs.com, please do not redistribute
soundtrack = simplegui.load_sound("http://commondatastorage.googleapis.com/codeskulptor-assets/sounddogs/soundtrack.mp3")
missile_sound = simplegui.load_sound("http://commondatastorage.googleapis.com/codeskulptor-assets/sounddogs/missile.mp3")
missile_sound.set_volume(.5)
ship_thrust_sound = simplegui.load_sound("http://commondatastorage.googleapis.com/codeskulptor-assets/sounddogs/thrust.mp3")
explosion_sound = simplegui.load_sound("http://commondatastorage.googleapis.com/codeskulptor-assets/sounddogs/explosion.mp3")
 
# helper functions to handle transformations
def angle_to_vector(ang):
    return [math.cos(ang), math.sin(ang)]
 
def dist(p,q):
    return math.sqrt((p[0] - q[0]) ** 2+(p[1] - q[1]) ** 2)
 
 
# Ship class
class Ship:
    def __init__(self, pos, vel, angle, image, info):
        self.pos = [pos[0],pos[1]]
        self.vel = [vel[0],vel[1]]
        self.thrust = False
        self.angle = angle
        self.angle_vel = 0
        self.image = image
        self.image_center = info.get_center()
        self.image_size = info.get_size()
        self.radius = info.get_radius()
 
    def draw(self,canvas):
        global ship_info, center_dest_ship
        #rotation=1
        canvas.draw_image(ship_image, ship_info.center, (ship_info.center[0]*2,ship_info.center[1]*2), self.pos, ship_info.get_size(), self.angle)
        #canvas.draw_image(ship_image, (50,50),          (100,100),                                    (120,140), (50,50))
        #canvas.draw_circle(self.pos, self.radius, 1, "White", "White")
 
    def update(self):
        self.pos [0] += self.vel[0]
        self.pos [1] += self.vel[1]
        self.angle_vel = 0.05
        self.angle += self.angle_vel
        pass
 
 
# Sprite class
class Sprite:
    def __init__(self, pos, vel, ang, ang_vel, image, info, sound = None):
        self.pos = [pos[0],pos[1]]
        self.vel = [vel[0],vel[1]]
        self.angle = ang
        self.angle_vel = ang_vel
        self.image = image
        self.image_center = info.get_center()
        self.image_size = info.get_size()
        self.radius = info.get_radius()
        self.lifespan = info.get_lifespan()
        self.animated = info.get_animated()
        self.age = 0
        if sound:
            sound.rewind()
            sound.play()
 
    def draw(self, canvas):
        canvas.draw_circle(self.pos, self.radius, 1, "Red", "Red")
 
    def update(self):
        pass        
 
 
def draw(canvas):
    global time
 
    # animiate background
    time += 1
    center = debris_info.get_center()
    size = debris_info.get_size()
    wtime = (time / 8) % center[0]
    canvas.draw_image(nebula_image, nebula_info.get_center(), nebula_info.get_size(), [WIDTH / 2, HEIGHT / 2], [WIDTH, HEIGHT])
    canvas.draw_image(debris_image, [center[0] - wtime, center[1]], [size[0] - 2 * wtime, size[1]], 
                                [WIDTH / 2 + 1.25 * wtime, HEIGHT / 2], [WIDTH - 2.5 * wtime, HEIGHT])
    canvas.draw_image(debris_image, [size[0] - wtime, center[1]], [2 * wtime, size[1]], 
                                [1.25 * wtime, HEIGHT / 2], [2.5 * wtime, HEIGHT])
 
    # draw ship and sprites
    my_ship.draw(canvas)
    a_rock.draw(canvas)
    a_missile.draw(canvas)
 
    # update ship and sprites
    my_ship.update()
    a_rock.update()
    a_missile.update()
 
# timer handler that spawns a rock    
def rock_spawner():
    pass
 
# initialize frame
frame = simplegui.create_frame("Asteroids", WIDTH, HEIGHT)
 
# initialize ship and two sprites
my_ship = Ship([WIDTH / 2, HEIGHT / 2], [1, 1], 2, ship_image, ship_info)
a_rock = Sprite([WIDTH / 3, HEIGHT / 3], [1, 1], 0, 0, asteroid_image, asteroid_info)
a_missile = Sprite([2 * WIDTH / 3, 2 * HEIGHT / 3], [-1,1], 0, 0, missile_image, missile_info, missile_sound)
 
# register handlers
frame.set_draw_handler(draw)
 
timer = simplegui.create_timer(1000.0, rock_spawner)
 
# get things rolling
timer.start()
frame.start()

First ever lines of code in Py. For testing go to cloud www.codesculptor.org and paste the code in canvas, then press run. Week 2, assignment 2.

# template for "Guess the number" mini-project
# input will come from buttons and an input field
# all output for the game will be printed in the console
import simplegui
import random
import math
 
# initialize global variables used in your code
num_range=100
gaming_var=50
choice=0
nr_guess=1
num_guess=7
msg_lost=''
 
#helper func to init game
def init(): #5 lines of code
    global num_range,gaming_var,num_guess,nr_guess,msg_lost
    if num_range==100:
        num_guess=7
    else:
        num_guess=10
    gaming_var=random.randrange(0, num_range)
    nr_guess=0
    msg_lost=''
    print ''
    print "New game. Range is from 0 to " + str(num_range)
    print "Number of remaining guesses is " + str(num_guess)
    print num_guess, nr_guess
 
 
 
# define event handlers for control panel
"""def get_input(input):
    global choice
    choice=int(input)
    print choice"""
 
def range100(): #3 lines of code
    global num_range
    num_range=100
    init()
    # button that changes range to range [0,100) and restarts
 
def range1000(): #3 lines of code
    global num_range
    num_range=1000
    init()
    # button that changes range to range [0,1000) and restarts
 
def get_input(guess): #14 lines of code
    # main game logic goes here 
    global num_range,gaming_var,choice,num_guess,nr_guess,msg_lost
    #choice=get_input
    choice=int(guess)
    nr_guess +=1
    print '' 
    print 'Guess was ' + guess
    print 'Number of remaining guesses is ' + str(num_guess-nr_guess)
 
    if choice>gaming_var:
        print 'Lower!'
    elif choice<gaming_var:
        print 'Higher!'
    elif choice==gaming_var:
        msg_lost='Correct!'
        print msg_lost
        print ''
        init()
    else:
        print 'ERROR OCCURED!'
 
    if nr_guess>num_guess and msg_lost!='Correct!':
        print "You Lost!"
        init()
 
 
# create frame
f=simplegui.create_frame('Guess the number',200,200)
 
# register event handlers for control elements
f.add_button("Range is [0..100)", range100, 200)
f.add_button("Range is [0..1000)", range1000, 200)
f.add_input("Enter a guess", get_input, 200)
 
# start frame
init()
 
# always remember to check your completed program against the grading rubric

First ever lines of code in Py. For testing go to cloud www.codesculptor.org and paste the code in canvas, then press run.Week 1, assignment 1: really really first ever program in Python!!!

# The key idea of this program is to equate the strings
# "rock", "paper", "scissors", "lizard", "Spock" to numbers
# as follows:
#
# 0 - rock
# 1 - Spock
# 2 - paper
# 3 - lizard
# 4 - scissors
 
# helper functions
 
def number_to_name(number):
    # fill in your code below
    if number==0:
        result='rock'
        elif number==1:
            result='Spock'
        elif number==2:
            result='paper'
        elif number==3:
            result='lizard'
        elif number==4:
            result='scissors'    
    else:
        result= 'Your input is incorrect, please check)))'
    return result
 
    # convert number to a name using if/elif/else
    # don't forget to return the result!
 
 
def name_to_number(name):
    # fill in your code below
    if number=='rock':
        result=0
        elif name=='Spock':
            result=1
        elif name=='paper':
            result=2
        elif name=='lizard':
            result=3
        elif name=='scissors':
            result=4    
    else:
        result= 5
        print 'Your input is incorrect, please check)))'
    return result
    # convert name to number using if/elif/else
    # don't forget to return the result!
 
 
def rpsls(name): 
    # fill in your code below
 
    # convert name to player_number using name_to_number
    player_number=name_to_number(name)
 
    # compute random guess for comp_number using random.randrange()
    comp_number=random.randrange(0,5)
    # compute difference of player_number and comp_number modulo five
    differ=player_number-comp_number
 
    # use if/elif/else to determine winner
 
    # convert comp_number to name using number_to_name
 
    # print results
 
 
# test your code
rpsls("rock")
rpsls("Spock")
rpsls("paper")
rpsls("lizard")
rpsls("scissors")
 
# always remember to check your completed program against the grading rubric

First ever lines of code in Py. For testing go to cloud www.codesculptor.org and paste the code in canvas, then press run.Implementation of card game - Memory. Week 5 of 8, assignment #5

# implementation of card game - Memory
 
import simplegui
import random
memory_numbers=[]
 
# helper function to initialize globals
def init():
    global memory_numbers
    numbers = range(8)
    random.shuffle(numbers)
    n1=numbers
 
    random.shuffle(numbers)
    n2=numbers
 
    memory_numbers = n1 + n2
    print memory_numbers
 
 
 
# define event handlers
def mouseclick(pos):
    # add game state logic here
    pass
 
 
# cards are logically 50x100 pixels in size    
def draw(canvas):
    for i in range(50,800,50):
        canvas.draw_line((i , 0), (i , 100), 1, "Blue")
 
 
 
 
# create frame and add a button and labels
frame = simplegui.create_frame("Memory", 800, 100)
frame.add_button("Restart", init)
label = frame.add_label("Moves = 0")
 
# initialize global variables
init()
 
# register event handlers
frame.set_mouseclick_handler(mouseclick)
frame.set_draw_handler(draw)
 
# get things rolling
frame.start()
 
 
# Always remember to review the grading rubric

Go to page: