Пятнашки электронные

Первенство видимо отдали за придумку аппаратной части, а не программной :slight_smile:

Зачем? Для каждого игрока показывать только его экран. :smiley:

Кем отдано? В этом весь вопрос. Часто такие “отдачи” случайны.

Вот, например, как Марк Твен описывает похожую случайность:

1 лайк

Потомками наверное :slight_smile:

Лицом к лицу
Лица не увидать.
Большое видится на расстояньи.

Во-во! Так же как с Ньютоном.

В Википедии еще и не то можно найти.

А коды куда-нибудь выкладываешь? Гитхаб?

Нет. Скетч сам небольшой (его можно и тут опубликовать, хотя он не оптимизирован), много весит графика тем-картинок.

спойлер все стерпит, уж очень хочется тебя за какой нибудь millis поругать :laughing:
пятница жеж!

Миллис нет, только делеи имеются.

Спойлер
//пятнашки
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>// Библиотека для работы с сенсорным экраном
#include <SPI.h>
#include "ris_.h"//файл хранения массивов фотокартинок
#define TFT_CS     17
#define TFT_DC     20
#define CS_PIN  14
//#define TFT_RST -1            // Пин подключения вывода RESET (ПРИ -1 СОЕДИНЯЕМ С +3,3В)
//#define TFT_MISO 16           // Пин подключения вывода дисплея SDO(MISO)
//#define TFT_MOSI 19           // Пин подключения вывода дисплея SDI(MOSI)
//#define TFT_CLK 18            // Пин подключения вывода дисплея SCK
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS,  TFT_DC);//
XPT2046_Touchscreen ts(CS_PIN);  // Param 2 - NULL - No interrupts

byte massiv_[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};//массив для хранения положения фишек и их отрисовки на экране
 int x, y;                         // Переменные для работы с координатами нажатий
 int tema=0;//
 byte FLAG=1;//
const struct { 
    const unsigned char *bitmap;
  }
 arhiv_tem[]={ris_0,ris_1,ris_2,ris_3,ris_4,ris_5,ris_6,ris_7,ris_8,ris_9,ris_10,ris_11};// 
 
void setup() {
  tft.begin();
  tft.setRotation(2);
 tft.fillScreen(tft.color565(0,0,0)); 

  ts.begin();
  ts.setRotation(2);
 drawFoto(0,0,zastavka_,240,320);// заставка игрушки 

  }
void loop() {
 // 
  if(ts.touched()) { // Если имеются данные с сенсорного модуля
 TS_Point p = ts.getPoint();                      // Считываем с него данные
    y = map(p.y,220,3720,0,319);                  // Считываем и преобразуем координату нажатия Y
    x =map(p.x,275,3830,0,240);                   // Считываем и преобразуем  координату нажатия X           
    if((x!=-1) && (y!=-1))          // Если обе координаты в положительном диапазоне (т.е. если есть нажатие) 
     {
      x += 0;                      // Корректируем координату с учетом калибровочных данных
      y += 0;                      // Корректируем координату с учетом калибровочных данных
  if(FLAG==1){FLAG=2;drawFoto(0,0,arhiv_tem[tema].bitmap,240,320);}//ЗАСТАВКА    
  else {if(FLAG==2||FLAG==3){  
   // блок исполнения функций в игре 
      knopki();  
      hod_(); 
     // otrisovka_();
   }
  }
   if(FLAG==5){FLAG=1;drawFoto(0,0,zastavka_,240,320);}//
   if(FLAG==4){FLAG=5;}//
     }
  delay(20);   
 }
// 

}
//
void drawFoto(uint16_t x,uint16_t y, const uint8_t *bitmap,uint16_t w,uint16_t h) {//функция вывода фотокартинки
if(x<0||x+w>240||y<0||y+h>320){return;} 
// tft.setAddrWindow(x,y,w,h);
 SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW);
  tft.setAddrWindow(x,y,w,h); 
 for(int j=0; j<h; j++) {
    for(int i=0; i<2*w; i=i+2) {
    SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);
    }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 //
}
//
//функция вывода фрагмента фотокартинки размером w*h,x,y - положение фрагмента на экране, x1,y1,w1,h1 - выбор фрагмента из массива
void drawFoto_fragment(int x,int y, const uint8_t *bitmap,int w,int h,int x1,int y1,int w1,int h1) {
if(x<0||x+w1>240||y<0||y+h1>320){return;} 
// tft.setAddrWindow(x,y,w1,h1);
 SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0));
  digitalWrite(TFT_DC, HIGH);
  digitalWrite(TFT_CS, LOW);
  tft.setAddrWindow(x,y,w1,h1); 
 for(int j=0; j<h; j++) {
    for(int i=0; i<2*w; i=i+2) {
      if(i>=2*x1&&i<2*(x1+w1)&&j>=y1&&j<y1+h1){
       SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);
      }  
   }
  }
  digitalWrite(TFT_CS, HIGH);
  SPI.endTransaction();
 //  
}
//
void otrisovka_(){
 for(int i=0;i<4;i++){ 
  for(int j=0;j<4;j++){
 int i1=(massiv_[i][j]-1)/4;int j1=(massiv_[i][j]-1)%4;   
//drawFoto_fragment(60*i,60*j,ris_0,240,320,60*i1,60*j1,60,60);//
  drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);// 
 }
 }
drawFoto_fragment(0,240,arhiv_tem[tema].bitmap,240,320,0,240,240,80);//отрисовка кнопок  
}
//
void hod_(){
 int pobeda=0;
 int i,j;int i1,j1;
 byte C; 
if(x<240&&y<240){
i=(x-0)/60;j=(y-0)/60;
if(i+1<4&&massiv_[i+1][j]==16){
C=massiv_[i][j];massiv_[i][j]=16;massiv_[i+1][j]=C;
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i+1][j]-1)/4; j1=(massiv_[i+1][j]-1)%4;drawFoto_fragment(60*(i+0.5),60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);delay(100);drawFoto_fragment(60*(i+1),60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
}
if(i-1>=0&&massiv_[i-1][j]==16){
C=massiv_[i][j];massiv_[i][j]=16;massiv_[i-1][j]=C;
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i-1][j]-1)/4; j1=(massiv_[i-1][j]-1)%4;drawFoto_fragment(60*(i-0.5),60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);delay(100);drawFoto_fragment(60*(i-1),60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
}
if(j+1<4&&massiv_[i][j+1]==16){
C=massiv_[i][j];massiv_[i][j]=16;massiv_[i][j+1]=C;
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j+1]-1)/4; j1=(massiv_[i][j+1]-1)%4;drawFoto_fragment(60*i,60*(j+0.5),arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);delay(100);drawFoto_fragment(60*i,60*(j+1),arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
}
if(j-1>=0&&massiv_[i][j-1]==16){
C=massiv_[i][j];massiv_[i][j]=16;massiv_[i][j-1]=C;
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j-1]-1)/4; j1=(massiv_[i][j-1]-1)%4;drawFoto_fragment(60*i,60*(j-0.5),arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);delay(100);drawFoto_fragment(60*i,60*(j-1),arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
i1=(massiv_[i][j]-1)/4; j1=(massiv_[i][j]-1)%4;drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);
}
//
for( int k=0;k<16;k++){//
 if(massiv_[k/4][k%4]==(k+1)){pobeda++;}
 }
 if(pobeda>15&&FLAG==3){FLAG=4;delay(1500);drawFoto(0,0,priz_,240,320);}//ПОБЕДА!
