Pascal's Algorithm


Pengertian algoritma pemrograman adalah suatu alur yang dipergunakan dalam suatu perhitungan atau pemecahan suatu masalah secara sistematis, serta dalam kegiatan pemrograman algoritma biasanya dianggap sebagai sebuah logika untuk menentukan program yang akan dibuat. Dalam definisi lain, algoritma pemrograman adalah serangkaian proses yang wajib diikuti dalam suatu perhitungan pemecahan masalah yang lain, terutama pada program komputer. Algoritma pemrograman adalah suatu pemecahan masalah dengan suatu susunan yang logis berdasarkan sistematika tertentu. Berikut beberapa Contoh Pemograman Pascal.

1. Program Tetris 2 Player

program tetris_2player;
uses crt;
type _points = array [1..4] of record
        x,y : longint;
     end;
     tetris = record
        points : _points;
        cshape, nshape, xmodel, xtetris, ymodel, ytetris : longint;
     end;

Const template : array [1..8] of _points =
 (((x:1; y:1),(x:1; y:2),(x:2; y:1),(x:2; y:2)),
  ((x:2; y:1),(x:1; y:1),(x:3; y:1),(x:4; y:1)),
    ((x:1; y:2),(x:1; y:1),(x:1; y:3),(x:2; y:3)),
    ((x:2; y:2),(x:2; y:1),(x:2; y:3),(x:1; y:3)),
    ((x:1; y:2),(x:1; y:1),(x:2; y:2),(x:2; y:3)),
    ((x:1; y:2),(x:2; y:1),(x:2; y:2),(x:1; y:3)),
    ((x:1; y:2),(x:1; y:1),(x:1; y:3),(x:2; y:2)),
    ((x:1; y:2),(x:2; y:1),(x:2; y:2),(x:2; y:3)));

var field : array [1..79,1..25] of boolean;
    tetris1, tetris2, ttetris : tetris;
    quit,gameover : boolean;
    answer : char;

