#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
struct Domino {
int left, right;
bool played;
void ( * show) ( struct Domino* ) ;
void ( * flip) ( struct Domino* ) ;
bool ( * fits) ( struct Domino*, int ) ;
int ( * points) ( struct Domino* ) ;
} ;
void show( struct Domino* d) {
printf ( "[%d|%d] %s\n " , d
-> left
, d
-> right
, d-> left == d-> right ? "(дубль)" : "" ) ;
}
void flip( struct Domino* d) {
int t = d-> left;
d-> left = d-> right;
d-> right = t;
}
bool fits( struct Domino* d, int v) {
return d-> left == v || d-> right == v;
}
int points( struct Domino* d) {
return d-> left + d-> right;
}
struct Domino* make( int l, int r) {
struct Domino
* d
= malloc ( sizeof ( struct Domino
) ) ; d-> left = l;
d-> right = r;
d-> played = false ;
d-> show = show;
d-> flip = flip;
d-> fits = fits;
d-> points = points;
return d;
}
int main( ) {
printf ( "Демонстрация костей домино:\n \n " ) ;
struct Domino* set[ 5 ] ;
set[ 0 ] = make( 6 , 6 ) ;
set[ 1 ] = make( 2 , 4 ) ;
set[ 2 ] = make( 0 , 3 ) ;
set[ 3 ] = make( 5 , 5 ) ;
set[ 4 ] = make( 1 , 6 ) ;
for ( int i = 0 ; i < 5 ; i++ ) {
set[ i] -> show( set[ i] ) ;
}
printf ( "\n Действия с первой костью [6|6]:\n " ) ; printf ( "Очки: %d\n " , set
[ 0 ] -> points
( set
[ 0 ] ) ) ; printf ( "Подходит к 6: %s\n " , set
[ 0 ] -> fits
( set
[ 0 ] , 6 ) ? "да" : "нет" ) ; printf ( "Подходит к 2: %s\n " , set
[ 0 ] -> fits
( set
[ 0 ] , 2 ) ? "да" : "нет" ) ;
printf ( "\n Действия со второй костью [2|4]:\n " ) ; set[ 1 ] -> show( set[ 1 ] ) ;
set[ 1 ] -> flip( set[ 1 ] ) ;
set[ 1 ] -> show( set[ 1 ] ) ;
for ( int i
= 0 ; i
< 5 ; i
++ ) free ( set
[ i
] ) ; return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnN0cnVjdCBEb21pbm8gewogICAgaW50IGxlZnQsIHJpZ2h0OwogICAgYm9vbCBwbGF5ZWQ7CiAgICAKICAgIHZvaWQgKCpzaG93KShzdHJ1Y3QgRG9taW5vKik7CiAgICB2b2lkICgqZmxpcCkoc3RydWN0IERvbWlubyopOwogICAgYm9vbCAoKmZpdHMpKHN0cnVjdCBEb21pbm8qLCBpbnQpOwogICAgaW50ICgqcG9pbnRzKShzdHJ1Y3QgRG9taW5vKik7Cn07Cgp2b2lkIHNob3coc3RydWN0IERvbWlubyogZCkgewogICAgcHJpbnRmKCJbJWR8JWRdICVzXG4iLCBkLT5sZWZ0LCBkLT5yaWdodCwgCiAgICAgICAgICAgZC0+bGVmdCA9PSBkLT5yaWdodCA/ICIo0LTRg9Cx0LvRjCkiIDogIiIpOwp9Cgp2b2lkIGZsaXAoc3RydWN0IERvbWlubyogZCkgewogICAgaW50IHQgPSBkLT5sZWZ0OwogICAgZC0+bGVmdCA9IGQtPnJpZ2h0OwogICAgZC0+cmlnaHQgPSB0Owp9Cgpib29sIGZpdHMoc3RydWN0IERvbWlubyogZCwgaW50IHYpIHsKICAgIHJldHVybiBkLT5sZWZ0ID09IHYgfHwgZC0+cmlnaHQgPT0gdjsKfQoKaW50IHBvaW50cyhzdHJ1Y3QgRG9taW5vKiBkKSB7CiAgICByZXR1cm4gZC0+bGVmdCArIGQtPnJpZ2h0Owp9CgpzdHJ1Y3QgRG9taW5vKiBtYWtlKGludCBsLCBpbnQgcikgewogICAgc3RydWN0IERvbWlubyogZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IERvbWlubykpOwogICAgZC0+bGVmdCA9IGw7CiAgICBkLT5yaWdodCA9IHI7CiAgICBkLT5wbGF5ZWQgPSBmYWxzZTsKICAgIGQtPnNob3cgPSBzaG93OwogICAgZC0+ZmxpcCA9IGZsaXA7CiAgICBkLT5maXRzID0gZml0czsKICAgIGQtPnBvaW50cyA9IHBvaW50czsKICAgIHJldHVybiBkOwp9CgppbnQgbWFpbigpIHsKICAgIHByaW50Zigi0JTQtdC80L7QvdGB0YLRgNCw0YbQuNGPINC60L7RgdGC0LXQuSDQtNC+0LzQuNC90L46XG5cbiIpOwogICAgCiAgICBzdHJ1Y3QgRG9taW5vKiBzZXRbNV07CiAgICBzZXRbMF0gPSBtYWtlKDYsIDYpOwogICAgc2V0WzFdID0gbWFrZSgyLCA0KTsKICAgIHNldFsyXSA9IG1ha2UoMCwgMyk7CiAgICBzZXRbM10gPSBtYWtlKDUsIDUpOwogICAgc2V0WzRdID0gbWFrZSgxLCA2KTsKICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICAgIHByaW50ZigiJWQuICIsIGkrMSk7CiAgICAgICAgc2V0W2ldLT5zaG93KHNldFtpXSk7CiAgICB9CiAgICAKICAgIHByaW50ZigiXG7QlNC10LnRgdGC0LLQuNGPINGBINC/0LXRgNCy0L7QuSDQutC+0YHRgtGM0Y4gWzZ8Nl06XG4iKTsKICAgIHByaW50Zigi0J7Rh9C60Lg6ICVkXG4iLCBzZXRbMF0tPnBvaW50cyhzZXRbMF0pKTsKICAgIHByaW50Zigi0J/QvtC00YXQvtC00LjRgiDQuiA2OiAlc1xuIiwgc2V0WzBdLT5maXRzKHNldFswXSwgNikgPyAi0LTQsCIgOiAi0L3QtdGCIik7CiAgICBwcmludGYoItCf0L7QtNGF0L7QtNC40YIg0LogMjogJXNcbiIsIHNldFswXS0+Zml0cyhzZXRbMF0sIDIpID8gItC00LAiIDogItC90LXRgiIpOwogICAgCiAgICBwcmludGYoIlxu0JTQtdC50YHRgtCy0LjRjyDRgdC+INCy0YLQvtGA0L7QuSDQutC+0YHRgtGM0Y4gWzJ8NF06XG4iKTsKICAgIHNldFsxXS0+c2hvdyhzZXRbMV0pOwogICAgcHJpbnRmKCLQn9C+0LLQvtGA0LDRh9C40LLQsNC10LwuLi5cbiIpOwogICAgc2V0WzFdLT5mbGlwKHNldFsxXSk7CiAgICBzZXRbMV0tPnNob3coc2V0WzFdKTsKICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IDU7IGkrKykgZnJlZShzZXRbaV0pOwogICAgcmV0dXJuIDA7Cn0=