Aplicatie Android Joc Mine Sweeper
Cuprins:
Sinteza lucrării
I. Introducere
II. Stadiul temei în bibliografie și realizări
III. Proiectare și implementare
III.1 Prezentare generală
III.2 Modul classic
III.2.1 Alegerea dificultății
III.2.2 Inițializare parametri
III.2.3 Definirea evenimentului de click și long-click
III.2.4 Plasarea bombelor pe suprafața de joc
III.2.5 Descoperirea suprafeței de joc
III.2.6 Descoperirea sprafețelor de joc adiacente suprafeței 0
III.2.7 Sfârșit joc – victorie
III.2.8 Sfârșit joc – joc pierdut
III.2.9 Indicii
III.3 Modul challenge
III.4 Modul versus
IV. Interfață și design
IV.1 Meniul principal
IV.1 Suprafața de joc
IV.1 Conectarea prin Bluetooth
V. Tehnologii folosite pentru realizarea proiectului
VI. Rezultate, realizări personale și concluzii
VII. Bibliografie
VIII. Anexe
Sinteza lucrării
I. Introducere
III. Proiectare și implementare
III.1 Prezentare generală
Scopul jocului Minesweeper este acela de a descoperi toată supratața de joc, fără a descoperi nici o bombă.
Jocul este pierdut atunci când se descoperă o bombă. Jocul este încheiat cu o victorie atunci când toate suprafețele adiacente bombelor sunt descoperite.
Suprafața de joc este afișată sub formă matriceală, de dimensiuni corespunzătoare dificultății alese. Fiecare buton de pe suprafața de joc este de tipul Suprafata (o clasă ce moștenește toate proprietățile și metodele clasei Button).
Inițializarea parametrilor, a suprafeței de joc și afișarea acesteia sunt prezentate în capitolele III.2.2 și III.2.3.
Butoanele ce formează suprafața de joc răspund la următoarele acțiuni: click și long-click, acțiuni explicate în capitolul III.2.3.
În momentul în care se dă click pe un buton de pe suprafața de joc, în funcție de conținutul acelui buton se pot descoperi următoarele:
– o suprafață minată – în acest caz jocul este pierdut
– o suprafață ce nu are adiacentă nici o bombă (suprafață 0) – în acest caz se execută algoritmul explicat în capitolul III.2.6
– o suprafață ce are în jurul ei 1-8 bombe – în acest caz se execută algoritmul explicat in capitolul III.2.5
La execuția acțiunii de long-click pe un buton se marchează/demarchează suprafața curentă
Proprietățile clasei Suprafata pot fi observate în figura III.1.1 și sunt următoarele:
teren_minat – poate avea valorile true/false (suprafața este/nu este minată)
teren_descoperit – poate avea valorile true/false (suprafața este/nu este descoperită)
teren_marcat – poate avea valorile true/false (suprafața este/nu este marcata ca fiind potențială suprafață minată)
nr_bombe – stochează numărul de bombe adiacente suprafeței curente
Clasa Suprafata cuprinde următoarele metode:
seteazaParametri() – setează parametrii la valorile de baza
planteazaBomba() – plantează bomba pe suprafața curentă (teren_minat = true)
esteMinat() – returnează valoarea din teren_minat
descoperaTeren() – marchează terenul ca fiind descoperit (teren_descoperit = true)
esteDescoperit() – returnează valoarea din teren_descoperit
marcheazăTeren() – marchează/demarchează suprafața ca fiind minată (teren_marcat = true)
esteMarcat() – returnează valoarea din teren_marcat
actualizareNeBombe()- incrementează valoarea din nr_bombe cu o unitate
numarBombe() – returnează valoarea din nr_bombe
marcheazaIndiciu() – marchează suprafața curentă, în urma activării unui indiciu
Dificultatea jocului diferă prin numărul de linii, numărul de coloane, numărul de bombe și numărul de indicii. În următorul tabel se pot observa parametrii corespunzători tipului de dificultate prezentat anterior.
Tabel III.1.1 – Parametrii jocului, în funcție de dificultate
Parametrii fiecărei dificultăți sunt stocați într-un vector având structura din figura III.1.2
Pe suprafața de joc se plasează bombele (numărul lor diferă în funcție de dificultate) pe coordonate alese în mod alteator. Algoritmul de plasare a bombelor este explicat în capitolul III.2.4 Plasarea bombelor pe suprafața de joc.
În cazul în care se dorește, se poate utiliza un indiciu pentru a se marca o suprafață ce nu este minată și ce nu a fost descoperită. ALGORITMUL BLA BLA
În următoarele trei subcapitole sunt explicate cele trei moduri de joc: classic (III.2 Modul CLASSIC), challenge (III.3 Modul CHALLENGE), versus (III.4 Modul VERSUS)
În capitolul INTERFATA FA APEL este descrisă interfața jocului.
III.2 Modul CLASSIC
Pentru a lansa jocul în modul ’classic’, din meniul principal se dă click pe butonul ’CLASSIC’. Selectăm dificultatea jocului, dintre următoarele: ușor, intermediar și greu.
În diagrama următoare sunt prezentați pașii parcurși pentru a lansa jocul în modul classic.
III.2.1 Alegerea dificultății
După acționarea butonului Classic din meniul aplicației, va fi afișată următoarea fereastră de dialog (figura III.2.1.1).
La alegerea unei dificultăți din cele trei se transmite indicele butonului acționat:
0 – ușor; 1 – intermediar; 2 – greu
În figura III.2.1.2 este prezentat codul Java, ce asigură afișarea ferestrei de dialog din figura III.2.1.1
Transmiterea indicelui dificultății alese are loc odată cu apelarea funcției startJocClassic(dificultate). Aceasta poate fi observată în figura de mai jos:
Funcția prezentată în figura III.2.1.3 execută următoarele instrucțiuni:
– inițializează un intent, căruia i se asociază clasa JocClassic
– transmite dificultatea ca parametru
– se lansează jocul în modul classic
În interiorul clasei JocClassic, dificultatea este preluată în modul următor:
III.2.2 Inițializare parametri
Parametrii clasei JocClassic sunt inițializați conform funcției prezentate în figura III.2.2.1 – Initializare parametri
a) în funcție de dificultatea aleasă, se inițializează numărul de linii, coloane, bombe și indicii
b) se alocă spațiu în memorie pentru matricea ce formează suprafața de joc
c) proprietățile clasei JocClassic sunt resetate la valorile de bază
d) se alege imaginea de fundal pentru Smiley (MAI MULTE DETALII BLA BLA)
III.2.3 Definirea evenimentului de click și long-click
În momentul în care se dă click pe un buton din suprafața de joc, se execută următorul algoritm:
a) se verifică dacă jocul este pierdut. Această testare are loc, deoarece în cazul în care jocul este pierdut, se mai pot descoperi suprafețe până când se câștigă jocul
b) se verifică dacă suprafața curentă este minată
– dacă este minată, jocul este pierdut (altfel, se trece la pasul c))
– se afișează mesajul ’Ai pierdut!’, în urma apelului funcției sfarsitJocPierdut()
– se afișează toate bombele de pe suprafața de joc și sunt evidențiate suprafețele marcate greșit (capitolul III.2.7)
c) se verifică dacă suprafața curentă nu a fost descoperită sau dacă nu este marcată
– suprafața trebuie demarcată înainte de a putea da click pe ea
– suprafața nu trebuie să fi fost descoperită, deoarece putem da click pe o
suprafață de mai multe ori, până când jocul este câștigat
d) dacă numărul de bombe adiacente suprafeței curente este 0
– se afișează cifra curentă (capitolul III.2.7)
– se apelează algoritmul de afișare a tuturor suprafețelor adiacente, în mod recursiv (capitolul III.2.6)
e) dacă numărul de bombe adiacente suprafeței curente este mai mare decât 0
– se afișează cifra curentă (capitolul III.2.7)
– se verifică dacă jocul a fost câștigat (capitolul III.2.8)
Acționarea unui buton prin long-click conduce la execuția următorului algoritm:
a) se verifică dacă suprafața curentă este nemarcată și nedescoperită
dacă, condiția este adevărată, se marchează suprafața cu ’!’
b) dacă suprafața este marcată, se demarchează
Nu se poate marca o suprafață ce a fost descoperită.
În figura III.2.3.4 este prezentat codul Java corespunzător definirii evenimentului discutat mai sus.
III.2.4 Plasarea bombelor pe suprafața de joc
În funcție de dificultatea jocului, numărul de bombe este calculat după următoarele formule:
ușor: nr_bombe = 10% din [nr_linii x nr_coloane] ( 70 * 0.1 = 7 bombe )
intermediar: nr_bombe = 15% din [nr_linii x nr_coloane] ( 117 * 0.15 = 18 bombe )
greu: nr_bombe = 20% din [nr_linii x nr_coloane] ( 176 * 0.2 = 35 bombe )
Pașii urmați pentru plasarea bombelor sunt:
1. Se aleg două numere (r și c) în mod aleator.
2. Dacă pe coordonata formată de (r,c) se află o bombă, ne întoarcem la pasul 1.
3. Plantăm bomba se suprafața curentă.
4. Pe o sprafața de 3×3 în jurul bombei, incrementăm numărul de bombe adiacente cu o unitate.
Cei patru parametri în funcție de care se face parcurgerea în jurul bombei sunt:
r_pornire și c_pornire – coordonata de unde începe parcurgerea
r_cautare și c_cautare – numărul de linii, respectiv coloane pe care se extinde căutarea
5. Se verifică dacă suprafața pe care a fost plasată bomba se află pe marginea suprafeței de joc și se modifică parametrii de la pasul 4 astfel:
dacă bomba se află pe prima linie:
– parcurgerea începe pe prima linie ( r_pornire = 0 )
– se parcurg primele două linii ( r_cautare = 2)
dacă bomba se află pe ultima linie:
– parcurgerea începe de pe penultima linie ( r_pornire = r-1 )
– se parcurg ultimele două linii ( r_cautare = 2 )
dacă bomba se află pe prima coloană:
– parcurgerea începe de pe prima coloană ( c_pornire = 0 )
– se parcurg primele două coloane ( c_cautare = 2 )
dacă bomba se află pe ultima coloană:
– parcurgerea începe de pe penultima coloană ( c_pornire = c-1 )
– se parcurg ultimele două coloane ( c_cautare = 2 )
6. În mod implicit, dacă bomba nu se află la marginea suprafeței de joc, parcurgerea este următoarea:
– parcurgerea începe de pe linia anterioară și coloana anterioară ( r_pornire = r-1, respectiv c_pornire = c-1 )
– parcurgerea are loc pe o suprafața de 3×3 ( r_cautare = 3, respectiv c_cautare = 3 )
În figura III.2.4.1 este prezentat codul Java pentru plasarea bombelor.
III.2.5 Descoperirea suprafeței de joc
Următorul set de instrucțiuni sunt executate după îndeplinirea condițiilor a, b, c din capitolul III.2.3 Definirea evenimentului de click și long-click
a) se marchează suprafața curentă ca fiind descoperită
teren_descoperit = true
b) dacă numărul de bombe adiacente suprafeței curente este mai mare decât 0:
– textul butonului este modificat în numărul de bombe adiacente
this.setText(”Numarul de bombe adiacente”)
– incrementăm numărul de suprafețe descoperite cu o unitate
nrDescoperite++
c) în funcție de numărul de bombe adiacente, se alege o imagine de fundal pentru buton (DE APELAT XML bla bla)
În următoarea figură (figura III.2.5.1) este prezentată verificarea doar pentru cazul în care numărul de bombe adiacente este 1 sau 2. Verificarea este efectuată pentru toate cazurile posibile ( 0 < numărul de bombe adiacente > 9)
III.2.6 Descoperirea suprafețelor de joc adiacente suprafeței 0
La activarea unei suprafețe în jurul căreia nu se află nici o bombă (nr_bombe = 0) se afișează toate suprafețele adiacente acesteia. Dacă în jurul acesteia se află o altă suprafață ce nu are nici o bombă adiacentă, funcția se reapelează în mod automat. Conform capitolului III.2.3, sunt verificați pașii a, b și c și în funcție de numărul de bombe adiacente este afișată valoarea din nr_bombe sau este apelată funcția afiseaza0() (funcție prezentată în figura III.2.6.1)
Pașii acestui algoritm sunt următorii:
a) se verifică dacă jocul este câștigat. Se elimină posibilitatea în care jocul este câștigat, dar nu sunt descoperite toate suprafețele în care valoarea din nr_bombe să fie egală cu 0. Dacă jocul este încheiat cu succes, dar se mai descoperă noi suprafețe, după fiecare suprafață descoperită se execută funcția prezentată în capitolul III.2.7, implicit se afișează pe ecran mesajul ’Ai câștigat!’ de mai multe ori.
b) folosind aceeași procedură de a parcurge suprafețele adiacente (capitolul III.2.4 Plasarea bombelor pe suprafața de joc), pe o suprafață de 3×3, se afișează toate suprafețele ce nu sunt minate.
În figura III.2.6.1 este prezentat codul Java pentru parcurgerea suprafețelor adiacente suprafeței 0. Pentru cei patru parametrii în funcție de care se face parcurgerea este afișată doar inițializarea. Ei sunt modificați în funcție de poziția suprafeței curente, la fel ca în cazul plantării bombelor din capitolul III.2.4
III.2.7 Sfârșit joc – victorie
După descoperirea fiecărei suprafețe cu nr_bombe > 0 se incrementează numărul de suprafețe descoperite (numarD) și se verifică dacă jocul este sfârșit. Jocul este câștigat dacă toate suprafețele adiacente bombelor au fost descoperite, implicit se verifică dacă numarD == numarDD
Numarul suprafețelor ce trebuiesc descoperite (numarDD) este calculat în modul următor:
– se parcurge toată suprafața de joc
– dacă suprafața de joc nu este minată
– dacă numărul de bombe adiacente suprafeței curente este mai mare decât 0
– se incrementează numarDD
! Se verifică dacă suprafața de joc este minată, deoarece în momentul în care plantăm o bombă, toate suprafețele din jur au valoarea din nr_bombe incrementată cu o unitate. Totuși, pe acea suprafață poate fi plantată o bombă și se ajunge la situația în care pe o suprafață există o bombă, dar nr_bombe este mai mare decât 0. Această suprafață nu trebuie luată în considerare atunci când calculăm numărul de suprafețe ce trebuiesc descoperite.
III.2.8 Sfârșit joc – joc pierdut
După descoperirea unei suprafețe minate, se execută următoarele instrucțiuni (prezentate în figura III.2.8.1)
Se parcurge toată suprafața de joc și se fac următoarele verificări:
a) dacă suprafața curentă nu este minată, dar este marcată
– se modifică textul acelui buton din ’!’ în ’X’
b) dacă suprafața curentă este minată și nu este marcată, se afișează bomba
Textul ultimului buton pe care a fost dat click, ce a cauzat pierderea jocului, este modificat din ’*’ în ’*’ (Bold).
III.2.9 Indicii
Utilizatorul poate opta pentru afișarea unui indiciu în cazul în care nu este decis de suprafața minată.
În momentul în care putem beneficia de un indiciu și este cerut unul, este executat următorul algoritm:
– are loc parcurgerea suprafaței de joc
– sunt salvate coordonatele suprafețelor ce îndeplinesc toate condițiile următoare:
– suprafața nu a fost descoperită
– suprafața nu este minată
– numărul de bombe adiacente este mai mare decât zero
– se alege în mod aleator o suprafață din cele salvate mai sus și se marchează indiciul
Suprafața marcată după utilizarea unui indiciu are imaginea de fundal conform fișierului suprafata_joc_indiciu.xml și poate fi vizualizată în capitolul APEL DESIGN
Nu se pot utiliza indicii dacă:
– jocul este sfârșit
– au fost utilizate toate indiciile.
III.3 Modul CHALLENGE
Modul challenge urmează aceiași pași în inițializare și implementare ca și modul classic, cu următoarele excepții:
– în cazul în care este descoperită o suprafață de joc și există bombe adiacente, nu mai este afișat numărul acestora
-imaginea de fundal pentru o suprafață descoperită este aleasă în mod aleator, conform algoritmului prezentat în figura III.3.3
Se execută următorii pași:
1. fiecarei imagine de fundal de tipul .xml îi este asociat un ID de tip integer. ID-ul fiecărui fișier este salvat într-un vector, conform figurii III.3.1
2. vectorul este amestecat conform funcției prezentate în figura III.3.2, iar în momentul în care se descoperă o suprafață, se alege imaginea de fundal precum este prezentat în figura III.3.3.
III.4 Modul VERSUS
Acest mod permite aplicației interacțiunea dintre două dispozitive, folosind tehnologia Bluetooth (APEL LA CAP BLA BLA). Rolul fiecărui jucător este bine definit, ei având rolul de a planta bombele, respectiv de a descoperi suprafața de joc.
Odată cu lansarea în execuție acestui mod, fiecare jucător trebuie să-și aleagă un rol din cele două menționate anterior.
Înainte de începerea jocului trebuie să aibă loc conectarea celor două dispozitive. Acest lucru este explicat din punct de vedere al implementării în capitolul III.4.1și III.4.2 și din punct de vedere al interfeței în capitolul APEL
III.4.1 Implementare jucător 1
În diagrama din figura III.4.1.1 sunt prezentați pașii urmați pentru a afișa suprafața de joc pentru jucătorul 1.
Figura III.4.1.1 – Lansarea modului versus
În comparație cu modul classic diferențiem următoarele caracteristici:
– în momentul lansării activității sunt inițializați doar parametrii și suprafața de joc
– este necesară conectarea prin Bluetooth la un alt dispozitiv APEL
– se așteaptă până când jucătorul 2 minează suprafața de joc
– jucătorul 2 trimite mesaj sub forma:
BOMB_RECEIVED_TOKEN + linie + coloană
– jucătorul 1 interpretează acest mesaj și plasează bomba pe suprafața de joc în același mod, prezentat în capitolul III.2.4.
– în momentul în care este primit mesajul BOMBS_PLANTED_START_GAME se afișează suprafața de joc, iar jocul poate începe. Din acest moment jocul continuă în același mod și sub aceleași reguli ca și în modul clasic.
III.4.2 Implementare jucător 2
În cazul jucătorului 2 sunt urmați aceiași pași pentru inițializare și afișare suprafață joc, cu o singură modificare:
– suprafața de joc este afișată imediat după conectare
Transmiterea coordonatelor suprafețelor minate se face în modul următor:
dacă nu au fost plasate toate bombele și dacă suprafața curentă nu este minată
se transmit coordonatele jucătorului 1
se marchează suprafața și este afișat un mesj corespunzător
dacă au fost trimite toate bombele
se va trimite un mesaj de confirmare, iar jucătorul 1 poate începe jocul
În figura III.4.2.1 poate fi observat codul Java, corespunzător evenimentului de click pe o suprafață în cazul jucătorului 2.
IV. Interfață și design
În cadrul mediului de dezvoltare Android Studio, prezentat în capitolul APEL, interfața unei activități este definită printr-un fișier .XML, în cadrul directorului layout și se inițializează în modul următor:
Fiecare element dintr-o activitate poate avea propriul său design, definit printr-un fișier .XML sau .PNG, dar în acest caz, resursele sunt salvate în directorul drawable. Se utilizează în modul următor:
În următoarele subcapitole sunt prezentate toate aspectele din cadrul proiectării interfeței, începând cu meniul principal, jocul în modul classic/challenge (împart aceeași interfață), jocul în modul versus (ambii jucători împart aceeași interfață), continuând cu, conectarea la un dispozitiv prin Bluetooth, regulile jocului, și nu în ultimul rând, imaginile folosite pentru smiley și butoanele de pe suprafața de joc.
IV.1 Meniul principal
Odată cu lansarea în execuție a aplicației suntem întampinați de meniul principal.
Structura fișierului .XML poate fi observată în ansamblu în figura IV.1.1. Codul complet al fișierului minesweeper.xml poate fi găsit la anexa APEL.
In următorul tabel pot fi observate elementele meniului:
Figura IV.1.1 – minesweeper.xml figura IV.1.2 – meniul principal
IV.2 Modul classic/challenge
Interfața asociată celor două moduri de joc este prezentată în figura IV.2.2.
Structura fișierului .XML poate fi observată în ansamblu în figura IV.2.1. Codul complet al fișierelor jocclassic.xml și jocchallenge.xml, poate fi găsit la anexa APEL.
In următorul tabel pot fi observate elementele modului de joc classic/challenge:
Butoanele ce formează suprafața de joc au interfața conform APEL
IV.3 Modul versus
În cadrul acestui mod, jucătorii împart aceeași interfață. Interfața este prezentată în figura IV.3.2.
Structura fișierului .XML poate fi observată în ansamblu în figura IV.3.1. Codul complet al fișierelor jocbluetooth1.xml și jocbluetooth2.xml, poate fi găsit la anexa APEL.
In următorul tabel pot fi observate elementele modului de joc versus
II. Tehnologii folosite pentru realizarea proiectului
II.1 Limbajul de programare Java
A fost conceput de către James Gosling, la Sun Microsystems (filială Oracle), la inceputul anilor ’90. Se bazează pe principiul „scrie o dată, rulează oriunde”.
Java este un limbaj de programare orientat pe obiect. Sintaxa limbajului este asemănătoare cu cea a C/C++, diferența fiind făcută de portabilitate.
Un program Java poate fi rulat pe orice platformă pe care este instalată o mașină virtuală Java. Acest nivel de portabilitate este posibil deoarece sursele Java sunt compilate într-un format standard numit cod de octeți, care este intermediar între codul mașină și codul sursă. Mașina virtuală Java este mediul în care se execută programele Java.
Dintre mediile de dezvolvare Java, menționăm: Eclipse, NetBeans, JCreator, BlueJ și IntelliJ IDEA (mediul de dezvoltare ce stă la baza platformei Android Studio).
Tehnologia Java poate fi clasificată sub următoarea formă:
a) Java Platform Micro Edition (Java ME) – pentru dispozitive cu resurse limitate
b) Java Platform Standard Edition (Java SE) – pentru PC-uri
c) Java Platform Enterprise Edition (Java EE) – pentru sisteme de calcul mari sau distribuite
II.2 Platforma Android Studio
Android Studio este mediul de dezvoltare oficial, pentru aplicațiile destinate sistemului de operare Android. A fost anunțat în anul 2013, înlocuind vechiul mediu de dezvoltare Eclipse Android Development Tools (ADT).
Poate fi rulat pe toate sistemele de operare principale, precum Windows, Linux și MAC.
Are la baza IntelliJ IDEA Java IDE și permite instalarea tuturor instrumentelor necesare dezvoltării de aplicații Android.
Sistemul de compilare este bazat pe tehnologia Gradle.
II.3 Tehnologia Bluetooth
Bluetooth este un set de specificații pentru o rețea personală fără fir, bazată pe unde radio. Tehnologia Bluetooth a fost creată în 1994.
’Bluetooth’ este o traducere în engleză a cuvântului scandinav ’Blåtand’, cum era supranumit regele viking Harald I al Danemarcei. El era renumir ca fiind foarte comunicativ și se pricepea să facă oamenii să comunice între ei.
Specificația Bluetooth a fost scrisă pentru prima dată de Sven Mattisson și Jaap Haartsen, la divizia de telefonie mobilă a companiei Ericsson.
Printr-o rețea Bluetooth se poate face schimb de informații între diverse aparate precum telefoane mobile, laptop-uri, imprimante, camere foto sau console video printr-o undă radio criptată și de rază mică.
Dispozitivele care dispun de Bluetooth comunică între ele atunci când se află în aceeași rază de acțiune. Ele folosesc un sistem de comunicații radio, așa că nu este nevoie să fie poziționate față în față pentru a transmite.
Istoric versiuni:
a) Bluetooth 1.0 și 1.0B – primele versiuni, dar cu multe probleme tehnice
b) Bluetooth 1.1
– suport pentru canalele necriptate
– indicator al puteri semnalului
c) Bluetooth 1.2
– viteza de transfer a fost mărită la 721 kb/s
d) Bluetooth 2.0
– viteză de transfer de 3.2 mb/s, datorită tehnologiei ’Enhanced Data Rate’
– consum de energie mai mic
– rata erorilor de transmisie mai scăzută
e) Bluetooth 3.0 și 4.0
– viteza de transfer de 24 mb/s, datorită introducerii unei legături 802.11
ANEXE
1. Meniu/background.jpg
2. Meniu principal JAVA
3. Meniu principal ICONS
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Android Joc Mine Sweeper (ID: 149408)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
