From bdc8ab67059e774226de01d26cc102c7058bfd84 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Tue, 31 Mar 2015 14:09:00 -0400 Subject: [PATCH 01/11] Initial commit --- src/Card.java | 51 +++++++++++++++++++++++++++++++++++++- src/CardTest.java | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) mode change 100755 => 100644 src/Card.java create mode 100644 src/CardTest.java diff --git a/src/Card.java b/src/Card.java old mode 100755 new mode 100644 index 9eed9a5..49ad029 --- a/src/Card.java +++ b/src/Card.java @@ -1,5 +1,54 @@ public class Card { - // Create the rest of this class yourself + private int quantity; + private int color; + private int shading; + private int shape; + + public Card(int a, int b, int c, int d) { + quantity = fixValue(a); + color = fixValue(b); + shading = fixValue(c); + shape = fixValue(d); + } + + // fixes values outside the range + // by Professor Sommers + private int fixValue(int valueToFix) { + if (valueToFix < 1 || valueToFix > 3) + return (((valueToFix % 3) + 3) % 3) + 1; + else + return valueToFix; + } + + public int getQuantity() { + return quantity; + } + + public int getColor() { + return color; + } + + public int getShading() { + return shading; + } + + public int getShape() { + return shape; + } + + + public boolean isSet(Card card2, Card card3) { + return (quantity + card2.getQuantity() + card3.getQuantity()) % 3 == 0 || + (color + card2.getColor() + card3.getColor()) % 3 == 0 || + (shading + card2.getShading() + card3.getShading()) % 3 == 0 || + (shape + card2.getShape() + card3.getShape()) % 3 == 0; + } + + public String toString() { + String[][] array = {{"R", "G", "P"}, {"O", "T", "S"}, {"O", "D", "S"}}; + + return quantity + array[0][color - 1] + array[1][shading - 1] + array[2][shape - 1]; + } public boolean equals(Object obj) { Card that = (Card)obj; diff --git a/src/CardTest.java b/src/CardTest.java new file mode 100644 index 0000000..d9033ca --- /dev/null +++ b/src/CardTest.java @@ -0,0 +1,62 @@ +import junit.framework.TestCase; + +public class CardTest extends TestCase { + + public void testValues() { + Card c = new Card(1, 2, 3, 1); + + assertEquals(1, c.getQuantity()); + assertEquals(2, c.getColor()); + assertEquals(3, c.getShading()); + assertEquals(1, c.getShape()); + } + + public void testValuesOutOfRange() { + Card c = new Card(7, 9, -4, 0); + + assertEquals(2, c.getQuantity()); + assertEquals(1, c.getColor()); + assertEquals(3, c.getShading()); + assertEquals(1, c.getShape()); + } + + // 1 1 1 + public void testSameSet() { + Card c = new Card(1, 1, 3, 1); + Card c2 = new Card(1, 3, 1, 1); + Card c3 = new Card(2, 1, 3, 1); + + assertTrue(c.isSet(c2, c3)); + } + + // 1 2 3 + public void testRowSet() { + Card c = new Card(1, 1, 3, 3); + Card c2 = new Card(1, 2, 1, 1); + Card c3 = new Card(2, 3, 3, 1); + + assertTrue(c.isSet(c2, c3)); + } + + public void testNoSet() { + Card c = new Card(1, 1, 3, 3); + Card c2 = new Card(1, 2, 1, 1); + Card c3 = new Card(2, 1, 3, 1); + + assertFalse(c.isSet(c2, c3)); + } + + public void testString() { + Card c = new Card(1, 2, 3, 1); + + // Should be 1GSO + System.out.println(c); + } + + public void testEqual() { + Card c1 = new Card(1, 1, 1, 1); + Card c2 = new Card(1, 1, 1, 1); + + assertEquals(c1, c2); + } +} From cbd21a0d485cd61a476fd76168eddc16007d4d8d Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Tue, 31 Mar 2015 14:15:50 -0400 Subject: [PATCH 02/11] Added a test for toString --- src/CardTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CardTest.java b/src/CardTest.java index d9033ca..3c66680 100644 --- a/src/CardTest.java +++ b/src/CardTest.java @@ -50,6 +50,8 @@ public void testString() { Card c = new Card(1, 2, 3, 1); // Should be 1GSO + assertEquals("1GSO", c.toString()); + System.out.println(c); } From d8425566da04f1b3893f6ec6e5f6376d3b2c6f51 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Tue, 31 Mar 2015 14:21:51 -0400 Subject: [PATCH 03/11] Added test for toString() --- src/Deck.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/Deck.java diff --git a/src/Deck.java b/src/Deck.java old mode 100755 new mode 100644 From 33b7379db59271be7e83173ceac592b16a616d23 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Mon, 6 Apr 2015 12:33:05 -0400 Subject: [PATCH 04/11] Fixed a mistake from misunderstanding the rules. --- src/Card.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Card.java b/src/Card.java index 49ad029..546ff01 100644 --- a/src/Card.java +++ b/src/Card.java @@ -38,10 +38,11 @@ public int getShape() { public boolean isSet(Card card2, Card card3) { - return (quantity + card2.getQuantity() + card3.getQuantity()) % 3 == 0 || - (color + card2.getColor() + card3.getColor()) % 3 == 0 || - (shading + card2.getShading() + card3.getShading()) % 3 == 0 || + return (quantity + card2.getQuantity() + card3.getQuantity()) % 3 == 0 && + (color + card2.getColor() + card3.getColor()) % 3 == 0 && + (shading + card2.getShading() + card3.getShading()) % 3 == 0 && (shape + card2.getShape() + card3.getShape()) % 3 == 0; + } public String toString() { From 1c523d122a51191a4d02f257260655be454f96ee Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Tue, 7 Apr 2015 14:51:03 -0400 Subject: [PATCH 05/11] Completed Deck and DeckTest --- src/Deck.java | 45 ++++++++++++++++++++++++++++++++++++++++++++- src/DeckTest.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/DeckTest.java diff --git a/src/Deck.java b/src/Deck.java index ab3a2a3..33a7d2e 100644 --- a/src/Deck.java +++ b/src/Deck.java @@ -2,10 +2,37 @@ import java.io.FileReader; import java.util.StringTokenizer; import java.util.ArrayList; +import java.util.Collections; +// instance variables must be named cards and nextCardIndex +// for provided constructor to work. public class Deck { - // Implement the rest of this class yourself + public ArrayList cards; + private int nextCardIndex; + // Creates deck with 81 set cards shuffled + public Deck() { + cards = new ArrayList(81); +// while(hasNext()) { +// cards.add(getNext()); +// } + for(int a = 1; a < 4; a++) { + for(int b = 1; b < 4; b++) { + for(int c = 1; c < 4; c++) { + for(int d = 1; d < 4; d++) { + cards.add(new Card(a, b, c, d)); + } + } + } + } + nextCardIndex = 0; + Collections.shuffle(cards); + } + + // Crates deck from file named filename + // Does not shuffle the deck + // Usage in test code and later code + // Deck d = new Deck("example.dot"); public Deck(String filename) { cards = new ArrayList(81); @@ -42,4 +69,20 @@ public Deck(String filename) { throw new RuntimeException("Error while reading file: " + e.toString()); } } + + // Returns next card in deck if there is one or otherwise null + public boolean hasNext() { + return nextCardIndex >= 0 && nextCardIndex < cards.size(); + } + // You can call hasNext() within this method to see if you + // should return a card or return null + public Card getNext() { + if(!(hasNext())) { + return null; + } + else { + nextCardIndex += 1; + return cards.get(nextCardIndex - 1); + } + } } diff --git a/src/DeckTest.java b/src/DeckTest.java new file mode 100644 index 0000000..16bf58f --- /dev/null +++ b/src/DeckTest.java @@ -0,0 +1,46 @@ +import junit.framework.TestCase; + +public class DeckTest extends TestCase { + + public void test4cards() { + Deck d = new Deck("4cards.dat"); + assertEquals(4, d.cards.size()); +// System.out.println(d.cards); + } + + public void test0cards() { + Deck d = new Deck("0cards.dat"); + assertEquals(0, d.cards.size()); +// System.out.println(d.cards); + } + + public void testGenCards() { + Deck d = new Deck(); + assertEquals(81, d.cards.size()); +// System.out.println(d.cards); + + int quantity = 0; + int color = 0; + int shading = 0; + int shape = 0; + while(d.hasNext()) { + Card c = d.getNext(); + if(c.getQuantity() == 1) { + quantity++; + } + if(c.getColor() == 1) { + color++; + } + if(c.getShading() == 1) { + shading++; + } + if(c.getShape() == 1) { + shape++; + } + } + assertEquals(27, quantity); + assertEquals(27, color); + assertEquals(27, shading); + assertEquals(27, shape); + } +} From ad4ad2167e5ba10d1131a98c5e62ff162775f4b0 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Wed, 15 Apr 2015 06:01:34 -0400 Subject: [PATCH 06/11] Finished third part of SetProject --- src/Table.java | 0 src/TableNode.java | 0 src/TableNodeTest.java | 0 src/TableTest.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Table.java create mode 100644 src/TableNode.java create mode 100644 src/TableNodeTest.java create mode 100644 src/TableTest.java diff --git a/src/Table.java b/src/Table.java new file mode 100644 index 0000000..e69de29 diff --git a/src/TableNode.java b/src/TableNode.java new file mode 100644 index 0000000..e69de29 diff --git a/src/TableNodeTest.java b/src/TableNodeTest.java new file mode 100644 index 0000000..e69de29 diff --git a/src/TableTest.java b/src/TableTest.java new file mode 100644 index 0000000..e69de29 From c7803863f8359d03f08e713273e20ce427bdb78c Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Wed, 15 Apr 2015 06:07:09 -0400 Subject: [PATCH 07/11] Files are no longer empty --- src/Table.java | 218 +++++++++++++++++++++++++++++++++++++++++ src/TableNode.java | 21 ++++ src/TableNodeTest.java | 31 ++++++ src/TableTest.java | 107 ++++++++++++++++++++ 4 files changed, 377 insertions(+) diff --git a/src/Table.java b/src/Table.java index e69de29..6ad2258 100644 --- a/src/Table.java +++ b/src/Table.java @@ -0,0 +1,218 @@ +public class Table { + private TableNode head; + + public Table() { + head = null; + } + + public void add(Card card) { + TableNode newNode = new TableNode(card); + newNode.setNext(head); + head = newNode; + } + + public void removeSet(Card card1, Card card2, Card card3) { + + if(!(card1.isSet(card2, card3))) { + return; + } + + if(head == null) { + return; + } + + if(!(findMatch(card1) && findMatch(card2) && findMatch(card3))) { + return; + } + + removeCard(card1); + removeCard(card2); + removeCard(card3); + } + + //TableNode temp = head; +// System.out.println(numCards()); +// //int count = 0; +// //while(count < numCards() - 1 && head.getNext() != null) { +// +// while(head.getNext() != null) { +// +// int g = 0; +// TableNode node = head; +// while(node != null) { +// System.out.println(node.getCard()); +// g += 1; +// node = node.getNext(); +// +// } +// System.out.println("t"); +// +// while(head.getNext().getCard() == card1 || +// head.getNext().getCard() == card2 || +// head.getNext().getCard() == card3) { +// System.out.println("test"); +// if(head.getNext().getNext() != null) { +// head.setNext(head.getNext().getNext()); +// } +// else { +// break; +// } +// } +// head = head.getNext(); +// //count += 1; +// //System.out.println(count); +// } +// System.out.println(numCards()); +// int e = 0; +// TableNode d = head; +// while(d != null) { +// System.out.println(d.getCard()); +// e += 1; +// d = d.getNext(); +// +// } +// } +// TableNode temp = head; +// System.out.println(numCards()); +// int count = 0; +// while(count < numCards() || head != null) { +// System.out.println("test"); +// while(temp.getCard() == card1 || +// temp.getCard() == card2 || +// temp.getCard() == card3) { +// System.out.println(temp); +// System.out.println(temp.getNext()); +// temp = temp.getNext(); +// } +////head.setNext(temp.getNext()); +// head = temp.getNext(); +// count += 1; +// } +// } + + + +// TableNode node = head; +// +// System.out.println(numCards()); +// while(node != null && node.getNext() != node) { +// if(node.getNext().getCard() == card1 || +// node.getNext().getCard() == card2 || +// node.getNext().getCard() == card3) { +// node.setNext(node.getNext().getNext()); +// } +// else { +// node.setNext(node.getNext()); +// } +// node = node.getNext(); +// } +// System.out.println(numCards()); + + //TableNode prev = findPrev(card1); + //TableNode curr = prev.getNext(); + + // System.out.println("end of removeSet"); +// +// // notes from lab +// //printer void removeCard(Card c) +// { +// //remove(a/d(c1); +// //... +// //node prev = findPrev(c1) +// //node curr = prevgetNext() +// //if(prev==null) //head remove +// // head = head.getNext() +// //else // middle of tail remove +// //if(!onTable(c1)) { +// // return; +// //Node curr prev.getNext(); +// //prev.setNext()(curr.getNext()). + //getCard + +// //prev.setNext(curr.getNext()); +// } +//// if(node != null) { +//// node.setNext(node.getNext()); +//// } +// } + + + public void removeCard(Card card) { + TableNode prev = null; + TableNode curr = head; + if(head.getCard() == card) { + head = head.getNext(); + } + while(curr.getCard() != card || curr.getNext() != null) { + prev = curr; + if(curr.getNext() != null) { + curr = curr.getNext(); + } + else { + break; + } + } + prev.setNext(curr.getNext()); + } + + + // Check if card is in table + public boolean findMatch(Card card) { + for(int i = 0; i < numCards(); i++) { + if(getCard(i) == card) { + System.out.println("Match found"); + return true; + } + } + System.out.println("Match not found"); + return false; + } + + public Card findPrev(Card card) { + for(int i = 0; i < numCards(); i++) { + if(getCard(i) == card) { + return getCard(i - 1); + } + } + return null; + } + + public int numCards() { + int count = 0; + TableNode node = head; + while(node != null) { + count += 1; + node = node.getNext(); + } + return count; + } + + public Card getCard(int index) { + TableNode loc = head; + if(index < numCards() && index >= 0) { + for(int i = 0; i < index; i++) { + loc = loc.getNext(); + } + return loc.getCard(); + } + else { + return null; + } + } + + // 1 and 2 prevent repeats + public int numSets() { + int numSets = 0; + for(int a = 0; a < numCards() - 2; a++) { + for(int b = 1; b < numCards() - 1; b++) { + for(int c = 2; c < numCards(); c++) + if(getCard(a).isSet(getCard(b), getCard(c)) && + a < b && b < c) { + numSets++; + } + } + } + return numSets; + } + +} diff --git a/src/TableNode.java b/src/TableNode.java index e69de29..acee059 100644 --- a/src/TableNode.java +++ b/src/TableNode.java @@ -0,0 +1,21 @@ +public class TableNode { + private Card card; + private TableNode next; + + public TableNode(Card a) { + card = a; + next = null; + } + + public TableNode getNext() { + return next; + } + + public void setNext(TableNode newNext) { + next = newNext; + } + + public Card getCard() { + return card; + } +} diff --git a/src/TableNodeTest.java b/src/TableNodeTest.java index e69de29..4fbede8 100644 --- a/src/TableNodeTest.java +++ b/src/TableNodeTest.java @@ -0,0 +1,31 @@ +import junit.framework.TestCase; + +/** + * A JUnit test case class. + * Every method starting with the word "test" will be called when running + * the test with JUnit. + */ +public class TableNodeTest extends TestCase { + + /** + * A test method. + * (Replace "X" with a name describing the test. You may write as + * many "testSomething" methods in this class as you wish, and each + * one will be called when running JUnit over this class.) + */ + + public void testSingleNode() { + TableNode node = new TableNode(null); + assertEquals(null, node.getNext()); + assertEquals(null, node.getCard()); + } + + public void testTwoNodes() { + TableNode node = new TableNode(null); + Card card = new Card(3, 1, 1, 2); + TableNode node2 = new TableNode(card); + node.setNext(node2); + assertEquals(node2, node.getNext()); + assertEquals(card, node2.getCard()); + } +} \ No newline at end of file diff --git a/src/TableTest.java b/src/TableTest.java index e69de29..c48918c 100644 --- a/src/TableTest.java +++ b/src/TableTest.java @@ -0,0 +1,107 @@ +import junit.framework.TestCase; + +/** + * A JUnit test case class. + * Every method starting with the word "test" will be called when running + * the test with JUnit. + */ +public class TableTest extends TestCase { + + /** + * A test method. + * (Replace "X" with a name describing the test. You may write as + * many "testSomething" methods in this class as you wish, and each + * one will be called when running JUnit over this class.) + */ + + public void testEmptyTable() { + Table table = new Table(); + assertEquals(0, table.numCards()); + assertEquals(null, table.getCard(0)); + } + + public void testSingleNode() { + Table table = new Table(); + Card card = new Card(2, 1, 1, 3); + table.add(card); + assertEquals(1, table.numCards()); + assertEquals(card, table.getCard(0)); + assertTrue(table.findMatch(card)); + } + + public void testMultipleNodes() { + Table table = new Table(); + Card card1 = new Card(2, 1, 1, 3); + Card card2 = new Card(1, 3, 1, 2); + Card card3 = new Card(2, 1, 3, 3); + // Card 4 is not added to the table + Card card4 = new Card(2, 1, 2, 3); + table.add(card1); + table.add(card2); + table.add(card3); + assertEquals(3, table.numCards()); + assertEquals(card3, table.getCard(0)); + assertTrue(table.findMatch(card3)); + assertFalse(table.findMatch(card4)); + } + + public void testRemoveSet() { + Table table = new Table(); + Card card1 = new Card(2, 1, 1, 3); + Card card2 = new Card(1, 3, 2, 2); + Card card3 = new Card(3, 2, 3, 1); + Card card4 = new Card(2, 2, 1, 3); + Card card5 = new Card(1, 1, 3, 3); + // Card 6 is not added to the table + Card card6 = new Card(2, 1, 2, 3); + table.add(card1); + table.add(card2); + table.add(card3); + table.add(card4); + table.add(card5); + //assertEquals(card4, table.findPrev(card3)); + table.removeSet(card1, card2, card3); + assertEquals(2, table.numCards()); + } + + // Card starting at beginning of list + public void testRemoveSet2() { + Table table = new Table(); + Card card1 = new Card(1, 3, 2, 2); + Card card2 = new Card(3, 2, 3, 1); + Card card3 = new Card(2, 2, 1, 3); + Card card4 = new Card(1, 1, 3, 3); + Card card5 = new Card(2, 1, 1, 3); + // Card 6 is not added to the table + Card card6 = new Card(2, 1, 2, 3); + table.add(card1); + table.add(card2); + table.add(card3); + table.add(card4); + table.add(card5); + //assertEquals(card4, table.findPrev(card3)); + table.removeSet(card1, card2, card5); + assertEquals(2, table.numCards()); + } + + // Assuming sets are not removed + public void testnumSets() { + Table table = new Table(); + Card card1 = new Card(1, 1, 1, 1); + Card card2 = new Card(2, 2, 2, 2); + Card card3 = new Card(3, 3, 3, 3); + Card card4 = new Card(1, 2, 3, 1); + Card card5 = new Card(2, 3, 1, 2); + Card card6 = new Card(3, 1, 2, 3); + + table.add(card1); + table.add(card2); + table.add(card3); + table.add(card4); + table.add(card5); + table.add(card6); + + assertEquals(2, table.numSets()); + + } +} \ No newline at end of file From 3c9e9fcf9fdc5d103293b8092cc6fda2ab9085d1 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Thu, 16 Apr 2015 17:09:35 -0400 Subject: [PATCH 08/11] Fix for matching cards from different objects --- src/Table.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Table.java b/src/Table.java index 6ad2258..39c1222 100644 --- a/src/Table.java +++ b/src/Table.java @@ -159,7 +159,7 @@ public void removeCard(Card card) { // Check if card is in table public boolean findMatch(Card card) { for(int i = 0; i < numCards(); i++) { - if(getCard(i) == card) { + if(getCard(i).equals(card)) { System.out.println("Match found"); return true; } From d5425dac15bda53d1f41d520a51fbbc88bdce4d5 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Thu, 23 Apr 2015 15:17:47 -0400 Subject: [PATCH 09/11] Added Game, GameTest, and fixed bugs with Table --- src/CardTest.java | 6 +- src/Deck.java | 2 +- src/DeckTest.java | 1 + src/Game.java | 90 ++++++++++++++++++++++++++ src/GameTest.java | 106 +++++++++++++++++++++++++++++++ src/Table.java | 157 +++++++++------------------------------------- 6 files changed, 229 insertions(+), 133 deletions(-) create mode 100644 src/Game.java create mode 100644 src/GameTest.java diff --git a/src/CardTest.java b/src/CardTest.java index 3c66680..c77e9a5 100644 --- a/src/CardTest.java +++ b/src/CardTest.java @@ -22,7 +22,7 @@ public void testValuesOutOfRange() { // 1 1 1 public void testSameSet() { - Card c = new Card(1, 1, 3, 1); + Card c = new Card(3, 2, 2, 1); Card c2 = new Card(1, 3, 1, 1); Card c3 = new Card(2, 1, 3, 1); @@ -31,8 +31,8 @@ public void testSameSet() { // 1 2 3 public void testRowSet() { - Card c = new Card(1, 1, 3, 3); - Card c2 = new Card(1, 2, 1, 1); + Card c = new Card(3, 1, 2, 3); + Card c2 = new Card(1, 2, 1, 2); Card c3 = new Card(2, 3, 3, 1); assertTrue(c.isSet(c2, c3)); diff --git a/src/Deck.java b/src/Deck.java index 33a7d2e..5af2546 100644 --- a/src/Deck.java +++ b/src/Deck.java @@ -7,7 +7,7 @@ // instance variables must be named cards and nextCardIndex // for provided constructor to work. public class Deck { - public ArrayList cards; + private ArrayList cards; private int nextCardIndex; // Creates deck with 81 set cards shuffled diff --git a/src/DeckTest.java b/src/DeckTest.java index 16bf58f..50e731a 100644 --- a/src/DeckTest.java +++ b/src/DeckTest.java @@ -9,6 +9,7 @@ public void test4cards() { } public void test0cards() { + //System.out.println(System.getProperty("user.dir")); Deck d = new Deck("0cards.dat"); assertEquals(0, d.cards.size()); // System.out.println(d.cards); diff --git a/src/Game.java b/src/Game.java new file mode 100644 index 0000000..1455085 --- /dev/null +++ b/src/Game.java @@ -0,0 +1,90 @@ +public class Game { + Table t; + Deck d; + + Game() { + t = new Table(); + d = new Deck(); + for(int i = 0; i < 12; i++) { + if(d.hasNext()) { + t.add(d.getNext()); + } + else { + break; + } + } + } + + Game(String deck) { + t = new Table(); + d = new Deck(deck); + for(int i = 0; i < 12; i++) { + if(d.hasNext()) { + t.add(d.getNext()); + } + else { + break; + } + } + } + + public int numSets() { + return t.numSets(); + } + + public int numCards() { + return t.numCards(); + } + + public void playRound() { + if(numSets() == 0 && d.hasNext()) { + //System.out.println("t0"); + if(d.hasNext()) { + t.add(d.getNext()); + } + if(d.hasNext()) { + t.add(d.getNext()); + } + if(d.hasNext()) { + t.add(d.getNext()); + } + return; + } + + if(d.hasNext() && numCards() == 12 && numSets() > 0) { + //remove one set and add 3 cards + t.findSet(); + if(d.hasNext()) { + //System.out.println("t1"); + t.add(d.getNext()); + } + if(d.hasNext()) { + //System.out.println("t2"); + t.add(d.getNext()); + } + if(d.hasNext()) { + //System.out.println("t3"); + t.add(d.getNext()); + } + return; + } + + if(numCards() > 12 && numSets() > 0) { + //System.out.println("t4"); + //remove one set but don't add 3 cards + t.findSet(); + return; + } + + if(numSets() > 0 && d.hasNext() == false) { + //System.out.println("t5"); + //remove one set + t.findSet(); + return; + } + } + + public boolean isGameOver() { + return d.hasNext() == false && numSets() == 0; + } +} \ No newline at end of file diff --git a/src/GameTest.java b/src/GameTest.java new file mode 100644 index 0000000..afd192b --- /dev/null +++ b/src/GameTest.java @@ -0,0 +1,106 @@ +import junit.framework.TestCase; + +/** + * A JUnit test case class. + * Every method starting with the word "test" will be called when running + * the test with JUnit. + */ +public class GameTest extends TestCase { + + /** + * A test method. + * (Replace "X" with a name describing the test. You may write as + * many "testSomething" methods in this class as you wish, and each + * one will be called when running JUnit over this class.) + */ + public void testGameMethods() { + Game g = new Game("4cards.dat"); + assertEquals(4, g.numCards()); + assertEquals(0, g.numSets()); + + Game g2 = new Game("16cards.dat"); + assertEquals(12, g2.numCards()); + assertEquals(4, g2.numSets()); + + Game g3 = new Game("0cards.dat"); + assertEquals(0, g3.numCards()); + assertEquals(0, g3.numSets()); + + Game g4 = new Game(); + assertEquals(12, g4.numCards()); + + Game g5 = new Game("12cards0setsMileStone.dat"); + assertEquals(12, g5.numCards()); + assertEquals(0, g5.numSets()); + } + + public void testOneRound() { + Game g = new Game("4cards.dat"); + g.playRound(); + assertTrue(g.isGameOver()); + + Game g2 = new Game("0cards.dat"); + g2.playRound(); + assertTrue(g2.isGameOver()); + + Game g3 = new Game("16cards.dat"); + g3.playRound(); + assertFalse(g3.isGameOver()); + + Game g4 = new Game(); + g4.playRound(); + assertFalse(g4.isGameOver()); + + // This test only passes with a modified file that adds 3 extra cards + Game g5 = new Game("12cards0setsMileStone.dat"); + g5.playRound(); + assertEquals(15, g5.numCards()); + + } + + public void testAllRounds() { + Game g = new Game("4cards.dat"); + g.playRound(); + assertTrue(g.isGameOver()); + while(!(g.isGameOver())) { + g.playRound(); + } + assertTrue(g.isGameOver()); + + Game g2 = new Game("0cards.dat"); + g2.playRound(); + assertTrue(g2.isGameOver()); + while(!(g2.isGameOver())) { + g2.playRound(); + } + assertTrue(g2.isGameOver()); + + Game g3 = new Game("16cards.dat"); + g3.playRound(); + assertFalse(g3.isGameOver()); + while(!(g3.isGameOver())) { + g3.playRound(); + } + assertTrue(g3.isGameOver()); + + + Game g4 = new Game(); + while(!(g4.isGameOver())) { + g4.playRound(); + } + assertTrue(g4.isGameOver()); + + Game g5 = new Game("12cards0setsMilestone.dat"); + while(!(g5.isGameOver())) { + g5.playRound(); + } + assertTrue(g4.isGameOver()); + + Game g6 = new Game("12cards14setsMilestone.dat"); + while(!(g6.isGameOver())) { + g6.playRound(); + } + assertTrue(g6.isGameOver()); + + } +} diff --git a/src/Table.java b/src/Table.java index 39c1222..d31bec0 100644 --- a/src/Table.java +++ b/src/Table.java @@ -11,160 +11,47 @@ public void add(Card card) { head = newNode; } - public void removeSet(Card card1, Card card2, Card card3) { - + public void removeSet(Card card1, Card card2, Card card3) { if(!(card1.isSet(card2, card3))) { return; } - if(head == null) { return; } - if(!(findMatch(card1) && findMatch(card2) && findMatch(card3))) { return; } - removeCard(card1); removeCard(card2); removeCard(card3); } - //TableNode temp = head; -// System.out.println(numCards()); -// //int count = 0; -// //while(count < numCards() - 1 && head.getNext() != null) { -// -// while(head.getNext() != null) { -// -// int g = 0; -// TableNode node = head; -// while(node != null) { -// System.out.println(node.getCard()); -// g += 1; -// node = node.getNext(); -// -// } -// System.out.println("t"); -// -// while(head.getNext().getCard() == card1 || -// head.getNext().getCard() == card2 || -// head.getNext().getCard() == card3) { -// System.out.println("test"); -// if(head.getNext().getNext() != null) { -// head.setNext(head.getNext().getNext()); -// } -// else { -// break; -// } -// } -// head = head.getNext(); -// //count += 1; -// //System.out.println(count); -// } -// System.out.println(numCards()); -// int e = 0; -// TableNode d = head; -// while(d != null) { -// System.out.println(d.getCard()); -// e += 1; -// d = d.getNext(); -// -// } -// } -// TableNode temp = head; -// System.out.println(numCards()); -// int count = 0; -// while(count < numCards() || head != null) { -// System.out.println("test"); -// while(temp.getCard() == card1 || -// temp.getCard() == card2 || -// temp.getCard() == card3) { -// System.out.println(temp); -// System.out.println(temp.getNext()); -// temp = temp.getNext(); -// } -////head.setNext(temp.getNext()); -// head = temp.getNext(); -// count += 1; -// } -// } - - - -// TableNode node = head; -// -// System.out.println(numCards()); -// while(node != null && node.getNext() != node) { -// if(node.getNext().getCard() == card1 || -// node.getNext().getCard() == card2 || -// node.getNext().getCard() == card3) { -// node.setNext(node.getNext().getNext()); -// } -// else { -// node.setNext(node.getNext()); -// } -// node = node.getNext(); -// } -// System.out.println(numCards()); - - //TableNode prev = findPrev(card1); - //TableNode curr = prev.getNext(); - - // System.out.println("end of removeSet"); -// -// // notes from lab -// //printer void removeCard(Card c) -// { -// //remove(a/d(c1); -// //... -// //node prev = findPrev(c1) -// //node curr = prevgetNext() -// //if(prev==null) //head remove -// // head = head.getNext() -// //else // middle of tail remove -// //if(!onTable(c1)) { -// // return; -// //Node curr prev.getNext(); -// //prev.setNext()(curr.getNext()). - //getCard - -// //prev.setNext(curr.getNext()); -// } -//// if(node != null) { -//// node.setNext(node.getNext()); -//// } -// } - - public void removeCard(Card card) { TableNode prev = null; TableNode curr = head; - if(head.getCard() == card) { + if(head.getCard().equals(card)) { head = head.getNext(); + return; } - while(curr.getCard() != card || curr.getNext() != null) { - prev = curr; - if(curr.getNext() != null) { - curr = curr.getNext(); - } - else { - break; + while(curr != null) { + if(curr.getCard().equals(card)) { + prev.setNext(curr.getNext()); + return; } + prev = curr; + curr = curr.getNext(); } - prev.setNext(curr.getNext()); } - // Check if card is in table public boolean findMatch(Card card) { for(int i = 0; i < numCards(); i++) { if(getCard(i).equals(card)) { - System.out.println("Match found"); + //System.out.println("Match found"); return true; } } - System.out.println("Match not found"); + //System.out.println("Match not found"); return false; } @@ -204,15 +91,27 @@ public Card getCard(int index) { public int numSets() { int numSets = 0; for(int a = 0; a < numCards() - 2; a++) { - for(int b = 1; b < numCards() - 1; b++) { - for(int c = 2; c < numCards(); c++) - if(getCard(a).isSet(getCard(b), getCard(c)) && - a < b && b < c) { - numSets++; + for(int b = a + 1; b < numCards() - 1; b++) { + for(int c = b + 1; c < numCards(); c++) { + if(getCard(a).isSet(getCard(b), getCard(c))) { + numSets++; + } } } } return numSets; } + public void findSet() { + for(int a = 0; a < numCards() - 2; a++) { + for(int b = a + 1; b < numCards() - 1; b++) { + for(int c = b + 1; c < numCards(); c++) { + if(getCard(a).isSet(getCard(b), getCard(c))) { + removeSet(getCard(a), getCard(b), getCard(c)); + return; + } + } + } + } + } } From f14e2663125224d9da119d45fe0e608f3a0fe552 Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Fri, 24 Apr 2015 10:56:35 -0400 Subject: [PATCH 10/11] Fixed code for specs --- src/Game.java | 25 +++++++++++++++++++------ src/Table.java | 13 ------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Game.java b/src/Game.java index 1455085..6390312 100644 --- a/src/Game.java +++ b/src/Game.java @@ -53,7 +53,7 @@ public void playRound() { if(d.hasNext() && numCards() == 12 && numSets() > 0) { //remove one set and add 3 cards - t.findSet(); + findSet(); if(d.hasNext()) { //System.out.println("t1"); t.add(d.getNext()); @@ -72,15 +72,28 @@ public void playRound() { if(numCards() > 12 && numSets() > 0) { //System.out.println("t4"); //remove one set but don't add 3 cards - t.findSet(); + findSet(); return; } if(numSets() > 0 && d.hasNext() == false) { - //System.out.println("t5"); - //remove one set - t.findSet(); - return; + //System.out.println("t5"); + //remove one set + findSet(); + return; + } + } + + private void findSet() { + for(int a = 0; a < t.numCards() - 2; a++) { + for(int b = a + 1; b < t.numCards() - 1; b++) { + for(int c = b + 1; c < t.numCards(); c++) { + if(t.getCard(a).isSet(t.getCard(b), t.getCard(c))) { + t.removeSet(t.getCard(a), t.getCard(b), t.getCard(c)); + return; + } + } + } } } diff --git a/src/Table.java b/src/Table.java index d31bec0..fb205d6 100644 --- a/src/Table.java +++ b/src/Table.java @@ -101,17 +101,4 @@ public int numSets() { } return numSets; } - - public void findSet() { - for(int a = 0; a < numCards() - 2; a++) { - for(int b = a + 1; b < numCards() - 1; b++) { - for(int c = b + 1; c < numCards(); c++) { - if(getCard(a).isSet(getCard(b), getCard(c))) { - removeSet(getCard(a), getCard(b), getCard(c)); - return; - } - } - } - } - } } From 6a53727f42e75cb606279f338a51aae5a922a73e Mon Sep 17 00:00:00 2001 From: Ryan Romano Date: Tue, 28 Apr 2015 15:13:50 -0400 Subject: [PATCH 11/11] Added monte carlo simulation and writeup --- src/MonteCarloSimulation.java | 31 ++++++++++++++++++++++++ src/SetProject.pdf | Bin 0 -> 66596 bytes src/records.rtf | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/MonteCarloSimulation.java create mode 100644 src/SetProject.pdf create mode 100644 src/records.rtf diff --git a/src/MonteCarloSimulation.java b/src/MonteCarloSimulation.java new file mode 100644 index 0000000..5bd3ea1 --- /dev/null +++ b/src/MonteCarloSimulation.java @@ -0,0 +1,31 @@ +public class MonteCarloSimulation { + + public static void main(String[] args) { + int games = 0; + double totalSets = 0; + double totalCards = 0; + double avgNumSets = 0; + double avgNumCards = 0; + + for(int i = 0; i < 10000; i++) { + Game game = new Game(); + games += 1; + + // What is the average number of sets in a random collection of 12 cards from the deck? + totalSets += game.numSets(); + avgNumSets = totalSets / games; + + + while(!(game.isGameOver())) { + game.playRound(); + } + + //What is the average number of cards left at the end of the game? + totalCards += game.numCards(); + avgNumCards = totalCards / games; + } + + System.out.println(avgNumSets); + System.out.println(avgNumCards); + } +} \ No newline at end of file diff --git a/src/SetProject.pdf b/src/SetProject.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9c77140fd835f4d232f9f416ea38d0eb844a079 GIT binary patch literal 66596 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
(hCC6qxr2O10acW@xIFQd01C%eNlecdY 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 literal 0 HcmV?d00001 diff --git a/src/records.rtf b/src/records.rtf new file mode 100644 index 0000000..e388a7f --- /dev/null +++ b/src/records.rtf @@ -0,0 +1,44 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 ArialMT;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\margl1440\margr1440\vieww16560\viewh19580\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural + +\f0\fs24 \cf0 10,000x\ +2.7873\ +2.7883\ +2.7981\ +2.8012\ +2.7876\ +avg 2.7925\ +\ +10,000x\ +7.7022\ +7.7022\ +7.6791\ +7.6866\ +7.6848\ +avg 7.69098\ +\ +\ +100k\ +2.78221\ +2.77845\ +2.7921\ +2.78785\ +2.78283\ +avg +\f1\fs30 \cf2 \expnd0\expndtw0\kerning0 +\outl0\strokewidth0 \strokec2 2.784688 +\f0\fs24 \cf0 \kerning1\expnd0\expndtw0 \outl0\strokewidth0 \ +\ +\ +100k\ +7.68045\ +7.69215\ +7.6851\ +7.69092\ +7.69068\ +avg +\f1\fs30 \cf2 \expnd0\expndtw0\kerning0 +\outl0\strokewidth0 \strokec2 7.68786} \ No newline at end of file