# Make the game called Sets

Hello,

I’m trying to make the game sets This is the 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?

1 Like

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)

``````// 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.

2 Likes

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

see / open `>example`
)

-d-
now the Set class need a show
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

example
``````// 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
``````// 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

1 Like