用swift重写stanford CS193P的纸牌游戏 (1)- Card 和Deck

本系列编号基本对应stanford CS193P的课程编号,可能有一两节课的误差:比如我标(1)就对应Lecture 1,但有时我做得快了就变成(1)对应lecture 1的全部和lecture 2的一部分。

前言:

我没学过OC,想学swift,可是网上只有教swift基本语法和写命令行程序的初级教程。

所以我只好拿个OC的教程,一边学swift,一边把OC的教程里的代码改成swift的,我想改完了之后应该就等于看了swift的教程了吧。

正文:

本文包括两个类,Card和Deck,以及一个单元测试类。写完之后的感觉:原来的教程教OC语法的部分看得我睡着了,而直接用swift写极简单。

具体值得记录的点有:

1.swift没有自动类型转换,只有类型推断,在arc4random % count 的时候无法自动转换类型。所以我加了个强制类型转换。

2.我debug测试类的时候发现xcode里显示不出我往deck.cards里插入的card,显示为invalid,但实际上是正确的。可能和我用的xcode6还是beta1有关。

3.drawRandomCard 的时候一开始我先做了remove,后做return,结果已经被remove掉的元素无法return。后加了个中间变量先暂存了一下要return的card。

4.感觉原来的OC语法比swift复杂很多。

5.感觉MVC部分CS193P的老头讲得挺好的。

代码:

首先是测试类:

 1 //
 2 //  CardGameTests.swift
 3 //  CardGameTests
 4 //
 5 //  Created by colin.zt on 14-6-6.
 6 //  Copyright (c) 2014年 Ting. All rights reserved.
 7 //
 8
 9 import XCTest
10
11 class CardGameTests: XCTestCase {
12
13     override func setUp() {
14         super.setUp()
15         // Put setup code here. This method is called before the invocation of each test method in the class.
16     }
17
18     override func tearDown() {
19         // Put teardown code here. This method is called after the invocation of each test method in the class.
20         super.tearDown()
21     }
22
23     func testCard() {
24         // This is an example of a functional test case.
25         // XCTAssert(true, "Pass")
26         var a: Card = Card()
27         var b: Card = Card()
28         a.contents = "test card a"
29         b.contents = "test card b"
30         var cards: Card[] = [a,b]
31         var result = a.match(cards)
32       //  println(a.contents)
33         XCTAssert(result == 1, "Pass")
34     }
35
36     func testDeck() {
37
38         var deck_a:Deck = Deck()
39
40         var card_a:Card = Card()
41         var card_b:Card = Card()
42         var card_c:Card = Card()
43
44         card_a.contents = "card a"
45         card_b.contents = "card b"
46         card_c.contents = "card c"
47
48         deck_a.addCard(card_a)
49         pirnt_all_cards_left(deck_a)
50         XCTAssert(deck_a.cards[0].contents == "card a", "Pass")
51
52         deck_a.addCard(card_b)
53         pirnt_all_cards_left(deck_a)
54         XCTAssert(deck_a.cards[0].contents == "card a", "Pass")
55         XCTAssert(deck_a.cards[1].contents == "card b", "Pass")
56
57         deck_a.addCard(card_c,atTop:true)
58         pirnt_all_cards_left(deck_a)
59         XCTAssert(deck_a.cards[0].contents == "card c", "Pass")
60         XCTAssert(deck_a.cards[1].contents == "card a", "Pass")
61         XCTAssert(deck_a.cards[2].contents == "card b", "Pass")
62
63         var random_card: Card = deck_a.drawRandomCard()
64         println("Now draw this random card:")
65         println(random_card.contents)
66         pirnt_all_cards_left(deck_a)
67         XCTAssert(random_card.match(deck_a.cards) == 0, "Pass")
68         XCTAssert(deck_a.cards.count == 2)
69
70         var random_card_2: Card = deck_a.drawRandomCard()
71         println("Now draw this random card_2:")
72         println(random_card_2.contents)
73         pirnt_all_cards_left(deck_a)
74         XCTAssert(random_card_2.match(deck_a.cards) == 0, "Pass")
75         XCTAssert(deck_a.cards.count == 1)
76     }
77
78     func pirnt_all_cards_left(deck:Deck){
79         println("_______________________________________")
80         println("Now these cards in deck")
81         for card in deck.cards{
82             println(card.contents)
83         }
84         println("_______________________________________")
85     }
86
87     func testPerformanceExample() {
88         // This is an example of a performance test case.
89         self.measureBlock() {
90             // Put the code you want to measure the time of here.
91         }
92     }
93
94 }