procedure init_field;
var i : longint;
begin
     clrscr; fillchar(field,sizeof(field),0);
     for i := 3 to 22 do
     begin
        gotoxy(20,i); write(#186); field[20,i] := true;
        gotoxy(36,i); write(#186); field[36,i] := true;
        gotoxy(60,i); write(#186); field[60,i] := true;
        gotoxy(76,i); write(#186); field[76,i] := true;
     end;
     for i := 1 to 15 do
     begin
        gotoxy(20+i,23); write(#205); field[20+i,23] := true;
        gotoxy(60+i,23); write(#205); field[60+i,23] := true;
     end;
     gotoxy(20,23); write(#200);
     gotoxy(60,23); write(#200);
     gotoxy(36,23); write(#188);
     gotoxy(76,23); write(#188);
     gotoxy(6,4); write('Next:');
     gotoxy(46,4); write('Next:');
end;

procedure drawtetris(objek : tetris; mode : Boolean);
var i : longint;
 c : char;
begin
 if mode then c := #178 else c := #32;
 for i := 1 to 4 do
 begin
        field[objek.points[i].x,objek.points[i].y] := mode;
        gotoxy(objek.points[i].x, objek.points[i].y);
        write(c);
    end;
    gotoxy(1,1);
End;

procedure dropnew(var objek : tetris);
var i : longint;
begin
    if objek.cshape <> 0 then
    begin
        for i := 1 to 4 do
        begin
            ttetris.points[i].x := template[objek.nshape,i].x + objek.xmodel;
            ttetris.points[i].y := template[objek.nshape,i].y + objek.ymodel;
        end;
        drawtetris(ttetris,false);
    end;
    objek.cshape := objek.nshape;
    objek.nshape := random(8) + 1;
    for i := 1 to 4 do
    begin
        objek.points[i].x := template[objek.cshape,i].x + objek.xtetris;
        objek.points[i].y := template[objek.cshape,i].y + objek.ytetris;
        ttetris.points[i].x := template[objek.nshape,i].x + objek.xmodel;
        ttetris.points[i].y := template[objek.nshape,i].y + objek.ymodel;
        if field[objek.points[i].x,objek.points[i].y] then
        begin
            gameover := true;
            break;
        end;
    end;
    drawtetris(objek,true);
    drawtetris(ttetris,true);
end;

procedure init_tetris(var objek : tetris; id : longint);
begin
     objek.nshape := random(8) + 1;
     if id = 1 then
     begin
        objek.xmodel := 7; objek.xtetris := 26;
     end else begin
        objek.xmodel := 47; objek.xtetris := 66;
     end;
     objek.ymodel := 5; objek.ytetris := 2;
     dropnew(objek);
end;

procedure eliminate(objek : tetris; y : longint);
var i,j,k : longint;
    blank : boolean;
begin
    for i := y downto 3 do
    begin
        blank := false;
        for j := objek.xmodel + 14 to objek.xmodel + 28 do
            if not field[j,i] then
            begin
                blank := true;
                break;
            end;
        if not blank then
        begin
            for k := i downto 3 do
            begin
                gotoxy(objek.xmodel + 14,k);
                for j := (objek.xmodel + 14) to (objek.xmodel + 28) do
                begin
                    if field[j,k-1] then write(#178) else write(#32);
                    field[j,k] := field[j,k-1];
                end;
            end;
            eliminate(objek,i);
            break;
        end;
    end;
end;

procedure slide(var objek : tetris);
var i : longint;
    dropped : boolean;
begin
    drawtetris(objek,false);
    ttetris := objek;
    dropped := false;
    for i := 1 to 4 do
    begin
        inc(ttetris.points[i].y);
        if field[ttetris.points[i].x,ttetris.points[i].y] then
        begin
            dropped := true;
            break;
        end;
    end;
    if not dropped then objek := ttetris;
    drawtetris(objek,true);
    if dropped then
    begin
        eliminate(objek,22);
        dropnew(objek);
    end;
end;

procedure rotate(var objek : tetris);
var i : longint;
    collide : boolean;
begin
    drawtetris(objek,false);
    ttetris := objek;
    collide := false;
    for i := 2 to 4 do
    begin
        ttetris.points[i].y := objek.points[1].y + objek.points[i].x - objek.points[1].x;
        ttetris.points[i].x := objek.points[1].x - objek.points[i].y + objek.points[1].y;
        if field[ttetris.points[i].x,ttetris.points[i].y] then
        begin
            collide := true;
            break;
        end;
    end;
    if not collide then objek := ttetris;
    drawtetris(objek,true);
end;

procedure shift(var objek : tetris; x, y : longint);
var i : longint;
    collide : boolean;
begin
    drawtetris(objek,false);
    ttetris := objek;
    collide := false;
    for i := 1 to 4 do
    begin
        ttetris.points[i].x := objek.points[i].x + x;
        ttetris.points[i].y := objek.points[i].y + y;
        if field[ttetris.points[i].x,ttetris.points[i].y] then
        begin
            collide := true;
            break;
        end;
    end;
    if not collide then objek := ttetris;
    drawtetris(objek,true);
    if collide then eliminate(objek,22);
end;

procedure userinput;
var i : longint;
    c : char;
begin
    for i := 1 to 20 do
    begin
        if keypressed then
        begin
             c := upcase(readkey);
             case c of
             'W' : if tetris1.cshape <> 1 then rotate(tetris1);
             #72 : if tetris2.cshape <> 1 then rotate(tetris2);
             'A' : shift(tetris1,-1,0);
             #75 : shift(tetris2,-1,0);
             'S' : shift(tetris1,0,1);
             #80 : shift(tetris2,0,1);
             'D' : shift(tetris1,1,0);
             #77 : shift(tetris2,1,0);
             #27 : gameover := true;
             #32 : repeat delay(10); until keypressed;
             end;
        end;
        delay(10);
    end;
end;

begin
    randomize;
    while not quit do
    begin
        init_field;
        init_tetris(tetris1,1);
        init_tetris(tetris2,2);
        gameover := false;
        while not gameover do
        begin
            slide(tetris1);
            slide(tetris2);
            userinput;
        end;
        gotoxy(1,25); write('Play Again[Y/N]? ');
        repeat
            answer := upcase(readkey);
        until answer in ['Y','N',#27];
        if (answer = 'N') or (answer = #27) then break;
    end;
end.


2. Program Matrix
uses crt;
var
  a,b,c,d,e,g:integer;
  f:char;
begin clrscr;
  write('Tekan  dan lihat hasilnya :D');
  writeln;
  writeln('Meka');
  writeln('Kelas XI MIPA 4/14');
  readln; clrscr;
  // sintak matrik dengan perulangan repeat until
  Repeat
    a:=1+random(120);
    b:=1+random(49);
    c:=random(10);
    g:=2+random(27); // ubah angka 30 jadi 28 atau lebih kecil
      For d:=b to b+c do
        Begin
          If d<50 then
            Begin
              f:=chr(random(255));
              For e:=1 to 3 do
                Begin
                  If e = 1 then
                    textcolor(10)
                  Else
                    textcolor(2);
                    gotoxy(a,g);
                    // delay(10);
                    Write(f);
                  End;
              End;
      End;

  until keypressed;
end.


3. Program Sudoku

program sudoku;
uses crt,dos;
type
        puzzle=array[0..80]of integer;
        arraysol=array[0..2]of puzzle;
        waktu=record
                jam,menit,detik,sec:word;
        end;
const
        database:arraysol=(
 (4,2,9,3,1,6,5,7,8
 ,8,6,7,5,2,4,1,9,3
 ,5,1,3,8,9,7,2,4,6
 ,9,3,1,7,8,5,6,2,4
 ,6,8,2,9,4,1,7,3,5
 ,7,4,5,2,6,3,9,8,1
 ,3,5,4,6,7,2,8,1,9
 ,1,7,8,4,5,9,3,6,2
 ,2,9,6,1,3,8,4,5,7),
 (9,6,5,4,1,8,7,3,2
 ,1,4,3,2,6,7,9,5,8
 ,8,2,7,9,5,3,6,1,4
 ,5,7,9,3,8,4,1,2,6
 ,4,1,2,6,9,5,3,8,7
 ,6,3,8,1,7,2,4,9,5
 ,3,5,4,7,2,1,8,6,9
 ,7,8,6,5,3,9,2,4,1
 ,2,9,1,8,4,6,5,7,3),     
 (1,2,5,8,9,7,6,3,4
 ,6,7,4,5,1,3,9,2,8
 ,3,9,8,4,2,6,1,5,7
 ,4,8,2,6,5,9,7,1,3
 ,7,6,9,2,3,1,4,8,5
 ,5,3,1,7,8,4,2,9,6
 ,2,4,3,9,7,5,8,6,1
 ,9,5,6,1,4,8,3,7,2
 ,8,1,7,3,6,2,5,4,9));
var
        arrayrandom:array[1..21]of integer;
        rdonly:array[0..80]of boolean;
        currentpuzzle:puzzle;
        jawaban:puzzle;
        nama:string;
        level:integer;
        tombol:char;
        waktuawal,waktuakhir:waktu;

function chartoint(x:char):integer;
begin
        chartoint:=ord(x)-48;
end;

procedure generatearrayrandom;
var i,j,tmp:integer;
    valid:boolean;
begin
        i:=0;
        randomize;
        while i<=21 do
        begin
                valid:=true;
                tmp:=random(81);
                for j:=1 to i do
                begin
                        if arrayrandom[j]=tmp then
                                valid:=false;
                end;
                if valid then
                begin
                        arrayrandom[i]:=tmp;
                        inc(i);
                end;
        end;
end;

procedure tampilbox;
var i,j:integer;
begin
        clrscr;
        for i:=1 to 19 do
        begin
           for j:=1 to 19 do
           begin
              if (i=1) or (i=19) or (j=1) or (j=19)
              or (i mod 2 <>0) or (j mod 2 <>0)
              then
              begin
              gotoxy(j,i);write('#');
              end;
           end;
           writeln;
        end;
        gotoxy(2,2);
end;
procedure inputnama;
begin
        clrscr;
        write('Masukkan nama anda : ');
        read(nama);
end;

procedure pilihjawaban;
begin
        randomize;
        currentpuzzle:=database[random(3)];
end;

procedure transform(tipe: integer);
var i,tmp,tmpindx,mod9,div9:integer;
begin
        case tipe of
                0:for i:=0 to 80 do {vertikal}
                        if(i mod 9 < 4) then
                        begin
                                tmp:=currentpuzzle[i];
                                div9:=i div 9;
                                tmpindx:=(9*div9+8)-(i-(9*div9));
                                currentpuzzle[i]:=currentpuzzle[tmpindx];
                                currentpuzzle[tmpindx]:=tmp;
                        end;
                1:for i:=0 to 80 do{diagonal kanan}
                        if(i div 9 + i mod 9 < 8) then
                        begin
                                mod9:=i mod 9;
                                div9:=i div 9;
                                tmp:=currentpuzzle[i];
                                tmpindx:=(8-mod9) * 9 + 8 - div9;
                                currentpuzzle[i]:=currentpuzzle[tmpindx];
                                currentpuzzle[tmpindx]:=tmp;
                        end;
                2:for i:=0 to 80 do{diagonal kiri}
                        if(i div 9 > i mod 9) then
                        begin
                                mod9:=i mod 9;
                                div9:=i div 9;
                                tmp:=currentpuzzle[i];
                                tmpindx:=div9+mod9*9;
                                currentpuzzle[i]:=currentpuzzle[tmpindx];
                                currentpuzzle[tmpindx]:=tmp;
                        end;
                3:for i:=0 to 80 do {horizontal}
                        if(i div 9 < 4) then
                        begin
                                mod9:=i mod 9;
                                div9:=i div 9;
                                tmp:=currentpuzzle[i];
                                tmpindx:=mod9+(8-div9)*9;
                                currentpuzzle[i]:=currentpuzzle[tmpindx];
                                currentpuzzle[tmpindx]:=tmp;
                        end;
        end;
end;
procedure randomjawaban;
var i:integer;
begin
        randomize;
        for i:=1 to 7 do
                transform(random(4));
end;

procedure pilihlevel;
begin
        write('Pilih level yang anda inginkan [1--7] : ');
        read(level);
        if not level in [1,2,3,4,5,6,7] then
                level:=7;
end;

function checkrandom(data:integer):boolean;
var
        tmp:boolean;
        i:integer;
begin
        tmp:=true;
        for i:=1 to level*3 do
                if arrayrandom[i]=data then
                begin
                        tmp:=false;
                        break;
                end;
        checkrandom:=tmp;

end;

procedure tampilsebagian;
var i:integer;
begin
        generatearrayrandom;
        for i:=0 to 80 do
        begin
                if  checkrandom(i) then
                begin
                        gotoxy(2+2*(i mod 9),2+2*(i div 9));
                        write(currentpuzzle[i]);
                        jawaban[i]:=currentpuzzle[i];
                        rdonly[i]:=true;
                end;
        end;
        gotoxy(2,2);
end;
function checkjawaban:boolean;
var i:integer;
    tmp:boolean;
begin
        tmp:=true;
        for i:=0 to 80 do
                if jawaban[i]<>currentpuzzle[i] then
                begin
                        tmp:=false;
                        break;
                end;
        checkjawaban:=tmp;
end;
begin
        textcolor(green);
        inputnama;
        pilihlevel;
        tampilbox;
        pilihjawaban;
        randomjawaban;
        tampilsebagian;
        textcolor(red);
        gettime(waktuawal.jam,waktuawal.menit,waktuawal.detik,waktuawal.sec);
        repeat
                tombol:=readkey;
                if ord(tombol)=0 then
                begin
                        tombol:=readkey;
                        case ord(tombol) of(*atas bawah kiri kanan*)
                                72:if wherey<>2 then
                                   gotoxy(wherex,wherey-2);
                                80:if wherey<>18 then
                                   gotoxy(wherex,wherey+2);
                                75:if wherex<>2 then
                                   gotoxy(wherex-2,wherey);
                                77:if wherex<>18 then
                                   gotoxy(wherex+2,wherey);
                        end;
                end;
                if (tombol>='0') and (tombol<='9') and not (rdonly[(wherex div 2 - 1)+(wherey div 2 - 1)*9]) then
                begin
                        jawaban[(wherex div 2 -1)+(wherey div 2 - 1)*9]:=chartoint(tombol);
                        write(tombol);
                        gotoxy(wherex-1,wherey);
                end;
        until (ord(tombol)=27) or checkjawaban;
        if checkjawaban then
        begin
                clrscr;
                gettime(waktuakhir.jam,waktuakhir.menit,waktuakhir.detik,waktuakhir.sec);
                writeln('selamat, ',nama,' anda sukses pada sudoku level ',level);
                write('waktu anda : ');
                if waktuakhir.menit-waktuawal.menit<>0 then
                        write(waktuakhir.menit-waktuawal.menit,' menit');
                write(waktuakhir.detik-waktuawal.detik,' detik');
        end;
        readln;
        readln;
        normvideo;
end.


4. Program Sulap Angka

PROGRAM SULAPANGKA;
USES CRT;
VAR I, J, K, L: INTEGER;
YT: CHAR;
NILAI:INTEGER;
FUNCTION CSTR(I: INTEGER): STRING;
VAR S: STRING[11];
BEGIN
GOTOXY(30,1); WRITE('WELCOME IN MAGIC NUMBER'); STR(I, S); CSTR := S; END;
PROCEDURE TULIS(POSISI:INTEGER; TEKS:STRING);
VAR A, B, C: INTEGER;
BEGIN
A := POSISI; B := POSISI MOD 10; C := 1;
IF B = 0 THEN BEGIN B := 10;C := 0;
END;
GOTOXY(B * 8 - 5, (A DIV 10 + C) * 3 + 1); WRITE(TEKS);
END;
PROCEDURE BIKIN_KOTAK(KOLOM, BARIS: INTEGER);
BEGIN
CLRSCR;
FOR I:= 1 TO KOLOM DO BEGIN FOR J := 1 TO BARIS DO BEGIN
GOTOXY (J * 8 - 7, (I * 3)); WRITE('____');
GOTOXY (J * 8 - 7, (I * 3 + 1)); WRITE('|        |');
GOTOXY (J * 8 - 7, (I * 3 + 2)); WRITE('____');
END;
END;
END;
PROCEDURE WIZARD7;
BEGIN
CLRSCR;
WRITELN('ANGKA YANG ANDA PILIH = ', NILAI);
WRITELN;
WRITE('INGIN MENGULANG (Y/ESC.)? ');READKEY; YT := READKEY;
END;
PROCEDURE WIZARD6;
BEGIN
BIKIN_KOTAK(2, 10);
FOR I := 1 TO 19 DO TULIS(I, CSTR(I + 31));
GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T', #27];
IF UPCASE(YT) = 'Y' THEN NILAI := NILAI + 32; WIZARD7; {===============================}
END;
PROCEDURE WIZARD5;
BEGIN
BIKIN_KOTAK(2, 10);
FOR I := 1 TO 16 DO TULIS(I, CSTR(I + 15));
  FOR J := 17 TO 19 DO TULIS (J, CSTR(J + 31));
  GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T', #27]; {===============================}
IF UPCASE(YT) = 'Y' THEN NILAI := NILAI + 16; WIZARD6;
END;
PROCEDURE WIZARD4;
BEGIN BIKIN_KOTAK(3, 10);
FOR J := 0 TO 2 DO FOR I := 1 TO 8 DO TULIS(J * 8 + I, CSTR(J * 16 + I + 7));
GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T', #27];
IF UPCASE(YT) = 'Y' THEN NILAI := NILAI + 8; WIZARD5;  {===============================}
END;
PROCEDURE WIZARD3;
BEGIN
BIKIN_KOTAK(3, 10);
FOR J := 0 TO 5 DO FOR I := 1 TO 4 DO TULIS(J * 4 + I, CSTR(J * 8 + I + 3));
GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T'];
IF UPCASE(YT) = 'Y' THEN NILAI := NILAI + 4; WIZARD4; {===============================} END;
PROCEDURE WIZARD2;
BEGIN
BIKIN_KOTAK(3, 10); J:=0;
FOR J := 0 TO 12 DO FOR I := 1 TO 2 DO TULIS(J * 2 + I, CSTR(J * 4 + I + 1));
GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T', #27];
IF UPCASE(YT) = 'Y' THEN NILAI := NILAI + 2; WIZARD3; {===============================} END;
PROCEDURE WIZARD1;
BEGIN
BIKIN_KOTAK(3, 10); L:= 1;
REPEAT TULIS ((L + 1) DIV 2,CSTR(L)); L:= L + 2; UNTIL L > 50;
GOTOXY (5, 15); WRITE('APAKAH ANGKA YANG ANDA PILIH', ' ADA PADA DERETAN ANGKA DI ATAS (Y/T) ');
REPEAT YT := READKEY; UNTIL YT IN ['y', 'Y', 't', 'T', #27];
IF UPCASE(YT) = 'Y' THEN NILAI := 1; WIZARD2; {===============================}
END;
PROCEDURE TULIS_NOMOR;
BEGIN BIKIN_KOTAK(5, 10);
FOR K:= 1 TO 50 DO TULIS(K, CSTR(K));
GOTOXY(1, 20); WRITE ('PILIH SEBUAH ANGKA, ', 'TEKAN: Y, KALO MAU TERUS! '); WRITE ('TEKAN ESC UNTUK KELUAR ');
REPEAT YT := READKEY; IF UPCASE(YT) = 'Y' THEN
BEGIN
NILAI := 0; WIZARD1;
END;
UNTIL YT IN ['y', 'Y', 't', 'T', #27]; {===============================}
END;
(* Program Utama *)
BEGIN
CLRSCR;
TEXTATTR := $1F; REPEAT TULIS_NOMOR; UNTIL YT = #27;
END.





Komentar

Postingan Populer