BettingGame

by Arnav Rawat: Y10 Age ~15

Introduction

Arnav had a suitably challenging idea for one of his first programs to practise a range of language facilities. This interesting game uses random numbers combined with a weighting system. Arnav makes good use of routines and with more experience will further improve the efficiency of his code. You have the advantage of being able to see the source code before playing it so that you can plan an effective strategy. We think we are making good progress:

Game in progress

Game in progress

We also fared well on the Raspberry Pi:

Game in progress on the Pi

Game in progress on the Pi

Note that the use of GBP instead of the pound sign is the easiest fix to display amounts of sterling on the Pi.

Unfortunately, the odds of a bookie using this program are very low! If you are planning to record your score you need to have a file named Leaderboard.txt in your program folder. This code supplied by Arnav will generate the file for first use.

program SaveFile;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var
f : text;

begin
  assign(f, 'Leaderboard.txt');
  rewrite(f); //Open File for writing
  closeFile(f);
end.

The Program

program BettingGame;
{
    Copyright (c) 2013 Arnav
    
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License, as described at
    http://www.apache.org/licenses/ and http://www.pp4s.co.uk/licenses/
}

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  NumberOfTeams = 20;

var
  Teams : array[1 .. NumberOfTeams] of string = ('Manchester City', 'Manchester United', 'Chelsea', 'Tottenham',
                                                 'Arsenal', 'Everton', 'Swansea', 'Newcastle', 'West Bromwich Albion',
                                                 'Fulham', 'Liverpool', 'Stoke City', 'West Ham', 'Norwich City',
                                                 'Sunderland', 'Aston Villa', 'Wigan Athletic', 'Southampton',
                                                 'Queens Park Rangers', 'Reading');
  Rating : array[1 .. NumberOfTeams] of integer = (85, 84, 82, 81, 81, 80, 76, 75, 75, 75, 74, 73, 73, 73, 72, 72, 71, 71, 70, 69);
  TeamOne, TeamTwo, LowerBound, UpperBound, TeamOneOdds, TeamTwoOdds, TeamSelection : integer;
  UserMoney, BettingMoney, TeamOneChance, TeamTwoChance, WinningNumber, Result, DrawOdds, DrawChance : integer;
  UserName, RatingsDisplay : string;
  TFile : text;

//Function that produces a random number between two different numbers
function RandomFn(Low : Integer; High : Integer) : integer;
var
  LocalRandomNumber : Integer;
begin
  randomize;
  LocalRandomNumber := (Random(High - Low + 1)) + Low;
  RandomFn := LocalRandomNumber;
end;

procedure OddsGenerator;
begin
//Generates odds for all three scenarios
  if (Rating[TeamOne] - Rating[TeamTwo]) > -20 then
    begin
      TeamOneOdds := 24;
      DrawOdds := 12;
      TeamTwoOdds := 2;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > -15 then
    begin
      TeamOneOdds := 16;
      DrawOdds := 8;
      TeamTwoOdds := 2;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > -10 then
    begin
      TeamOneOdds := 12;
      DrawOdds := 4;
      TeamTwoOdds := 3;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > -5 then
    begin
      TeamOneOdds := 8;
      DrawOdds := 6;
      TeamTwoOdds := 4;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 0 then
    begin
      TeamOneOdds := 5;
      DrawOdds := 3;
      TeamTwoOdds := 7;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 2 then
    begin
      TeamOneOdds := 5;
      DrawOdds := 3;
      TeamTwoOdds := 8;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 5 then
    begin
      TeamOneOdds := 4;
      DrawOdds := 6;
      TeamTwoOdds := 8;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 10 then
    begin
      TeamOneOdds := 3;
      DrawOdds := 4;
      TeamTwoOdds := 12;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 15 then
    begin
      TeamOneOdds := 2;
      DrawOdds := 8;
      TeamTwoOdds := 16;
    end;
  if (Rating[TeamOne] - Rating[TeamTwo]) > 20 then
    begin
      TeamOneOdds := 2;
      DrawOdds := 12;
      TeamTwoOdds := 24;
    end;
end;