然后是Card类

 1 //
 2 //  Card.swift
 3 //  CardGame
 4 //
 5 //  Created by colin.zt on 14-10-18.
 6 //  Copyright (c) 2014年 Ting. All rights reserved.
 7 //
 8
 9 import UIKit
10
11 class Card: NSObject {
12
13     init(){}  //empty init method
14     var contents: String = "" //give it a default value
15     var chosen: Bool = false
16     var matched: Bool = false
17
18     //check if some card mathes some cards
19     func match(cards: Card[])->Int{
20         var score = 0
21         for card in cards{
22             if card.contents == self.contents
23             {
24                 score = 1
25             }
26         }
27         return score
28     }
29
30
31 }

最后是Deck类

 1 //
 2 //  Deck.swift
 3 //  CardGame
 4 //
 5 //  Created by colin.zt on 14-10-18.
 6 //  Copyright (c) 2014年 Ting. All rights reserved.
 7 //
 8
 9 import UIKit
10
11 class Deck: NSObject {
12
13     init(){} //init
14     var cards: Card[] = [] //a deck has an array of cards, empty by default
15
16     //add a card into this deck‘s cards array
17     func addCard(card: Card){
18         self.addCard(card,atTop:false)
19     }
20
21     //add a card into this decks‘s cards array‘s top, first element
22     func addCard(card:Card,atTop:Bool){
23         if atTop {
24             cards.insert(card, atIndex: 0)
25         }
26         else{
27             cards.append(card)
28         }
29     }
30
31     //draw a card from the deck randomly, it removes the card
32     func drawRandomCard()->Card{
33         var index = Int(arc4random()) % self.cards.count
34         var random_card:Card = cards[index]
35         cards.removeAtIndex(index)
36         return random_card
37     }
38 }
时间: 2024-10-24 23:11:24

用swift重写stanford CS193P的纸牌游戏 (1)- Card 和Deck的相关文章

用swift重写stanford CS193P的纸牌游戏 (2)- PlayingCard,PlayingDeck和ViewCotronller

本系列编号基本对应stanford CS193P的课程编号,可能有一两节课的误差:比如我标(1)就对应Lecture 1,但有时我做得快了就变成(1)对应lecture 1的全部和lecture 2的一部分. 正文: 本文包括三个类,PlayingCard和PlayingDeck,两个单元测试类,和两个单元测试的用到的工具类. 写完之后的感觉:只要写完view controller这个程序就能在iphone上有个用户界面可以点了,刚做出来的时候还是挺有成就感的.在看swift的电子书只看了一两章

hdu2209翻纸牌游戏(bfs+状态压缩)

Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作. Input 有多个case,每个case输入一行01符号串(长度不超过20),1表

HDU 2209 翻纸牌游戏(DFS)

题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作. Input 有多个case,每个case输入一行01符号串(长度不超过2

翻纸牌游戏(dfs回溯)

翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 2   Accepted Submission(s) : 2 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻

拉米纸牌游戏开发之路学习篇2

在篇1中的Deck类中表示一副纸牌采用的是Card数组的方法,该种方法灵活性较小,在纸牌游戏中经常会用到一组纸牌的操作,在此有必要创建纸牌集合类Cards 1.通过继承集合类实现 首先介绍System.Collection空间中的ArryList类吧,该类继承了IList接口,可以动态添加或者移去元素,很好用.对之前的代码只需略加修改.具体修改如下: (1)处,需要修改Deck类的字段 //private Card[] _Cards=new Card[52]; private ArrayList

HDU2209 ( 翻纸牌游戏 )

思路:枚举然后深搜,时间复杂度有点高. 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int a[25]; 7 char c[25]; 8 int flag; 9 int len; 10 int judge() 11 { 12 int i,j; 13 int cnt=0; 14 for

纸牌游戏之六 游戏概述

游戏规则概述: 进入纸牌游戏之后,会输入名称进入游戏: 二:游戏的主界面,五局制和七局制: 三:游戏完毕之后,出现游戏排行榜,使用SQLite保存到数据库

NYOJ 614 纸牌游戏

纸牌游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 设2n张牌分别标记为1,2,-,n,n+l,-,2n,初始时这2n张牌按其标号从小到大排列. 经一次洗牌后,原来的排列顺序变成n+l,l,n+2,2,··,,2n,n. 即前n张牌被放到偶数位置2,4,·,·,2n,而后n张牌被放到奇数位置1,3,-,2n-l. 可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态. 编程任务:对于给定的n的值(n<=24000),编程计算最少经过多少次洗牌可恢复到初

HDU 2209 翻纸牌游戏(dfs)

翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2180    Accepted Submission(s): 787 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张