Skip to content

Commit

Permalink
Նոր գրառումներ
Browse files Browse the repository at this point in the history
  • Loading branch information
armenbadal committed May 30, 2021
1 parent 81a1bf3 commit 9fc81e3
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 0 deletions.
81 changes: 81 additions & 0 deletions code/mines.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
class Cell: CustomStringConvertible {
enum State: Int {
case Closed // փակ
case Open // բաց
case Flagged // նշված
}

var state = State.Closed // վիճակ
var hasMine = false // ական
var minesAround = 0 // հարևան ականներ

// տեքստային ներկայացում
var description: String {
if self.state == .Closed {
return "?"
}

if self.state == .Flagged {
return "P"
}

if self.hasMine {
return "*"
}

return 0 == minesAround ? "." : String(minesAround)
}
}

class Field {
let rows: Int // տողերի քանակը
let columns: Int // սյուների քանակը
var cells: [[Cell]] // ականադաշտի մատրիցը
let minesCount: Int // ականների քանակը

init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns

// մատրիցի ստեղծելը
cells = (0..<rows).map { _ in (0..<columns).map { _ in Cell() } }

// ականների տեղադրելը
minesCount = rows * columns * 15 / 100
for _ in 0..<minesCount {
let r = Int.random(in: 0..<rows)
let c = Int.random(in: 0..<columns)
self.cells[r][c].hasMine = true
}

// հաշվել ամեն մի բջջի հարևան ականները
let rcix = [(-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)]
for r in 0..<self.rows {
for c in 0..<self.columns {
if self.cells[r][c].hasMine {
continue
}

var count = 0
for (dr, dc) in rcix {
let nr = r + dr
let nc = c + dc
if self.cells[nr][nc].hasMine {
count += 1
}
}
self.cells[r][c].minesAround = count
}
}
}


func show() {
for r in 0..<self.rows {
for c in 0..<self.columns {
print(self.cells[r][c], terminator: " ")
}
print("")
}
}
}
101 changes: 101 additions & 0 deletions my/swift.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,106 @@
# Խառը գրառումներ Swift-ի մասին

## Փորձեր «Սակրավոր» խաղի մոդելի համար

Ես ուզում եմ Swift-ով մոդելավորել հայտնի _Սակրավոր_ (_Minesweeper_) խաղի խաղադաշտը։ Ուրեմն, խաղադաշտը բաղկացած է բջիջներից, որոնք կարող են ական պարունակել կամ չպարունակել։ Խաղի ընթացքում բջիջը կարող է լինել երեք տարբեր վիճակներում. փակ (դեռ չբացված), բացված և դրոշակով նշված։ Բջջում պետք է պահել նաև նրա հարևան բջիջներում եղած ականների քանակը։

```Swift
class Cell {
enum State: Int {
case Closed // փակ
case Open // բաց
case Flagged // նշված
}

var state = State.Closed // վիճակ
var hasMine = false // ական
var minesAround = 0 // հարևան ականներ
}
```

Բջջի տեաստային ներկայացումը ստանալու համար `Cell` դասը պետք է ընդունի `CustomStringConvertible` համաձայնագիրը (protocol)։ Այդ համաձայնագիրը պարունակում է `description` հատկության նկարագրությունը, որն էլ պիտի իրականացնել `Cell` դասի համար։

```Swift
class Cell: CustomStringConvertible {
enum State: Int {
case Closed // փակ
case Open // բաց
case Flagged // նշված
}

var state = State.Closed // վիճակ
var hasMine = false // ական
var minesAround = 0 // հարևան ականներ

// տեքստային ներկայացում
var description: String {
if self.state == .Closed {
return "?"
}

if self.state == .Flagged {
return "F"
}

if self.hasMine {
return "*"
}

return 0 == minesAround ? "." : String(minesAround)
}
}
```

Խաղադաշտը բջիջների մատրից է՝ տրված քանակի տողերով ու սյուներով։ `Field` դասի արժեքավորիչի մեջ՝ `init` բլոկում, ստեղծում եմ `cells` (բջիջներ) մատրիցը։ Ինտերնետում քչփորելիս հանդիպեցի մատրիցը դինամիկ ստեղծելու մի հնարքի՝ `Range` օբյեկտի `map` գործողության օգնությամբ։ `map`-երից երկրորդը՝ ներդրվածը `Cell`-եր ստեղծելով կառուցում է մատրիցի տողը, իսկ արտաքինը՝ տողեր ստեղծելով կառուցում է մատրիցը։

Հետո պիտի դաշտում տեղադրեմ ականները։ Մտածեցի, որ ընդհանուր բջիջների 15-20 տոկոսում ական դնելը բավարար կլինի։ Ընտրում եմ պատահական բջիջներ ու դրանց `hasMine`-ը դարձնում եմ `true`: Դրանից հետո ամեն մի ական չունեցող բջջի համար հաշվում եմ դրա հարևան ականների քանակը ու պահում եմ բջջի `minesAround` հատկության մեջ։ `(r, c)` բջջի բոլոր ութ հարևաններին որոշելու համար պահել եմ տարբերությունների վեկտորը՝ `rcix`, որի ամեն մի տարրը զույգ է և որոշում է դիտարկվող բջջի և հարևանի դիրքերի տարբերությունը։

```Swift
class Field {
let rows: Int // տողերի քանակը
let columns: Int // սյուների քանակը
var cells: [[Cell]] // ականադաշտի մատրիցը
let minesCount: Int // ականների քանակը

init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns

// մատրիցի ստեղծելը
cells = (0..<rows).map { _ in (0..<columns).map { _ in Cell() } }

// ականների տեղադրելը
minesCount = rows * columns * 15 / 100
for _ in 0..<minesCount {
let r = Int.random(in: 0..<rows)
let c = Int.random(in: 0..<columns)
self.cells[r][c].hasMine = true
}

// հաշվել ամեն մի բջջի հարևան ականները
let rcix = [(-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)]
for r in 0..<self.rows {
for c in 0..<self.columns {
if self.cells[r][c].hasMine {
continue
}

var count = 0
for (dr, dc) in rcix {
let nr = r + dr
let nc = c + dc
if self.cells[nr][nc].hasMine {
count += 1
}
}
self.cells[r][c].minesAround = count
}
}
}
}
```


## Առաջին ծրագիրը

Լեզվի տարրական հնարավորությունների մասին մի քիչ կարդալուց հետո և մանր-մունր արտահայտությունների վրա ինչ-որ փորձարկումներ անելուց հետո որոշեցի գրել հաշվարկման _տասական_ համակարգում գրված ամբողջ թվի _տասնվեցական_ ներկայացումը վերադարձնող ֆունկցիան։
Expand Down

0 comments on commit 9fc81e3

Please sign in to comment.