Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class PlayField {
- private byte[][] playField = new byte[10][10];
- /*
- 0 - пусто
- 1 - корабль
- 2 - разбитый корабль
- -1 - пусто - прострелено
- */
- public byte[][] HiddenField(){
- byte[][] toReturn = playField;
- for(int x=0; x< 10; x++){
- for(int y=0; y< 10; y++)
- if(toReturn[x][y] == 1)
- toReturn[x][y] = 0;
- }
- return toReturn;
- }
- private byte[] ships = new byte[4]; //Количество кораблей (индекс - (длина-1))
- public int ShipCount(int length){
- return ships[length-1];
- }
- private boolean CheckEmptyPoint(int x, int y){
- if (x > 9 ||
- x < 0 ||
- y > 9 ||
- y < 0)
- return true;
- return !(playField[x][y] > 0);
- }
- private boolean CheckEmptyArea(int top, int bottom, int left, int right){
- for(int x = left; x< right; x++){
- for(int y = top; y< bottom; y++){
- if(!CheckEmptyPoint(x, y)) return false;
- }
- }
- return true;
- }
- public boolean PlaceShip(int x, int y, boolean rightDir, int length){
- if(ships[length-1] >= (5-length)) return false;
- int deltaX=0, deltaY=0;
- if(rightDir){
- if(x+length-1 > 9) return false;
- if(CheckEmptyArea(y-1, y+1, x-1, x+length))
- return false;
- deltaX=1;
- }
- else{
- if(y+length-1 > 9) return false;
- if(CheckEmptyArea(y-1, y+length, x-1, x+1))
- return false;
- deltaY=1;
- }
- int curX=x, curY=y;
- for(int i=0; i< length; i++){
- playField[curX][curY] = 1;
- curX += deltaX;
- curY += deltaY;
- }
- ships[length-1]++;
- return true;
- }
- private boolean CheckShipDestroyed(int x, int y){
- boolean rightDir = !(CheckEmptyPoint(x+1, y) && CheckEmptyPoint(x-1, y));
- int vectorX=0, vectorY=0;
- if(rightDir)
- vectorX=1;
- else
- vectorY=1;
- while(!CheckEmptyPoint(x-vectorX, y-vectorY)){ // в начальное положение
- x -= vectorX;
- y -= vectorY;
- }
- int oriX=x, oriY=y, length=0;
- while(!CheckEmptyPoint(x, y)){
- if(playField[x][y] == 1) return false;
- x += vectorX;
- y += vectorY;
- length++;
- }
- // Выделяем пустые клетки вокруг разбитого корабля
- DestroyedShipOutline(oriX, oriY, rightDir, length);
- return true;
- }
- private void SetPointShot(int x, int y){
- if(x > 9 || x < 0 || y > 9 || y < 0) return;
- playField[x][y] = -1;
- }
- private void DestroyedShipOutline(int oriX, int oriY, boolean rightDir, int length){
- oriX--; oriY--; length++;
- if(rightDir){
- for(int curX = oriX; curX< oriX+length; curX++)
- SetPointShot(curX, oriY);
- SetPointShot(oriX, oriY+1);
- SetPointShot(oriX+length, oriY+1);
- oriY += 2;
- for(int curX = oriX; curX< oriX+length; curX++)
- SetPointShot(curX, oriY);
- }
- else{
- for(int curY = oriY; curY< oriY+length; curY++)
- SetPointShot(oriX, curY);
- SetPointShot(oriX+1, oriY);
- SetPointShot(oriX+1, oriY+length);
- oriX += 2;
- for(int curY = oriY; curY< oriY+length; curY++)
- SetPointShot(oriX, curY);
- }
- }
- enum ShotType{MISS, HIT, KILL, ERROR}
- public ShotType Shoot(int x, int y){
- if(x> 9 || y> 9) return ShotType.ERROR;
- switch(playField[x][y]){
- case 0:
- playField[x][y] = -1;
- return ShotType.MISS;
- case 1:
- playField[x][y] = 2;
- return CheckShipDestroyed(x, y) ?
- ShotType.KILL :
- ShotType.HIT;
- default: return ShotType.ERROR;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement