Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

HELP!!! Battleship program

krazykreekrazykree Posts: 5Member
Hello! Please help! We (my classmates and I) are assigned a final project to make a battleship program in which we need to win against the computer everytime! How in the world can we do that? We are basic programmers, in which we just know how to make a program that can add or subtract or whatnot but not how to make battleship. PLEASE HELP!!!

Comments

  • zibadianzibadian Posts: 6,349Member
    : Hello! Please help! We (my classmates and I) are assigned a final project to make a battleship program in which we need to win against the computer everytime! How in the world can we do that? We are basic programmers, in which we just know how to make a program that can add or subtract or whatnot but not how to make battleship. PLEASE HELP!!!
    :
    First you need to create 2 playing-boards: 1 for you and 1 for the computer. I would suggest a 2-D integer array:
    [code]
    var
    ComputerField: array[1..20, 1..20] of integer;
    PlayerField: array[1..20, 1..20] of integer;
    [/code]
    Then you can define your ships and water. I would suggest that you take water as a value of 1, and the ships as numbers greater than 1. If a location is hit, you can make it negative to indicate the hit. I would also make an array, in which you count the hits against each ship. This makes it easier to keep track of how many and which ships are sunk.
    The game plays by entering the coordinates to hit and then the computer updates the playing fields and the ship lists.
    The display can be an simple indicator using various characters, or could be a complete graphical appearance. The easiest way is use GotoXY() to write the characters. You might also want to use colors: TextColor() and TextBackground().
    If you truly want to let the player win every time, let the computer know where 1 small ship is. This way you can control where the computer fires last. The most basic game lets the computer pick the locations at random.
    [code]
    repeat
    x := Random(20)+1;
    y := Random(20)+1;
    until PlayerField[x, y] > 0;
    [/code]
    This however might lock the program for some time later in the game. An improvement to this, is to count the number of times the computer picked a location. After a certain number is reached search for the first positive location on the map. This way the computer won't think too long about its move.
  • krazykreekrazykree Posts: 5Member
    uh...can you help put that in lay man's terms or possibly help by showing what the whole thing is supposed to look like...we don't even know where to start or anything
  • zibadianzibadian Posts: 6,349Member
    : uh...can you help put that in lay man's terms or possibly help by showing what the whole thing is supposed to look like...we don't even know where to start or anything
    :
    I assume you are familiar with the game Battleship, and know the rules. If you don't then familiarizing yourself with that is a very good start. Here is part of the code you requested. It still needs some parts, like the human player placing his ships.
    [code]
    unit BSUtils;

    interface

    const
    pfWater = 1;
    pfMineSweep = 2;
    pfFrigate = 3;
    pfCruiser = 4;
    pfBattleShip = 5;
    ShipNames: array[1..5] of string = ('Water', 'MineSweep', 'Frigate',
    'Cruiser', 'BattleShip');
    FieldSize = 16;

    type
    TShip = record
    Size: integer;
    NumberOfHits: integer;
    ID: integer;
    end;

    TPlayingField = array[1..FieldSize, 1..FieldSize] of integer;
    TShips = array[1..11] of TShip;

    TPlayerData = record
    Ships: TShips;
    Field: TPlayingField;
    end;

    var
    Human: TPlayerData;
    Computer: TPlayerData;

    procedure Initialize;
    { Initializes the game to 0 }
    procedure SetShip(var Player: TPlayerData; X, Y, Ship: integer; IsVert: boolean);
    { Sets the ship indexed "Ship" for the person indicated by "Player" at
    location "X, Y" with vertical direction if "IsVert" is true }
    procedure ComputerSetShips;
    { Sets all ships for the computer }
    procedure WriteDisplay;
    { Shows default display: Human field Computer Field }
    procedure GetPlayerShot;
    { Allows human to take 1 shot }
    procedure GetComputerShot;
    { Allows computer to take 1 shot }
    function IsWinner: integer;
    { Returns 1 if human wins
    Returns 0 if neither wins
    Returns -1 if computer wins }

    implementation

    procedure CreateShip(AID, ASize: integer; var Ship: TShip);
    begin
    with Ship do
    begin
    Size := ASize;
    ID := AID;
    NumberOfHits := 0;
    end;
    end;

    procedure SetShip(var Player: TPlayerData; X, Y, Ship: integer; IsVert: boolean);
    var
    i: integer;
    begin
    with Player do
    begin
    if IsVert then
    for i := Y to Y+Ships[Ship].Size-1 do
    Field[X, I] := Ship
    else
    for i := X to X+Ships[Ship].Size-1 do
    Field[I, Y] := Ship;
    end;
    end;

    procedure SetBoard(var Player: TPlayerData);
    var
    i, x, y: integer;
    begin
    with Player do
    begin
    for i := 1 to 4 do
    CreateShip(pfMineSweep, 2, Ships[i]);
    for i := 5 to 8 do
    CreateShip(pfFrigate, 3, Ships[i]);
    for i := 9 to 10 do
    CreateShip(pfCruiser, 4, Ships[i]);
    CreateShip(pfBattleShip, 5, Ships[11]);
    for x := 1 to FieldSize do
    for y := 1 to FieldSize do
    Field[x, y] := pfWater;
    end;
    end;

    procedure ComputerSetShips;

    function VIsClear(X, Y, Size: integer): boolean;
    var
    i: integer;
    b: boolean;
    begin
    b := true;
    for i := Y to Y+Size-1 do
    begin
    if Computer.Field[X, i] <> pfWater then
    b := false;
    end;
    VIsClear := b;
    end;

    function HIsClear(X, Y, Size: integer): boolean;
    var
    i: integer;
    b: boolean;
    begin
    b := true;
    for i := X to X+Size-1 do
    begin
    if Computer.Field[i, Y] <> pfWater then
    b := false;
    end;
    HIsClear := b;
    end;

    var
    i: integer;
    X, MaxX: integer;
    Y, MaxY: integer;
    D: boolean;
    begin
    for i := 1 to 11 do
    begin
    X := Round(Random*100);
    D := X > 49;
    if D then
    begin
    MaxX := FieldSize;
    MaxY := FieldSize - Computer.Ships[i].Size-1;
    repeat
    X := Round(Random*MaxX)+1;
    Y := Round(Random*MaxY)+1;
    until VIsClear(X, Y, Computer.Ships[i].Size);
    end else begin
    MaxX := FieldSize - Computer.Ships[i].Size-1;
    MaxY := FieldSize;
    repeat
    X := Round(Random*MaxX)+1;
    Y := Round(Random*MaxY)+1;
    until HIsClear(X, Y, Computer.Ships[i].Size);
    end;
    SetShip(Computer, X, Y, i, D);
    end;
    end;

    procedure Initialize;
    begin
    Randomize;
    SetBoard(Human);
    SetBoard(Computer);
    end;

    procedure DisplayField(Player: TPlayerData; OffSetX, OffSetY: integer);
    var
    x, y: integer;
    begin
    for x := 1 to FieldSize do
    for y := 1 to FieldSize do
    begin
    GotoXY(x+OffSetX, y+OffSetY);
    case Player.Field[x, y] of
    -20..-2: Write('#');
    -1: Write('+');
    0..20: Write('_');
    end;
    end;
    end;

    procedure DetermineShip(var Player: TPlayerData; X, Y: integer);
    var
    i: integer;
    begin
    with Player do
    begin
    Field[X, Y] := -Field[X, Y];
    if -Field[X, Y] = -pfWater then Exit;
    with Ships[Abs(Field[X, Y])] do
    begin
    inc(NumberOfHits);
    if NumberOfHits = Size then
    begin
    writeln(ShipNames[ID], ' has been sunk!');
    write('Press enter to continue...'); readln;
    end;
    end;
    end;
    end;

    procedure GetPlayerShot;
    var
    X, Y: integer;
    begin
    repeat
    GotoXY(1, FieldSize+4);
    write('Give horizontal location (1-', FieldSize, '): '); readln(X);
    write('Give vertical location (1-', FieldSize, '): '); readln(Y);
    until (X in [1..FieldSize]) and (Y in [1..FieldSize]) and
    (Computer.Field[x, y] > 0);
    DetermineShip(Computer, X, Y);
    DisplayField(Computer, 20, 1);
    end;

    procedure GetComputerShot;
    var
    X, Y: integer;
    begin
    repeat
    X := Round(Random*FieldSize)+1;
    Y := Round(Random*FieldSize)+1;
    until (X in [1..FieldSize]) and (Y in [1..FieldSize]) and
    (Human.Field[x, y] > 0);
    write('Give horizontal location (1-', FieldSize, '): ', X);
    write('Give vertical location (1-', FieldSize, '): ', Y);
    DetermineShip(Human, X, Y);
    DisplayField(Human, 0, 1);
    end;

    procedure WriteDisplay;
    begin
    GotoXY(1,1); write('Your board:');
    DisplayField(Human, 0, 1);
    GotoXY(20,1); write('My board:');
    DisplayField(Computer, 20, 1);
    end;

    function IsWinner: integer;
    var
    i: integer;
    begin
    IsWinner := 1; { Assume Human has won }
    for i := 1 to 11 do
    if Computer.Ships[i].Size <> Computer.Ships[i].NumberOfHits then
    IsWinner := -1; { If still computer ships left, assume Computer has won }
    if IsWinner = 1 then Exit;
    for i := 1 to 11 do
    if Human.Ships[i].Size <> Human.Ships[i].NumberOfHits then
    IsWinner := 0; { If still human ships left, game not finished yet }
    end;

    end.
    [/code]
    Any errors indicating unknown identifiers arise from the lack of a uses list. See the help files of your version of Pascal for which unit to use.
  • krazykreekrazykree Posts: 5Member
    thanks, i'll try this...you are a great help...now hopefully i'll be able to figure this out for my teacher...thanks! i'll just ask you later if i have problems. thank you so much
  • krazykreekrazykree Posts: 5Member
    I'm really really sorry...can you maybe write the program for us? we need it this week and we are really trying to figure it out. you've helped so much but it is still very hard. i know it's asking a lot, but could you please help again. thank you so much.
  • zibadianzibadian Posts: 6,349Member
    : I'm really really sorry...can you maybe write the program for us? we need it this week and we are really trying to figure it out. you've helped so much but it is still very hard. i know it's asking a lot, but could you please help again. thank you so much.
    :
    I won't do your assignments for you, because then you'll never learn Pascal.
  • gabokoolgabokool Posts: 2Member
    : Hello! Please help! We (my classmates and I) are assigned a final project to make a battleship program in which we need to win against the computer everytime! How in the world can we do that? We are basic programmers, in which we just know how to make a program that can add or subtract or whatnot but not how to make battleship. PLEASE HELP!!!
    :

    Are you from Venezuela? I have a final Project too which is to make a battleship program.. :P I study at the UCV....

  • krazykreekrazykree Posts: 5Member
    : : Hello! Please help! We (my classmates and I) are assigned a final project to make a battleship program in which we need to win against the computer everytime! How in the world can we do that? We are basic programmers, in which we just know how to make a program that can add or subtract or whatnot but not how to make battleship. PLEASE HELP!!!
    : :
    :
    : Are you from Venezuela? I have a final Project too which is to make a battleship program.. :P I study at the UCV....
    :
    :
    no philippines
  • gabokoolgabokool Posts: 2Member
    : : : Hello! Please help! We (my classmates and I) are assigned a final project to make a battleship program in which we need to win against the computer everytime! How in the world can we do that? We are basic programmers, in which we just know how to make a program that can add or subtract or whatnot but not how to make battleship. PLEASE HELP!!!
    : : :
    : :
    : : Are you from Venezuela? I have a final Project too which is to make a battleship program.. :P I study at the UCV....
    : :
    : :
    : no philippines
    :

    If you find the program I will appreciate that you posted it here please!!! And if i find it i will do the same...

Sign In or Register to comment.