procedure FixtureGenerator;
begin
  //Generates A Fixture
  randomize;
  LowerBound := 1;
  UpperBound := 20;
  //Repeat loop makes sure the two teams aren't the same
  repeat
    TeamOne := RandomFn(LowerBound, UpperBound);
    TeamTwo := RandomFn(LowerBound, UpperBound);
  until TeamOne <> TeamTwo;
  writeln(Teams[TeamOne], ' vs ', Teams[TeamTwo]);
  writeln;
end;

procedure ResultGenerator;
begin
  //Generates Result
  WinningNumber := RandomFn(1, 100);
  if Rating[TeamOne] > Rating[TeamTwo] then
    begin
      TeamOneChance := 50 + (Rating[TeamOne] - Rating[TeamTwo]);
      TeamTwoChance := 50 - (Rating[TeamOne] - Rating[TeamTwo]);
      if TeamTwoChance > WinningNumber then
        begin
          //Result Variable stores the Result as an integer variable
          Result := 1;
        end;
      DrawChance := RandomFn(1, 2);
      if DrawChance = 2 then
        begin
          Result := 2;
        end;
    end
  else
    begin
      TeamTwoChance := 50 + ((Rating[TeamTwo] - Rating[TeamOne]) * 2);
      TeamOneChance := 50 - ((Rating[TeamTwo] - Rating[TeamOne]) * 2);
      if TeamTwoChance < WinningNumber then
        begin
          Result := 1;
        end;
      DrawChance := RandomFn(1, 2);
      if DrawChance = 2 then
        begin
          Result := 2;
        end;
    end;
end;

procedure Credits;
begin
  //Outputs Credits at the end of the game
  writeln('You have run out of money.');
  writeln;
  writeln('Do not be disheartened as this can happen to anyone.');
  writeln;
  writeln('Why not play again?');
  writeln;
  sleep(500);
  writeln('Credits');
  writeln;
  sleep(500);
  writeln('Produced by Arnav,');
  writeln;
  sleep(500);
  writeln('Designed by Arnav,');
  writeln;
  sleep(500);
  writeln('All rights reserved.');
  writeln;
  sleep(5000);
end;

