{
 "id": 37036,
 "slug": "2018-02-21_atualizar-o-snake-97",
 "url": "https://agents.willem.com/pt/posts/2018-02-21_atualizar-o-snake-97/",
 "source_url": "https://willem.com/pt/2018-02-21_atualizar-o-snake-97/",
 "language": "pt",
 "date": "2018-02-21",
 "published": "2018-02-21T00:00:00+01:00",
 "created": "2025-06-26T22:10:27.779000+02:00",
 "updated": "2026-10-20T09:20:31.699000+02:00",
 "title": "Atualizar o Snake '97",
 "subtitle": "Sobre os desafios de desenvolver um jogo imensamente popular",
 "summary": "Há uns anos, o meu irmão despejou uma cerveja em cima do meu iPhone num bar de Amesterdão. O coitado não gostou da cerveja holandesa tanto como eu: morreu. Enquanto esperava por um telemóvel novo, usei um velhinho que só sabia enviar mensagens, fazer chamadas e... Snake! Nasceu assim a ideia do Snake '97 e este mês chegou a hora de atualizar o jogo imensamente popular.",
 "topics": [
  "Windows",
  "android",
  "creating",
  "creativity",
  "design",
  "game",
  "iOS",
  "iPad",
  "iPhone",
  "programming",
  "retro",
  "server",
  "smartphone",
  "snake",
  "work"
 ],
 "author": {
  "name": "Willem L. Middelkoop",
  "url": "https://willem.com"
 },
 "provenance": {
  "kind": "model",
  "method": "Claude Sonnet, two passes (translation, then proofreading) against a glossary and hunspell (pt_PT)",
  "date": "2026-10-20",
  "reviewed_by_native_reader": false,
  "language": "pt",
  "source_language": "en"
 },
 "translations": [
  {
   "language": "en",
   "title": "Updating Snake '97",
   "url": "https://agents.willem.com/en/posts/2018-02-21_updating-snake-97/",
   "source_url": "https://willem.com/en/2018-02-21_updating-snake-97/"
  },
  {
   "language": "nl",
   "title": "Snake '97 Updaten",
   "url": "https://agents.willem.com/nl/posts/2018-02-21_snake-97-updaten/",
   "source_url": "https://willem.com/nl/2018-02-21_snake-97-updaten/"
  },
  {
   "language": "de",
   "title": "Snake '97 aktualisieren",
   "url": "https://agents.willem.com/de/posts/2018-02-21_snake-97-aktualisieren/",
   "source_url": "https://willem.com/de/2018-02-21_snake-97-aktualisieren/"
  },
  {
   "language": "es",
   "title": "Actualizando Snake '97",
   "url": "https://agents.willem.com/es/posts/2018-02-21_actualizando-snake-97/",
   "source_url": "https://willem.com/es/2018-02-21_actualizando-snake-97/"
  },
  {
   "language": "fr",
   "title": "Mettre à jour Snake '97",
   "url": "https://agents.willem.com/fr/posts/2018-02-21_mettre-a-jour-snake-97/",
   "source_url": "https://willem.com/fr/2018-02-21_mettre-a-jour-snake-97/"
  },
  {
   "language": "it",
   "title": "Aggiornare Snake '97",
   "url": "https://agents.willem.com/it/posts/2018-02-21_aggiornare-snake-97/",
   "source_url": "https://willem.com/it/2018-02-21_aggiornare-snake-97/"
  },
  {
   "language": "pap",
   "title": "Aktualisá Snake '97",
   "url": "https://agents.willem.com/pap/posts/2018-02-21_aktualisa-snake-97/",
   "source_url": "https://willem.com/pap/2018-02-21_aktualisa-snake-97/"
  },
  {
   "language": "fy",
   "title": "Snake '97 fernije",
   "url": "https://agents.willem.com/fy/posts/2018-02-21_snake-97-fernije/",
   "source_url": "https://willem.com/fy/2018-02-21_snake-97-fernije/"
  }
 ],
 "image": "https://willem.com/global/images/da5f22919df3.webp",
 "image_width": 2560,
 "images": [
  {
   "url": "https://willem.com/global/images/06e55a3e0198.webp",
   "description": "Café 't Pakhuis em Amesterdão, onde o Snake '97 foi \"inventado\"",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-1.jpg"
  },
  {
   "url": "https://willem.com/global/images/ee992b73bb44.webp",
   "description": "Snake '97 a correr num iPhone X, com o aspeto e a sensação do jogo retro de telemóvel dos anos 90",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-2.jpg"
  },
  {
   "url": "https://willem.com/global/images/13f8f2dd6fc1.webp",
   "description": "Snake '97 a arrasar nas tabelas, ao lado de Angry Birds e WhatsApp",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-3.jpg"
  },
  {
   "url": "https://willem.com/global/images/87b0ccd8c5d9.webp",
   "description": "iPhone 4, ahhh doces memórias de programador, do tempo em que um só tamanho (pequeno) servia para todos...",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-4.jpg"
  },
  {
   "url": "https://willem.com/global/images/3da50637eff4.webp",
   "description": "Protótipo do Snake '97 a correr em vários dispositivos",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-5.jpg"
  },
  {
   "url": "https://willem.com/global/images/8d20b82f1396.webp",
   "description": "A programar o novo motor de jogo e a testá-lo num HMD Nokia 2 com Android",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-6.jpg"
  },
  {
   "url": "https://willem.com/global/images/37052d0f8036.webp",
   "description": "O mesmo 3310? Olha com atenção e descobre as diferenças entre o iPhone SE e o iPhone X",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-7.jpg"
  },
  {
   "url": "https://willem.com/global/images/98f47b70cb4c.webp",
   "description": "Jogar em ecrã panorâmico já é possível graças aos novos gráficos adaptáveis",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-8.jpg"
  },
  {
   "url": "https://willem.com/global/images/6848b7ac140f.webp",
   "description": "Snake '97 a correr como app de ambiente de trabalho no macOS, graças aos novos gráficos escaláveis",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-9.jpg"
  },
  {
   "url": "https://willem.com/global/images/a5e27801afbd.webp",
   "description": "A analisar diferenças de velocidade do jogo com vídeo em câmara lenta",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-10.jpg"
  },
  {
   "url": "https://willem.com/global/images/6251dc574a72.webp",
   "description": "O código real do Snake '97 a calcular distâncias com o teorema de Pitágoras",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-11.jpg"
  },
  {
   "url": "https://willem.com/global/images/07b9c2f3b1a4.webp",
   "description": "Controlar o Snake com um gamepad da Super Nintendo é fantástico (com um conversor USB SuperSmart-joy)",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-12.jpg"
  },
  {
   "url": "https://willem.com/global/images/fa191d607fbb.webp",
   "description": "Um truque que o Snake original não conseguia: controlar o jogo com um comando DualShock da PlayStation por Bluetooth, com analógico",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-13.jpg"
  },
  {
   "url": "https://willem.com/global/images/12934c0ebe67.webp",
   "description": "Design de UX para um público internacional. Desenhar interfaces sem palavras é difícil!",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-14.jpg"
  },
  {
   "url": "https://willem.com/global/images/37c761847d86.webp",
   "description": "Campeão mundial do Snake '97, mas não por muito tempo...",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-15.jpg"
  },
  {
   "url": "https://willem.com/global/images/d31a2077c5a4.webp",
   "description": "É assim que se vê a nuvem, meninos e meninas. ",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-16.jpg"
  },
  {
   "url": "https://willem.com/global/images/5234dd3dd7ae.webp",
   "description": "Snake '97 disponível para transferência gratuita em iOS, Android, macOS, Windows e ChromeOS",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_37036_images-17.jpg"
  }
 ],
 "text": "Snake '97\nProgramei o jogo Snake originalmente em 2011, para iOS. Demorei cerca de duas semanas a criar um protótipo funcional que tinha o aspeto e a sensação do verdadeiro clássico dos anos 90. O meu outro irmão ajudou-me com os gráficos, ao tirar umas macros bem nítidas do meu telemóvel antigo (ainda é uma ideia estranha que tantos de vocês tenham uma cópia do meu telemóvel no bolso).\nFoi destacado por alguns blogues grandes (https://snake97.com/press/) que fizeram o Snake '97 dominar o topo das classificações por todo o mundo. Hoje joga-se em todo o mundo, está traduzido em 53 idiomas e disponível para iOS, Android, Windows, ChromeOS e macOS.\nEra preciso atualizar\nEm 2011 só havia um iPhone, o iPhone 4. Como programador, podias ignorar tranquilamente o Android e o Windows Phone ainda nem sequer tinha sido inventado. A vida era tão bela como um programador (preguiçoso) podia desejar: só um tamanho de ecrã.\nAvançando até hoje, a Apple vende atualmente 8 iPhones e há milhões e milhões de dispositivos Android por aí, todos com ecrãs, processadores, memória e versões de software diferentes. Dizer que isto é um desafio é pouco...\nPara manter a diversão no Snake '97, tive de atualizar o motor do jogo desde a raiz. De alguma forma, tinha de fazer os gráficos caberem em todos os ecrãs do mundo e compensar as diferenças de capacidade de processamento e de memória....\nUm motor de jogo para os governar a todos\nAs versões originais do jogo tinham todas o seu próprio motor. Um para iOS, um para Android, um para Windows, etc. Quando lancei o Snake 2k (a variante Snake II do jogo), limitei-me a juntar mais um conjunto de motores. No total, programei 6 motores de Snake diferentes em Objective-C (iOS), Java (Android) e C# (Windows). Manter estes motores a funcionar em dispositivos novos, com ecrãs, processadores e configurações de memória diferentes, tornou-se cada vez mais difícil.\nMas este mês arregacei as mangas a sério. Redesenhei e construí mais um motor de Snake. Só que este foi feito para substituir todos os anteriores. Tem de funcionar em iOS, Android e Windows. Queria um motor preparado para o futuro, para qualquer ecrã e qualquer tipo de entrada (teclado, toque, caneta, gamepad, joystick, o que quiseres).\nHTML5 é fantástico\nA web alcançou a tecnologia das apps nativas. Foram introduzidas muitas API novas que permitem experiências interativas ricas em muitos dispositivos diferentes. Perguntei-me quão difícil seria fazer o Snake '97 funcionar com tecnologia web. Só há uma maneira de descobrir, por isso comecei.\nGráficos adaptáveis\nComecei por construir o motor gráfico com base no canvas de HTML5 e num sistema de escala adaptável que tinha desenhado para a versão Android do Snake '97. Em essência, o motor mede o tamanho do ecrã disponível, a orientação e a densidade de píxeis. Traduz automaticamente o material fotográfico de alta resolução para se ajustar ao teu ecrã.\nO novo motor gráfico até compensa coisas esquisitas como o notch do iPhone X. Tudo isto acontece numa fração de segundo. Desenhei o novo motor gráfico para reagir também a mudanças no tamanho do ecrã. Agora é possível jogar na vertical ou na horizontal, numa janela ou em ecrã inteiro (ou em ecrã dividido, se estiveres num iPad).\nDiferenças de capacidade de processamento\nPensas que um jogo simples não tem de se preocupar com poder de computação? Enganas-te! Num jogo como o Snake, o tempo é essencial. As pessoas jogam com \"memória muscular\", a repetir os toques no ecrã tátil sem pensar em cada movimento.\nO motor do jogo tem de ser previsível, tem de correr de forma constante. Mas, acima de tudo, a experiência tem de ser a mesma, estejas num Android antigo ou num monstro de 6 núcleos como o iPhone X.\nUsei a câmara de vídeo de alta velocidade do iPad Pro para captar o jogo do Snake em câmara lenta. Com o vídeo consegui detetar diferenças de velocidade, fotograma a fotograma. Isto levou a um sistema interno de medição de desempenho (com temporizadores, a contar milissegundos) que ajusta automaticamente a velocidade do jogo, afinada com precisão para o teu dispositivo.\nControlos: toque, teclado, caneta, gamepad\nOs jogadores controlam o Snake com os controlos retro (o antigo teclado de telemóvel). A versão original do jogo para iOS usava UIButtons transparentes fixos que coloquei por cima das fotografias do telemóvel antigo. Um começo simples e eficaz.\nInfelizmente, os botões do iOS tinham alguma latência (o que causava atrasos imprevisíveis na resposta) e, claro, não se adaptavam a tamanhos de ecrã diferentes. Literalmente, tive de escrever à mão, no código, as coordenadas novas de cada iPhone novo que a Apple lançou nos últimos anos.... um trabalho nada divertido.\nO novo motor usa um truque que desenvolvi para a versão Android: botões virtuais posicionados dinamicamente. Com a informação de escala que o motor gráfico calcula, mantenho dinamicamente uma matriz de coordenadas X e Y correspondente aos botões virtuais. Quando o jogador toca no ecrã, o motor calcula o botão mais próximo com matemática, o teorema de Pitágoras.\nFunciona às mil maravilhas e transforma efetivamente o ecrã inteiro num botão. O jogo é muito mais divertido assim. Além do toque, acrescentei suporte para teclado, para que quem não tem ecrã tátil também possa jogar Snake.\nEnquanto trabalhava nos controlos, descobri mais uma pérola do HTML5, a API GamePad. Permite a programadores como eu suportar gamepads, joysticks e outros dispositivos de entrada ligados por USB ou Bluetooth.\nSuportar gamepads diferentes é um desafio, mas ainda assim divertido. Perdi de certeza um dia inteiro a \"testar\"... a aperfeiçoar as minhas capacidades com o formidável gamepad da SNES e o adorável analógico do comando DualShock. (\"Desculpa, querida, estou a trabalhar...\")\nInternacionalização\nSe estás a ler isto, provavelmente percebes inglês. Mas uma grande parte do público do Snake '97 não fala inglês. Na verdade, há jogadores em mais de 30 idiomas diferentes. Do espanhol ao russo, do árabe ao hebraico, do alemão ao japonês. Diz um, e o Snake tem-no.\nDesenhar uma interface que depende de texto é um desafio se queres servir o mundo inteiro. Os ícones também não são perfeitos (uma imagem pode ter significados diferentes). Como designer de UX, tens de pensar em conceitos usados em todo o lado. Para o Snake, usei ícones de um relógio, um velocímetro, um altifalante e um troféu. São ícones comuns em todo o mundo e foram escolhidos precisamente por isso.\nA descrição da app é um texto que mandei traduzir por um serviço profissional de tradução. Alguns outros editores recorrem ao Google Translate, mas eu sei que isso dá resultados péssimos.\nClassificação mundial\nNos anos 90, ganhavas boa reputação na rua se conseguisses uma boa pontuação no Snake. Nas versões originais do Snake '97 só tinhas a tua própria pontuação máxima para bater e, no iOS, podias enviar a pontuação para o GameCenter.\nPara a nova versão quis um alcance mais global e introduzi a \"classificação mundial\". É a nova tabela de classificação integrada, que classifica instantaneamente o teu jogo, comparando pontuações de pessoas de todo o mundo. Há três classificações: de sempre, das últimas 24 horas e da última hora.\nAs pontuações são processadas por um servidor Intel XEON de 48 núcleos, incrível, com uma quantidade enorme de memória. Corre Debian GNU/Linux, MariaDB, NGINX e NodeJS. Nas horas de ponta, processa mais de 10 pontuações por segundo. A configuração do servidor merece um artigo só para ela, que escreverei mais tarde, por isso fica atento a este blogue se gostas de big data.\nTransfere agora\nSó há uma maneira de descobrir se o meu trabalho valeu a pena: experimenta tu mesmo.\n- Android (https://play.google.com/store/apps/details?id=com.dsd164.snake97)\n- ChromeOS (https://play.google.com/store/apps/details?id=com.dsd164.snake97)\n- iOS (https://itunes.apple.com/us/app/snake-97-retro-phone-classic/id438052745?mt=8)\n- Mac (https://itunes.apple.com/app/snake-97-retro-phone-classic/id1349761776?mt=12)\n- Windows (https://www.microsoft.com/en-us/store/p/snake-97/9nblggh0ccmr)\n- Web (https://snake97.com)\nAvisa-me se encontrares algum erro, os meus contactos estão aqui (https://willem.com/).",
 "word_count": 1301,
 "markdown_url": "https://agents.willem.com/pt/posts/2018-02-21_atualizar-o-snake-97/post.md"
}