//  
  }  
}
//
void knopki(){
if(y>260){
if(x>0&&x<60){tema++;if(tema+1>sizeof(arhiv_tem)/sizeof(arhiv_tem[0])){tema=0;}otrisovka_();}//"тема"
if(x>60&&x<120){peremechka_();FLAG=3;}//"старт"
if(x>120&&x<180){for(int i=0;i<16;i++){massiv_[i/4][i%4]=i+1;}otrisovka_();FLAG=2;}//"сброс"
}
}
//
void peremechka_(){
  int k;int ran;int st=0;
int i;int j; int i1;int j1;int i2;int j2; int i3;int j3;  
 while(st<50){ 
 for( k=0;k<16;k++){//
 if(massiv_[k/4][k%4]==16){break;}
 }
//перемешивание элементов в массиве 
ran=random(0,4);
if(ran==0&&k%4<3){massiv_[k/4][k%4]=massiv_[(k+1)/4][(k+1)%4];massiv_[(k+1)/4][(k+1)%4]=16;   i2=(k+1)/4;j2=(k+1)%4;i3=(massiv_[(k+1)/4][(k+1)%4]-1)/4;j3=(massiv_[(k+1)/4][(k+1)%4]-1)%4;}
if(ran==1&&k%4>0){massiv_[k/4][k%4]=massiv_[(k-1)/4][(k-1)%4];massiv_[(k-1)/4][(k-1)%4]=16; i2=(k-1)/4;j2=(k-1)%4;i3=(massiv_[(k-1)/4][(k-1)%4]-1)/4;j3=(massiv_[(k-1)/4][(k-1)%4]-1)%4; }
if(ran==2&&k<12){massiv_[k/4][k%4]=massiv_[(k+4)/4][(k+4)%4];massiv_[(k+4)/4][(k+4)%4]=16;  i2=(k+4)/4;j2=(k+4)%4;i3=(massiv_[(k+4)/4][(k+4)%4]-1)/4;j3=(massiv_[(k+4)/4][(k+4)%4]-1)%4;}
if(ran==3&&k>3){massiv_[k/4][k%4]=massiv_[(k-4)/4][(k-4)%4];massiv_[(k-4)/4][(k-4)%4]=16;  i2=(k-4)/4;j2=(k-4)%4;i3=(massiv_[(k-4)/4][(k-4)%4]-1)/4;j3=(massiv_[(k-4)/4][(k-4)%4]-1)%4;}
if((ran==0&&k%4<3)||(ran==1&&k%4>0)||(ran==2&&k<12)||(ran==3&&k>3)){
i=k/4;j=k%4;i1=(massiv_[k/4][k%4]-1)/4;j1=(massiv_[k/4][k%4]-1)%4;
drawFoto_fragment(60*i,60*j,arhiv_tem[tema].bitmap,240,320,60*i1,60*j1,60,60);//
drawFoto_fragment(60*i2,60*j2,arhiv_tem[tema].bitmap,240,320,60*i3,60*j3,60,60);// 
delay(200);
 }
st++;   
}
}
/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

Интересно, а файл картинок спойлер потянет?

Ну, так, тем более!!! :slight_smile:

завести гитхаб

Я с него ушёл на позапрошлой неделе.

Попробовал перейти на импортозамещающий gitverse, но до того не понравилось. Вот, пока думаю, куда податься.

слушай, ну за форматирование, тебе сразу двойка.

Ничего с собой не могу сделать :slight_smile:
В моей альтернативной реальности записи if(){} и
if(){

}
несут разные степени важности.

выгнали?

А что, разве оттуда выгоняют? Нет, сам ушёл.

Я никогда не ломлюсь туда, где мне не рады, зачем?

Они написали, что надо обязательно в какой-то срок перейти на двухэтапную аутентификацию. Ну, полез, там говорят, это можно сделать, если поставить приложение или по смс-коду. Приложений я без крайней нужды не ставлю никаких, давайте, говорю, по смс. Вывалилась форма номера телефона, а код страны надо выбирать из выпадающего списка. Список огромный, но России в нём нет. Ну, на нет и суда нет. Приложение ставить не хочу, по смс - не пущают. Ломиться обманками и подставными номерами, зачем? Так ли надо? Обойдусь.

Можно поставить опен-сорсный oauthtool на Линукс (наверно и для винды есть, не проверял). Он вполне заменяет приложение на смартфоне.

Gitee китайский с вашими предрассудками по поводу регистрации :slight_smile: тоже не пойдет, там вообще без китайской симки ни один проект ни открыть :slight_smile: