# Make the game called Sets

**URL:** https://discourse.processing.org/t/make-the-game-called-sets/7761
**Category:** Coding Questions
**Created:** [January 23, 2019, 12:03pm UTC](https://discourse.processing.org/t/make-the-game-called-sets/7761 "2019-01-23T12:03:31Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![henk\_peter](https://avatars.discourse-cdn.com/v4/letter/h/dc4da7/32.png) [@henk\_peter](https://discourse.processing.org/u/henk_peter)
#### Post date: [January 23, 2019, 12:03pm UTC](https://discourse.processing.org/t/make-the-game-called-sets/7761/1 "2019-01-23T12:03:32Z")

</div>

Hello,

I’m trying to make the game sets [This is the game](https://en.wikipedia.org/wiki/Set_(card_game))  
I have 27 cards, which are all diferent by one (or more) of each item:  
colors: red,blue,green  
Shape: triangle, square, circle  
Amout: 1,2,3  
I already made full menu, and the gui for the game screen, now i only need to make a array with the 27 cards and then shuffle them (have the function already made) and then print 9 of them on the screen, what is the best way to take 9 from the array (or class) and then correctly print each card and making them selectable.

Does anyone have a good method?

---

<div class="post-metadata">

### Author: ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)
#### Post date: [January 23, 2019, 2:21pm UTC](https://discourse.processing.org/t/make-the-game-called-sets/7761/2 "2019-01-23T14:21:50Z")

</div>

i want address first only the 2 points:  
-a-  
make a class with 3 int variables:  
make a array from it for all cards (27)  
-b-  
make a array of int long (9)  
contain **unique** numbers (0 … 27)

```auto
// https://discourse.processing.org/t/make-the-game-called-sets/7761
// https://en.wikipedia.org/wiki/Set_(card_game)
// good question: random N out of M ( no repeat )

int m = 27, n = 9;
int[] open = new int[n];
MySet[] sets = new MySet[m];

class MySet {
  int col;
  int shape;
  int num;
  int id;
  MySet(int col, int shape, int num, int id) {
    this.col = col;
    this.shape= shape;
    this.num = num;
    this.id = id;
  }
}

void setup_sets() {
  println("sets: "+sets.length);
  int c=0,s=0,n=0;
  for (int i=0; i < m; i++) {
    c=i%3; // 1+i%3;
    s=floor(i/3)%3;
    n=floor(i/9)%3; // +1
    sets[i] = new MySet(c,s,n,i);
  }
  for(MySet set : sets) println("id "+nf(set.id,2)+" col "+set.col+" shape "+set.shape+" num "+set.num);
}

void make_open() {
 // function to create a array ( of n ) with random numbers ( 0 .. m ) ( no repeat )
  IntList choice = new IntList();
  for ( int i = 0; i < m; i++ ) choice.append(i);
  choice.shuffle();
  for ( int i = 0; i < n; i++ ) open[i]=choice.get(i);
  println("i open "+n+" cards for you");
  println(open);
}

void setup() {
  setup_sets();
  make_open();
}

```

next should be a grid 9 to 1 || 3 to 3 for the open cards  
and a draw method for the class.

---

<div class="post-metadata">

### Author: ![Kevin](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kevin/32/2297_2.png) [@Kevin](https://discourse.processing.org/u/Kevin)
#### Post date: [January 23, 2019, 6:31pm UTC](https://discourse.processing.org/t/make-the-game-called-sets/7761/3 "2019-01-23T18:31:57Z")

</div>

If you post your question to multiple sites, please link between those posts so we know what help you’ve already received.

This question has been asked (and answered) here:

> <https://stackoverflow.com/questions/54315288/card-game-sets-in-processing>

---

<div class="post-metadata">

### Author: ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)
#### Post date: [January 24, 2019, 2:25am UTC](https://discourse.processing.org/t/make-the-game-called-sets/7761/4 "2019-01-24T02:25:36Z")

</div>

2 more step:

-c- for the canvas use a grid layout of ( 9 ) rectangles,  
with some changed numbers can make it  
9 by 1 | 1 by 9 | 3 by 3

as they have to be clicked it must be again a class  
( i use my own example from

> [@\[SOLVED\] Scalable grid with rectangles](https://discourse.processing.org/t/solved-scalable-grid-with-rectangles/7256/6):
>
> the math is still the same, if you draw a grid of rect OR setup your own array of rectangles from class
> 
> > **example**
> >
> > // https://discourse.processing.org/t/scalable-grid-with-rectangles/7256 int x = 20, y = x, w = 0, h = w; int grid = 8, many = grid\*grid; Myrect[] myrects= new Myrect[many]; void setup() { size(600, 400); // use x,y,grid as master and auto adjust rectangles (w,h) to window: w = ( width - 2 \* x ) / grid; h = ( height - 2 \* y ) / grid; for (int i = 0; i \< many; i++) m…

see / open `>example`  
)

-d-  
now the Set class need a show  
start with just printing the info  
card id, col , shape , num  
later use it to select 3 colors, 3 shapes, 3 counts

-e- inside the 9 rectangles must now call

> myrects[i].drawit(open[i]);

and inthere call:

> sets[index].show();

might look like

 ![2019-01-24_09-04-58_snap](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/8/81f6b944eff22076ee5f8ccde31d466442197b3f.png)

> **example**
>
> ```auto
> // https://discourse.processing.org/t/make-the-game-called-sets/7761
> // https://en.wikipedia.org/wiki/Set_(card_game)
> // good question: random N out of M ( no repeat )
> // v01 sets[27] with 3 int
> // open[9] unique numbers 0 .. 26
> // v02 selectable grid show
> 
> // sets vars
> int m = 27, n = 9;
> int[] open = new int[n];
> MySet[] sets = new MySet[m];
> // grid vars
> int x = 20, y = x, w = 0, h = w; // w,h auto fit to canvas
> int grid = 9, many = 9;//grid*grid; // many = n !
> MyRect[] myrects= new MyRect[many];
> 
> class MySet {
> int col;
> int shape;
> int num;
> int id;
> MySet(int col, int shape, int num, int id) {
> this.col = col;
> this.shape= shape;
> this.num = num;
> this.id = id;
> }
> void show(){
> fill(0,0,0); // info
> noStroke();
> text(id+": "+col+","+shape+","+num,10,20);
> int loop = 0, big =25;
> if ( col == 0 ) fill(200,0,0);
> if ( col == 1 ) fill(0,200,0);
> if ( col == 2 ) fill(0,0,200);
> if ( num == 0 ) loop = 1;
> if ( num == 1 ) loop = 2;
> if ( num == 2 ) loop = 3;
> if ( shape == 0 ) for ( int i = 0; i < loop; i++ ) ellipse(w/2,h/4+30*i+big/2,big,big);
> if ( shape == 1 ) for ( int i = 0; i < loop; i++ ) rect(w/2-big/2,h/4+30*i,big,big);
> if ( shape == 2 ) for ( int i = 0; i < loop; i++ ) triangle(w/2-big/2, h/4+30*i, w/2,h/4+30*i+big, w/2+big/2,h/4+30*i);
> }
> }
> 
> class MyRect {
> int x, y; //, w, h; from global
> boolean selected=false;
> MyRect (int x, int y) {
> this.x = x; 
> this.y = y;
> }
> void drawit(int index) {
> stroke(0, 0, 200);
> if ( selected ) fill(200, 0, 200);
> else fill(0, 200, 200);
> rect(x, y, w, h);
> // show cards in it
> push();
> translate(x,y);
> sets[index].show();
> pop();
> }
> boolean over() {
> return( x < mouseX && mouseX < x+w && y < mouseY && mouseY < y+h );
> }
> void sel() {
> if ( over() ) {
> if ( selected && mousePressed && mouseButton == RIGHT) selected=false;
> if ( !selected && mousePressed && mouseButton == LEFT) selected=true;
> }
> }
> }
> 
> void setup_grid() {
> // use x,y,grid as master and auto adjust rectangles (w,h) to window:
> w = ( width - 2 * x ) / grid;
> h = ( height - 2 * y ) ;// / grid;
> for (int i = 0; i < many; i++) myrects[i]=new MyRect(x+(i%grid)*w, y+(floor(i/grid))*h);
> println("use: mouse LEFT to select, mouse RIGHT to deselect");
> }
> 
> void draw_grid() {
> for (int i = 0; i < many; i++) {
> myrects[i].drawit(open[i]); // draw each rect with open cards
> myrects[i].sel(); // check if mousebutton and over this for color
> }
> }
> 
> void setup_sets() {
> println("sets: "+sets.length);
> int c=0, s=0, n=0;
> for (int i=0; i < m; i++) {
> c=i%3; // 1+i%3;
> s=floor(i/3)%3;
> n=floor(i/9)%3; // +1
> sets[i] = new MySet(c, s, n, i);
> }
> for (MySet set : sets) println("id "+nf(set.id, 2)+" col "+set.col+" shape "+set.shape+" num "+set.num);
> }
> 
> void make_open() {
> // function to create a array ( of n ) with random numbers ( 0 .. m ) ( no repeat )
> IntList choice = new IntList();
> for ( int i = 0; i < m; i++ ) choice.append(i);
> choice.shuffle();
> for ( int i = 0; i < n; i++ ) open[i]=choice.get(i);
> println("i open "+n+" cards for you");
> println(open);
> }
> 
> void setup() {
> size(800, 200);
> setup_grid();
> setup_sets();
> make_open();
> println("use: key [s] for reshuffle");
> }
> 
> void draw() {
> background(200, 200, 0);
> draw_grid();
> }
> 
> void keyPressed() {
> if ( key == 's' ) make_open(); // reshuffle
> }
> 
> ```

i have no intention to make a GAME out of it,  
( you say you have a game “framework” already )  
but anyhow can not think of further feature ( memory … )  
of the array sets, as the creation / and the draw job is so easy  
so i replace it just by a function

> sets\_show(int id)

pls find:

> **example v03**
>
> ```auto
> // https://discourse.processing.org/t/make-the-game-called-sets/7761
> // https://en.wikipedia.org/wiki/Set_(card_game)
> // v01 sets[27] with 3 int
> // open[9] unique numbers 0 .. 26
> // v02 selectable grid show
> // v03 obviously the sets array of MySet is a dummy as it can be created easy, is not changed and has no further job as MEMORY, make
> // sets_show(index);
> // deselect all at reshuffle
> 
> // sets vars
> int m = 27, n = 9;
> int[] open = new int[n];
> 
> // grid vars
> int x = 20, y = x, w = 0, h = w; // w,h auto fit to canvas
> int grid = n, many = grid * 1;//grid*grid; // many = n !
> MyRect[] myrects= new MyRect[many];
> 
> // v03
> void sets_show(int id) {
> int big =25, col, shape, num;
> // make the set
> col = id%3;
> shape = floor(id/3)%3;
> num = floor(id/9)%3;
> // make the show
> fill(0, 0, 0); // print info
> noStroke();
> text(id+": "+col+","+shape+","+num, 10, 20);
> if ( col == 0 ) fill(200, 0, 0);
> else if ( col == 1 ) fill(0, 200, 0);
> else if ( col == 2 ) fill(0, 0, 200);
> for ( int i = 0; i <= num; i++ ) {
> if ( shape == 0 ) ellipse(w/2, h/4+30*i+big/2, big, big);
> else if ( shape == 1 ) rect(w/2-big/2, h/4+30*i, big, big);
> else if ( shape == 2 ) triangle(w/2-big/2, h/4+30*i, w/2, h/4+30*i+big, w/2+big/2, h/4+30*i);
> }
> }
> 
> class MyRect {
> int x, y; //, w, h; from global
> boolean selected=false;
> MyRect (int x, int y) {
> this.x = x; 
> this.y = y;
> }
> void drawit(int index) {
> stroke(0, 0, 100);
> if ( selected ) fill(0, 200, 200);
> else fill(200, 200, 200);
> rect(x, y, w, h);
> push(); // show cards in it
> translate(x, y);
> sets_show(index); // index comes down from open[i] list
> pop();
> }
> boolean over() {
> return( x < mouseX && mouseX < x+w && y < mouseY && mouseY < y+h );
> }
> void sel() {
> if ( over() ) {
> if ( selected && mousePressed && mouseButton == RIGHT) selected=false;
> if ( !selected && mousePressed && mouseButton == LEFT) selected=true;
> }
> }
> void reset() {
> selected=false;
> }
> }
> 
> void setup_grid() { // use x,y,grid as master and auto adjust rectangles (w,h) to window:
> w = ( width - 2 * x ) / grid;
> h = ( height - 2 * y ) ;// / grid; // here only one row
> for (int i = 0; i < many; i++) myrects[i]=new MyRect(x+(i%grid)*w, y+(floor(i/grid))*h);
> }
> 
> void draw_grid() {
> for (int i = 0; i < many; i++) {
> myrects[i].drawit(open[i]); // draw each rect with open cards
> myrects[i].sel(); // check if mousebutton and over this for color
> }
> }
> 
> void make_open() { // function to create a array ( of n ) with random numbers ( 0 .. m ) ( no repeat )
> IntList choice = new IntList();
> for ( int i = 0; i < m; i++ ) choice.append(i);
> choice.shuffle();
> for ( int i = 0; i < n; i++ ) open[i]=choice.get(i); // just take first n of the shuffled list
> println("shuffle and i open the first "+n+" cards ( out of "+m+" ) for you:");
> for ( int i =0; i <n; i++) print(", "+open[i]);
> println(": good luck !");
> }
> 
> void setup() {
> size(800, 200);
> setup_grid();
> println("use: mouse LEFT to select, mouse RIGHT to deselect");
> println("use: key [s] for reshuffle");
> make_open();
> }
> 
> void draw() {
> background(200, 200, 0);
> draw_grid();
> }
> 
> void keyPressed() {
> if ( key == 's' ) { 
> make_open(); // reshuffle
> for (int i = 0; i < many; i++) myrects[i].reset(); // v03
> }
> }
> 
> ```

for test show all unshuffled

 ![2019-01-24_22-08-41_snap](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/6/63d2b9581c4cb84e995d2781cf5f4fe0025e58f6.png)
