diff options
Diffstat (limited to 'doc/scriptexamples/tutorial/minesweeper2.kvs')
-rw-r--r-- | doc/scriptexamples/tutorial/minesweeper2.kvs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/doc/scriptexamples/tutorial/minesweeper2.kvs b/doc/scriptexamples/tutorial/minesweeper2.kvs new file mode 100644 index 00000000..16eb3172 --- /dev/null +++ b/doc/scriptexamples/tutorial/minesweeper2.kvs @@ -0,0 +1,93 @@ +# The scripts in this tutorial implement the famous minesweeper game +# STEP 2 + +class(minesweepermain,widget) +{ + constructor() + { + $$->$setCaption("KVIrc's Minesweeper (0.1.0)"); + + $$->%rows = 10 + $$->%cols = 10 + $$->%mines = 10 + + $$->%layout = $new(layout,$this) + + for(%i = 0;%i < $$->%rows;%i++) + { + for(%j = 0;%j < $$->%cols;%j++) + { + $$->%label{%i,%j}=$new(label,$this,"%i_%j") + $$->%label{%i,%j}->%row = %i + $$->%label{%i,%j}->%col = %j + $$->%layout->$addWidget($$->%label{%i,%j},%i,%j) + } + } + + $$->$newGame() + } + + newGame() + { + for(%i = 0;%i < $$->%rows;%i++) + { + for(%j = 0;%j < $$->%cols;%j++) + { + %l = $$->%label{%i,%j} + %l->$setFrameStyle(Raised,WinPanel); + %l->%bIsMine = 0 + %l->%numMines = 0 + %l->%bIsDiscovered = 0 + %l->$setText("") + } + } + # Here we drop the mines around: it is a bit complex problem: + # We want to have a fixed number of mines placed randomly in our grid + # + # So .. for each mine that we have to place... + for(%i = 0;%i < $$->%mines;%i++) + { + # Choose a random position for this mine + %row = $rand($($$->%rows - 1)) + %col = $rand($($$->%cols - 1)) + # Ensure that we're not placing this mine over an existing one + while($$->%label{%row,%col}->%bIsMine != 0) + { + # If there was already a mine, then choose the position again + %row = $rand($($$->%rows - 1)) + %col = $rand($($$->%cols - 1)) + } + # Ok.. this is a mine then + $$->%label{%row,%col}->%bIsMine = 1 + + # increase the mine count for the adiacent cells: this is again a bit complex thingie + if(%row > 0) + { + # There is a row over our mine: the cells above must have their mine count updated + # The cell just above us + $$->%label{$(%row - 1),%col}->%numMines++ + # The cell above on the left (if exists) + if(%col > 0)$$->%label{$(%row - 1),$(%col - 1)}->%numMines++ + # The cell above on the right (if exists) + if(%col < ($$->%cols - 1))$$->%label{$(%row - 1),$(%col + 1)}->%numMines++ + } + if(%row < ($$->%rows - 1)) + { + # There is a row below our mine: the cells below must have their mine count updated + # The cell just below us + $$->%label{$(%row + 1),%col}->%numMines++ + # The cell below on the left (if exists) + if(%col > 0)$$->%label{$(%row + 1),$(%col - 1)}->%numMines++ + # The cell below on the right (if exists) + if(%col < ($$->%cols - 1))$$->%label{$(%row + 1),$(%col + 1)}->%numMines++ + } + # Now the cell on the left side (if exists) + if(%col > 0)$$->%label{%row,$(%col - 1)}->%numMines++ + # And on the right side (if exists) + if(%col < ($$->%cols - 1))$$->%label{%row,$(%col + 1)}->%numMines++ + } + } +} + +%m = $new(minesweepermain) +%m->$show() |