diff options
Diffstat (limited to 'doc/scriptexamples/tutorial/minesweeper5.kvs')
-rw-r--r-- | doc/scriptexamples/tutorial/minesweeper5.kvs | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/doc/scriptexamples/tutorial/minesweeper5.kvs b/doc/scriptexamples/tutorial/minesweeper5.kvs new file mode 100644 index 00000000..1bda6c83 --- /dev/null +++ b/doc/scriptexamples/tutorial/minesweeper5.kvs @@ -0,0 +1,201 @@ +# The scripts in this tutorial implement the famous minesweeper game +# STEP 5 + + +# First of all we convert all the $$-> to @ : this is faster both to write and for KVIrc to process + +class(minelabel,label) +{ + mousePressEvent() + { + # We also pass the mouse button pressed + @$parent()->$mineLabelPressed($this,$0) + } +} + +class(minesweepermain,widget) +{ + constructor() + { + @%rows = 20 + @%cols = 20 + @%mines = 60 + @%bGameRunning = 0 + + @%layout = $new(layout,$this) + + for(%i = 0;%i < @%rows;%i++) + { + for(%j = 0;%j < @%cols;%j++) + { + @%label{%i,%j}=$new(minelabel,$this,"%i_%j") + @%label{%i,%j}->%row = %i + @%label{%i,%j}->%col = %j + @%label{%i,%j}->$setMinimumWidth(26) + @%label{%i,%j}->$setMinimumHeight(26) + @%label{%i,%j}->$setAlignment(HCenter , VCenter) + @%layout->$addWidget(@%label{%i,%j},%i,%j) + } + } + } + + 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->%iState = 0; # In state 0 it doesn't show anything + %l->$setText("") + %l->$setImage(); # show no image + %l->$setEnabled(1) + } + } + + for(%i = 0;%i < @%mines;%i++) + { + %row = $rand($(@%rows - 1)) + %col = $rand($(@%cols - 1)) + while(@%label{%row,%col}->%bIsMine != 0) + { + %row = $rand($(@%rows - 1)) + %col = $rand($(@%cols - 1)) + } + @%label{%row,%col}->%bIsMine = 1 + if(%row > 0) + { + @%label{$(%row - 1),%col}->%numMines++ + if(%col > 0)@%label{$(%row - 1),$(%col - 1)}->%numMines++ + if(%col < (@%cols - 1))@%label{$(%row - 1),$(%col + 1)}->%numMines++ + } + if(%row < (@%rows - 1)) + { + @%label{$(%row + 1),%col}->%numMines++ + if(%col > 0)@%label{$(%row + 1),$(%col - 1)}->%numMines++ + if(%col < (@%cols - 1))@%label{$(%row + 1),$(%col + 1)}->%numMines++ + } + if(%col > 0)@%label{%row,$(%col - 1)}->%numMines++ + if(%col < (@%cols - 1))@%label{%row,$(%col + 1)}->%numMines++ + } + @%bGameRunning = 1 + } + + mineLabelPressed($0 = mine label object that has been pressed,$1 = the button that has been pressed) + { + if(!@%bGameRunning)return + + # We add the right button handling : the user can mark the cells discovered + if($1 == 1) + { + # Right button was pressed + if($0->%bIsDiscovered)return; # does nothing + # we loop the state thru 0->1->2->0 + switch($0->%iState) + { + case(0): + { + $0->$setImage(58) + $0->%iState = 1 + } + case(1): + { + $0->$setImage(28) + $0->%iState = 2 + } + case(2): + { + $0->$setImage() + $0->%iState = 0 + } + } + return; + } + + if($0->%bIsMine) + { + $0->$setFrameStyle(WinPanel,Sunken) + $0->$setImage(82); # 82 is a bomb + @$emit(gameOver) + for(%i = 0;%i < @%rows;%i++) + { + for(%j = 0;%j < @%cols;%j++) + { + @%label{%i,%j}->$setEnabled(0) + } + } + $0->$setEnabled(1) + @%bGameRunning = 0 + } else { + @$discoverCells($0) + } + } + + discoverCells($0 = mine label that has to be discovered) + { + if($0->%bIsMine)return; + if($0->%bIsDiscovered)return; + $0->%bIsDiscovered = 1 + $0->$setFrameStyle(WinPanel,Sunken) + if($0->%iState != 0)$0->$setImage(); # ensure that no image is shown + if($0->%numMines > 0)$0->$setText($0->%numMines) + else { + if($0->%row > 0) + { + @$discoverCells(@%label{$($0->%row - 1),$0->%col}) + if($0->%col > 0)@$discoverCells(@%label{$($0->%row - 1),$($0->%col - 1)}) + if($0->%col < (@%cols - 1))@$discoverCells(@%label{$($0->%row - 1),$($0->%col + 1)}) + } + if($0->%row < (@%rows - 1)) + { + @$discoverCells(@%label{$($0->%row + 1),$0->%col}) + if($0->%col > 0)@$discoverCells(@%label{$($0->%row + 1),$($0->%col - 1)}) + if($0->%col < (@%cols - 1))@$discoverCells(@%label{$($0->%row + 1),$($0->%col + 1)}) + } + if($0->%col > 0)@$discoverCells(@%label{$0->%row,$($0->%col - 1)}) + if($0->%col < (@%cols - 1))@$discoverCells(@%label{$0->%row,$($0->%col + 1)}) + } + } + +} + + +class(minesweeper,widget) +{ + constructor() + { + @$setCaption("KVIrc's Minesweeper (0.1.0)"); + + @%layout = $new(layout,$$) + + + @%gamepool = $new(minesweepermain,$$) + @%layout->$addWidget(@%gamepool,1,0) + connect @%gamepool gameOver $$ gameOver + + @%output = $new(label,$$) + @%output->$setFrameStyle(WinPanel,Sunken) + @%layout->$addWidget(@%output,2,0) + + @$newGame() + } + + gameOver() + { + @%output->$setText("Game Over :(") + } + + newGame() + { + @%gamepool->$newGame() + @%output->$setText("Ready") + } +} + + +%m = $new(minesweeper) +%m->$show() |