procedure WhileLoop;
begin
  while usermoney > 0 do
    begin
      writeln('********************************************************************************');
      writeln('Incoming Fixture...');
      writeln;
      sleep(600);
      FixtureGenerator;
      writeln('Here are the odds...');
      writeln;
      OddsGenerator;
      writeln('The odds for a ', Teams[TeamOne], ' win are ', TeamOneOdds, '/1');
      writeln;
      writeln('The odds for a ', Teams[TeamTwo], ' win are ', TeamTwoOdds, '/1');
      writeln;
      writeln('The odds for a draw are ', DrawOdds, '/1');
      writeln;
      writeln('Enter <1> if you think ', Teams[TeamOne], ' will win.');
      writeln;
      writeln('Enter <2> if you think ', Teams[TeamTwo], ' will win.');
      writeln;
      writeln('Enter <3> if you think it will be a draw.');
      writeln;
      writeln('Enter <4> if you would like to leave with ', CHR(156), usermoney, '.');
      writeln;
      readln(TeamSelection);
      writeln;
      ResultGenerator;
      case TeamSelection of
      1 :
      begin
        //Following Code happens if the User selects Team One Win
        writeln('You have ', CHR(156), usermoney, '.');
        writeln;
        repeat
          writeln('How much money would you like to bet?');
          writeln;
          readln(bettingmoney);
          writeln;
        until bettingmoney < usermoney + 1;
        if Result = 1 then
          begin
            writeln('Incoming Result...');
            writeln;
            sleep(1000);
            writeln('Congratulations! ', Teams[TeamOne], ' won.');
            writeln;
            usermoney := usermoney + (bettingmoney * TeamOneOdds);
            writeln;
            writeln('That means you now have ', CHR(156), usermoney, '.');
          end
        else
          begin
            writeln('Incoming Result...');
            writeln;
            sleep(1000);
            writeln('We are sorry to tell you that ', Teams[TeamOne], ' lost.');
            writeln;
            usermoney := usermoney - bettingmoney;
            writeln('That means you now have ', CHR(156), usermoney, '.');
            writeln;
          end;
      end;
      2 :
      begin
        //Following code happens if the user selects Team Two Win
        writeln('You have ', CHR(156), usermoney, '.');
        writeln;
        repeat
          writeln('How much money would you like to bet?');
          writeln;
          readln(bettingmoney);
          writeln;
        until bettingmoney < usermoney + 1;
        if Result = 1 then
          begin
            writeln('Incoming Result...');
            writeln;
            sleep(1000);
            writeln('We are sorry to tell you that ', Teams[TeamTwo], ' lost.');
            writeln;
            usermoney := usermoney - bettingmoney;
            writeln('That means you now have ', CHR(156), usermoney, '.');
            writeln;
          end
        else
          begin
            writeln('Incoming Result...');
            writeln;
            sleep(1000);
            writeln('Congratulations! ', Teams[TeamTwo], ' won.');
            writeln;
            usermoney := usermoney + (bettingmoney * TeamTwoOdds);
            writeln(('That means you now have '), CHR(156), usermoney, '.');
            writeln;
          end;
      end;
      3:
      begin
        //Following code happens if the user selects a draw
        writeln('You have ', CHR(156), usermoney, '.');
        writeln;
          repeat
            writeln('How much money would you like to bet?');
            writeln;
            readln(bettingmoney);
            writeln;
          until bettingmoney < usermoney + 1;
        if Result = 2 then
          begin
            writeln('Incoming Result...');
            writeln;
            sleep(1000);
            writeln('Congratulations! ', Teams[TeamOne], ' drew with ', Teams[TeamTwo]);
            writeln;
            usermoney := usermoney + (bettingmoney * TeamTwoOdds);
            writeln(('That means you now have '), CHR(156), usermoney, '.');
            writeln;
          end
        else
          begin
            if Result = 1 then
              begin
                writeln('Incoming Result...');
                writeln;
                sleep(1000);
                writeln('We are sorry to tell you that ', Teams[TeamOne], ' won.');
                writeln;
                usermoney := usermoney - bettingmoney;
                writeln('That means you now have ', CHR(156), usermoney, '.');
                writeln;
              end
            else
              begin
                writeln('Incoming Result...');
                writeln;
                sleep(1000);
                writeln('We are sorry to tell you that ', Teams[TeamTwo], ' won.');
                writeln;
                usermoney := usermoney - bettingmoney;
                writeln('That means you now have ', CHR(156), usermoney, '.');
                writeln;
              end;
          end;
      end;
      4 :
      begin
      //Saves user's final score into a file.
        writeln('You are going to leave with ', CHR(156), usermoney, '.');
        writeln;
        writeln('Adding to leaderboard.');
        writeln;
        writeln('What is your name?');
        writeln;
        readln(username);
        assignFile(TFile, 'Leaderboard.txt');
        append(TFile);
        writeln(TFile, username, ' finished with a total of £', usermoney);
        writeln;
        closeFile(TFile);
        writeln('You have been added to the leaderboard.');
        writeln;
        sleep(1000);
        halt;
      end;
    end;
  end;
end;

procedure TeamAndRatingDisplay;
var
  i : integer;
begin
  //Shows the user the ratings of each of the twenty teams.
  writeln('Do you want to see the ratings of each team?');
  writeln;
  writeln('Enter <Yes> if you want to see the ratings.');
  writeln;
  writeln('Enter <No> if you do not want to see the ratings.');
  writeln;
  readln(RatingsDisplay);
  writeln;
  if (LowerCase(RatingsDisplay) = 'yes') then
    begin
      writeln('Here are the twenty teams and their consequent ratings');
      writeln;
      for i  :=  1 to 20 do
        begin
          writeln(Teams[i], ' have a rating of ', Rating[i]);
          writeln;
          sleep(300);
        end;
    end
  else
    begin
      writeln;
    end;
end;

begin
  //Main Block of Program
  usermoney := 10;
  writeln('Welcome to my football betting game.');
  writeln;
  writeln('It consists of the twenty current teams of the Barclays Premier League.');
  writeln;
  TeamAndRatingDisplay;
  writeln(('You will start off with '), CHR(156), ('10'));
  writeln;
  WhileLoop;
  Credits;
end.

Remarks

Can you develop a program for generating likely outcomes of matches?

Programming - a skill for life!

Student programs to inspire you!