Первенство видимо отдали за придумку аппаратной части, а не программной
Зачем? Для каждого игрока показывать только его экран.
Кем отдано? В этом весь вопрос. Часто такие “отдачи” случайны.
Вот, например, как Марк Твен описывает похожую случайность:
Потомками наверное
Лицом к лицу
Лица не увидать.
Большое видится на расстояньи.
Во-во! Так же как с Ньютоном.
В Википедии еще и не то можно найти.
А коды куда-нибудь выкладываешь? Гитхаб?
Нет. Скетч сам небольшой (его можно и тут опубликовать, хотя он не оптимизирован), много весит графика тем-картинок.
спойлер все стерпит, уж очень хочется тебя за какой нибудь millis поругать
пятница жеж!
Миллис нет, только делеи имеются.
Спойлер
//пятнашки
#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++;
}
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
Интересно, а файл картинок спойлер потянет?
Ну, так, тем более!!!
завести гитхаб
Я с него ушёл на позапрошлой неделе.
Попробовал перейти на импортозамещающий gitverse, но до того не понравилось. Вот, пока думаю, куда податься.
слушай, ну за форматирование, тебе сразу двойка.
Ничего с собой не могу сделать
В моей альтернативной реальности записи if(){} и
if(){
}
несут разные степени важности.
выгнали?
А что, разве оттуда выгоняют? Нет, сам ушёл.
Я никогда не ломлюсь туда, где мне не рады, зачем?
Они написали, что надо обязательно в какой-то срок перейти на двухэтапную аутентификацию. Ну, полез, там говорят, это можно сделать, если поставить приложение или по смс-коду. Приложений я без крайней нужды не ставлю никаких, давайте, говорю, по смс. Вывалилась форма номера телефона, а код страны надо выбирать из выпадающего списка. Список огромный, но России в нём нет. Ну, на нет и суда нет. Приложение ставить не хочу, по смс - не пущают. Ломиться обманками и подставными номерами, зачем? Так ли надо? Обойдусь.
Можно поставить опен-сорсный oauthtool на Линукс (наверно и для винды есть, не проверял). Он вполне заменяет приложение на смартфоне.
Gitee китайский с вашими предрассудками по поводу регистрации тоже не пойдет, там вообще без китайской симки ни один проект ни открыть