Rabu, 12 Desember 2018

EAS PWEB C

Nama : Christine Amelia
NRP   : 05111740000174
Kelas : PWEB C
Link : ppdbonlinepweb.000webhostapp.com

MEMBUAT PPDB ONLINE

1. Database:


2. Interface:
Tampilan halaman login



Tampilan halaman register

Tampilan halaman jika berhasil login


Tampilan halaman pengisian form


Tampilan halaman untuk mendownload formulir



3. Sourcecode

  • connect.php
  <?php   
  $server = "localhost";   
  $user = "root";   
  $password = "1103199901";   
  $nama_database = "pendaftaran_calonsiswa";   
  $db = mysqli_connect($server, $user, $password , $nama_database);   
  if(!$db){   
   die("Gagal terhubung dengan database: " . mysqli_connect_error());   
  }   
  ?>   

  • opening.php
  <!DOCTYPE html>    
  <html>    
  <head>    
  </head>    
  <style type="text/css">    
   ul{    
   display:table; margin:0 auto;    
   }    
   body {    
   background-color: #f5ffdc;    
   }    
  </style>    
  <body>    
   <header>    
   <h1 align="center">Pendaftaran Siswa Baru Kota Batam</h3>    
   <h3 align="center">Tingkat Sekolah Menengah Atas</h1>    
   </header>    
   <h4 align="center">Menu</h4>    
   <nav>    
   <ul>    
    <li><a href="form-daftarr.php">Isi Formulir</a></li>    
    <li><a href="list-siswa.php">Edit/Hapus</a></li>    
    <li><a href="downloadd.php">Lihat Formulir</a></li>    
   </ul>    
   </nav>    
   </body>    
  </html>    

  • signin.php
 <?php    
  session_start();    
  // initializing variables   
  $email = "";  
  $username = "";   
  $errors = array();    
  // connect to the database    
  $db = mysqli_connect('localhost', 'root', '1103199901', 'pendaftaran_calonsiswa');    
  // REGISTER USER    
  if (isset($_POST['daftar'])) {    
  // receive all input values from the form    
   $email = mysqli_real_escape_string($db, $_POST['email']);  
  $username = mysqli_real_escape_string($db, $_POST['username']);     
  $password1 = mysqli_real_escape_string($db, $_POST['password1']);    
  $password2 = mysqli_real_escape_string($db, $_POST['password2']);    
  // form validation: ensure that the form is correctly filled ...    
  // by adding (array_push()) corresponding error unto $errors array    
  if (empty($username)) { array_push($errors, "Username is required"); }    
  if (empty($email)) { array_push($errors, "Email is required"); }    
  if (empty($password1)) { array_push($errors, "Password is required"); }    
  if ($password1 != $password2) {    
   array_push($errors, "The two passwords does not match");    
  }    
  $user_check_query = "SELECT * FROM users WHERE email='$email' OR username='$username' LIMIT 1";    
  $result = mysqli_query($db, $user_check_query);    
  $user = mysqli_fetch_assoc($result);    
  if ($user) {    
   if ($user['email'] === $email) {    
   array_push($errors, "email is already exists");    
   }   
   if ($user['username'] === $username) {    
   array_push($errors, "Username is already exists");    
   }    
  }    
  if (count($errors) == 0) {    
    $password = md5($password1);   
    $query = "INSERT INTO users (username, email, password)    
      VALUES('$email', '$username', '$password')";    
    mysqli_query($db, $query);    
    $_SESSION['username'] = $username;    
    $_SESSION['success'] = "You are now logged in";    
    header('location: indexx.php');    
  }    
  }    
  // ...    
  if (isset($_POST['submit'])) {    
  $username = mysqli_real_escape_string($db, $_POST['username']);    
  $password = mysqli_real_escape_string($db, $_POST['password']);    
  if (empty($username)) {    
    array_push($errors, "Username is required");    
  }    
  if (empty($password)) {    
    array_push($errors, "Password is required");    
  }    
  if (count($errors) == 0) {    
    $password = md5($password);    
    $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";    
    $results = mysqli_query($db, $query);    
    if (mysqli_num_rows($results) == true) {    
    $_SESSION['username'] = $username;    
    $_SESSION['success'] = "You are now logged in";    
    header('location: indexx.php');    
    }else {    
     array_push($errors, "Wrong username/password combination");    
    }    
  }    
  }    
  ?>    

  • login.php
 <?php   
  include "connect.php";   
  session_start();   
  if (isset($_SESSION['username'])){   
  header ("location:indexx.php");   
  }   
  ?>   
  <html>   
  <head>   
  <title>PENDAFTARAN SISWA BARU KOTA BATAM</title>    
  <link rel="stylesheet" type="text/css" href="style.css">    
  </head>   
  <body style="text-align: center;">   
  <form method="post" name="login" action="signin.php">   
  <table border=0 align="center" cellpadding=5 cellspacing=0>   
  <tr>   
  <h1>Pendaftaran Siswa Baru Kota Batam</h1>   
  <div class="header">   
  <td colspan=3><center><font size=5>LOGIN</font></center></td>   
  </div>   
  </tr>   
  <tr>   
  <td>Username</td>   
  <td>:</td>   
  <td><input type="text" name="username"></td>   
  </tr>   
  <tr>   
  <td>Password</td>   
  <td>:</td>   
  <td><input type="password" name="password"></td>   
  </tr>   
  <tr>   
  <td colspan=2></td>   
  <td><input type="submit" name="submit" value="LOGIN"></td>   
  </tr>   
  <tr>   
  <td> Belum Mendaftar? Klik </td>   
  <td colspan=3><a href="daftar-baru.php">DAFTAR</a></td>   
  </tr>   
  </table>   
  </form>   
  </body>   
  </html>   

  • indexx.php
  <?php    
  session_start();    
  if (!isset($_SESSION['username'])) {    
    $_SESSION['msg'] = "You must log in first";    
    header('location: login.php');    
  }    
  if (isset($_GET['logout'])) {    
    session_destroy();    
    unset($_SESSION['username']);    
    header("location: login.php");    
  }    
  ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
   <title>Home</title>    
  <link rel="stylesheet" type="text/css" href="style.css">      
  </head>    
  <body>    
  <div class="header">    
   <h2>Home Page</h2>    
  </div>    
  <div class="content">    
    <!-- notification message -->    
    <?php if (isset($_SESSION['success'])) : ?>    
   <div class="error success" >    
    <h3>    
   <?php    
     echo $_SESSION['success'];    
     unset($_SESSION['success']);    
   ?>    
    </h3>    
   </div>    
    <?php endif ?>    
   <!-- logged in user information -->    
   <?php if (isset($_SESSION['username'])) : ?>    
    <p>Welcome <strong><?php echo $_SESSION['username']; ?></strong></p>    
   <p> <a href="opening.php" style="color: red;">Fill The Formulir</a> </p>    
    <p> <a href="indexx.php?logout='1'" style="color: red;">Logout</a> </p>    
   <?php endif ?>    
  </div>    
  </body>    
  </html>    

  • daftar-baru.php
 <?php include('signin.php') ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
  <title>Formulir Pendaftaran Siswa Baru 2019 Kota Batam</title>    
  <link rel="stylesheet" type="text/css" href="style.css">    
  </head>    
  <body>    
  <div class="header">    
    <h2>Register</h2>    
  </div>    
  <form method="post" action="daftar-baru.php">    
    <?php include('errors.php'); ?>    
       <div class="input-group">    
    <label>Email</label>    
    <input type="email" name="email" value="<?php echo $email; ?>">    
    </div>   
    <div class="input-group">    
    <label>Username</label>    
    <input type="text" name="username" value="<?php echo $username; ?>">    
    </div>     
    <div class="input-group">    
    <label>Password</label>    
    <input type="password" name="password1">    
    </div>    
    <div class="input-group">    
    <label>Confirm password</label>    
    <input type="password" name="password2">    
    </div>    
    <div class="input-group">    
    <button type="submit" class="btn" name="daftar">Register</button>    
    </div>    
    <p>    
     Already a member? <a href="login.php">Sign in</a>    
    </p>    
  </form>    
  </body>    
  </html>    

  • form-daftarr.php
 <?php include('signin.php') ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
  <title>Formulir Pendaftaran Siswa Baru 2019 Kota Batam</title>    
  <link rel="stylesheet" type="text/css" href="style.css">    
  </head>    
  <body>    
  <div class="header">    
    <h2>Register</h2>    
  </div>    
  <form method="post" action="daftar-baru.php">    
    <?php include('errors.php'); ?>    
       <div class="input-group">    
    <label>Email</label>    
    <input type="email" name="email" value="<?php echo $email; ?>">    
    </div>   
    <div class="input-group">    
    <label>Username</label>    
    <input type="text" name="username" value="<?php echo $username; ?>">    
    </div>     
    <div class="input-group">    
    <label>Password</label>    
    <input type="password" name="password1">    
    </div>    
    <div class="input-group">    
    <label>Confirm password</label>    
    <input type="password" name="password2">    
    </div>    
    <div class="input-group">    
    <button type="submit" class="btn" name="daftar">Register</button>    
    </div>    
    <p>    
     Already a member? <a href="login.php">Sign in</a>    
    </p>    
  </form>    
  </body>    
  </html>    

  • form-edit.php
  <?php    
  include("connect.php");    
  // kalau tidak ada id di query string    
  if( !isset($_GET['id']) ){    
   header('Location: list-siswa.php');    
  }    
  //ambil id dari query string    
  $id = $_GET['id'];    
  // buat query untuk ambil data dari database    
  $sql = "SELECT * FROM calon_siswa WHERE id=$id";    
  $query = mysqli_query($db, $sql);    
  $siswa = mysqli_fetch_assoc($query);    
  // jika data yang di-edit tidak ditemukan    
  if( mysqli_num_rows($query) < 1 ){    
   die("data tidak ditemukan...");    
  }    
  ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
   <title>Formulir Pendaftaran Siswa Kota Batam</title>   
  <style type="text/css">    
   body {    
   background-color: #f5ffdc;    
   }    
   fieldset{    
   background-color: #f5ffdc;    
   }    
   </style>     
  </head>    
  <body>    
   <header>    
   <h3>Formulir Pendaftaran Siswa Baru 2019 Kota Batam</h3>    
   </header>    
   <form action="proses-edit.php" method="POST">    
   <fieldset>    
    <input type="hidden" name="id" value="<?php echo $siswa['id'] ?>" />    
   <p>    
    <label for="nama">Nama: </label>    
    <input type="text" name="nama" placeholder="nama lengkap" value="<?php echo $siswa['nama'] ?>" />    
   </p>    
    <p>    
    <label for="tempat_lahir">Tempat Lahir: </label>    
    <input type="text" name="tempat_lahir" placeholder="tempat lahir" value="<?php echo $siswa['tempat_lahir'] ?>"/>    
   </p>    
     <p>    
    <label for="tanggal_lahir">Tanggal Lahir(dd/mm/yyyy): </label>    
    <input type="text" name="tgl_lahir" placeholder="tanggal_lahir" value="<?php echo $siswa['tgl_lahir'] ?>"/>    
     </p>      
   <p>    
    <label for="alamat">Alamat: </label>    
    <textarea name="alamat"><?php echo $siswa['alamat'] ?></textarea>    
   </p>    
   <p>    
    <label for="jenis_kelamin">Jenis Kelamin: </label>    
    <?php $jk = $siswa['jenis_kelamin']; ?>    
    <label><input type="radio" name="jenis_kelamin" value="laki-laki" <?php echo ($jk == 'laki-laki') ? "checked": "" ?>> Laki-laki</label>    
    <label><input type="radio" name="jenis_kelamin" value="perempuan" <?php echo ($jk == 'perempuan') ? "checked": "" ?>> Perempuan</label>    
   </p>    
   <p>    
    <label for="agama">Agama: </label>    
    <?php $agama = $siswa['agama']; ?>    
    <select name="agama">    
    <option <?php echo ($agama == 'Buddha') ? "selected": "" ?>>Buddha</option>    
    <option <?php echo ($agama == 'Hindu') ? "selected": "" ?>>Hindu</option>    
    <option <?php echo ($agama == 'Islam') ? "selected": "" ?>>Islam</option>    
    <option <?php echo ($agama == 'Katolik') ? "selected": "" ?>>Katolik</option>    
    <option <?php echo ($agama == 'Kristen') ? "selected": "" ?>>Kristen</option>    
    </select>    
   </p>    
   <p>    
    <label for="sekolah_asal">Sekolah Asal: </label>    
    <input type="text" name="sekolah_asal" placeholder="nama sekolah" value="<?php echo $siswa['sekolah_asal'] ?>" />    
   </p>   
  <p>    
    <label for="pilihan1">Pilihan 1: </label>    
    <select name="pilihan1">   
    <option>SMA Negeri 01 Batam</option>    
    <option>SMA Negeri 03 Batam</option>    
    <option>SMA Negeri 04 Batam</option>    
    <option>SMA Negeri 08 Batam</option>    
    <option>SMA Negeri 12 Batam</option>    
       <option>SMA Negeri 15 Batam</option>  
       <option>SMA Negeri 20 Batam</option>      
    </select>    
   </p>   
     <p>    
    <label for="pilihan2">Pilihan 2: </label>    
    <select name="pilihan2">    
    <option>SMA Negeri 01 Batam</option>    
    <option>SMA Negeri 03 Batam</option>    
    <option>SMA Negeri 04 Batam</option>    
    <option>SMA Negeri 08 Batam</option>    
    <option>SMA Negeri 12 Batam</option>    
       <option>SMA Negeri 15 Batam</option>  
       <option>SMA Negeri 20 Batam</option>       
    </select>    
   </p>    
      <p>  
      <label for="pilihan3">Pilihan 3: </label>  
      <select name="pilihan3">  
       <option>SMA Negeri 01 Batam</option>    
    <option>SMA Negeri 03 Batam</option>    
    <option>SMA Negeri 04 Batam</option>    
    <option>SMA Negeri 08 Batam</option>    
    <option>SMA Negeri 12 Batam</option>    
       <option>SMA Negeri 15 Batam</option>  
       <option>SMA Negeri 20 Batam</option>   
      </select>  
      </p>       
   <p>    
    <input type="submit" value="Simpan" name="simpan" />    
   </p>    
   </fieldset>    
   </form>    
   </body>    
  </html>    

  • proses-daftar.php
  <?php    
  include("connect.php");    
  // cek apakah tombol daftar sudah diklik atau blum?    
  if(isset($_POST['daftar'])){    
   // ambil data dari formulir   
      $nik = $_POST['nik'];  
   $nama = $_POST['nama'];    
   $tempat_lahir = $_POST['tempat_lahir'];   
   $tanggal_lahir = $_POST['tgl_lahir'];   
   $alamat = $_POST['alamat'];    
   $jk = $_POST['jenis_kelamin'];    
   $agama = $_POST['agama'];    
   $sekolah = $_POST['sekolah_asal'];   
   $pilihan1 = $_POST['pilihan1'];    
   $pilihan2 = $_POST['pilihan2'];   
   $pilihan3 = $_POST['pilihan3'];        
   // buat query    
   $sql = "INSERT INTO calon_siswa (nik, nama, tempat_lahir, tgl_lahir, alamat, jenis_kelamin, agama, sekolah_asal, pilihan1, pilihan2, pilihan3) VALUE ('$nik', '$nama', '$tempat_lahir', '$tanggal_lahir', '$alamat', '$jk', '$agama', '$sekolah', '$pilihan1', '$pilihan2', '$pilihan3')";    
   $query = mysqli_query($db, $sql);    
   // apakah query simpan berhasil?    
   if( $query ) {    
   // kalau berhasil alihkan ke halaman index.php dengan status=sukses    
   header('Location: indexx.php?status=sukses');    
   } else {    
   // kalau gagal alihkan ke halaman indek.php dengan status=gagal    
   header('Location: indexx.php?status=gagal');    
   }    
  } else {    
   die("Akses dilarang...");    
  }    
  ?>    

  • proses-edit.php
 <?php    
  include("connect.php");    
  // cek apakah tombol simpan sudah diklik atau blum?    
  if(isset($_POST['simpan'])){    
   // ambil data dari formulir    
   $id = $_POST['id'];  
      $nik = $_POST['nik'];  
   $nama = $_POST['nama'];    
   $tempat_lahir = $_POST['tempat_lahir'];   
   $tanggal_lahir = $_POST['tgl_lahir'];   
   $alamat = $_POST['alamat'];    
   $jk = $_POST['jenis_kelamin'];    
   $agama = $_POST['agama'];    
   $sekolah = $_POST['sekolah_asal'];   
   $pilihan1 = $_POST['pilihan1'];    
   $pilihan2 = $_POST['pilihan2'];  
   $pilihan3 = $_POST['pilihan3']  
   // buat query update    
   $sql = "UPDATE calon_siswa SET nik='$nik',nama='$nama', tempat_lahir='$tempat_lahir', tgl_lahir='$tanggal_lahir', alamat='$alamat', jenis_kelamin='$jk', agama='$agama', sekolah_asal='$sekolah', pilihan1='$pilihan1', pilihan2='$pilihan2', pilihan3='$pilihan3' WHERE id=$id";    
   $query = mysqli_query($db, $sql);    
   // apakah query update berhasil?    
   if( $query ) {    
   // kalau berhasil alihkan ke halaman list-siswa.php    
   header('Location: list-siswa.php');    
   } else {    
   // kalau gagal tampilkan pesan    
   die("Gagal menyimpan perubahan...");    
   }    
  } else {    
   die("Akses dilarang...");    
  }    
  ?>    

  • list-siswa.php
  <?php include("connect.php"); ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
   <title>Formulir Pendaftaran Siswa Baru 2019 Kota Batam</title>    
  <style type="text/css">    
   body {    
   background-color: #f5ffdc;    
   }    
   fieldset{    
   background-color: #f5ffdc;    
   }    
   </style>     
  </head>    
  </style>    
  <body>    
   <header>    
   <h2 align="center">FORMULIR PENDAFTARAN SISWA BARU 2019 Kota Batam</h2>    
   <h3 align="center">TINGKAT SEKOLAH MENENGAH ATAS</h3>    
   </header>    
   <fieldset>    
   <p>    
   <?php    
   $sql = "SELECT * FROM calon_siswa";    
   $query = mysqli_query($db, $sql);    
   $siswa = mysqli_fetch_array($query);    
   echo "<p align='center'> FORMULIR PENDAFTARAN SISWA BARU 2019 Kota Batam</p>";    
   echo " <p align='center'> SEKOLAH MENENGAH ATAS </p>";    
   echo "<br />";    
   echo "<br />";    
   echo "<strong>ID</strong><br>";    
   echo $siswa['id']; echo "<br>";    
   echo "<br />";  
           echo "<strong>NIK</strong><br>";  
      echo $siswa['nik']; echo "<br>";    
   echo "<br />";  
   echo "<strong>Nama</strong><br>";    
   echo $siswa['nama']; echo "<br>";    
   echo "<br />";   
   echo "<strong>Tempat Lahir</strong><br>";    
   echo $siswa['tempat_lahir']; echo "<br>";    
   echo "<br />";   
   echo "<strong>Tanggal Lahir</strong><br>";    
   echo $siswa['tgl_lahir']; echo "<br>";    
   echo "<br />";   
   echo "<strong>Alamat</strong><br>";    
   echo $siswa['alamat']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Jenis Kelamin</strong><br>";    
   echo $siswa['jenis_kelamin']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Agama</strong><br>";    
   echo $siswa['agama']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Sekolah Asal</strong><br>";    
   echo $siswa['sekolah_asal']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Sekolah Pilihan 1</strong><br>";    
   echo $siswa['pilihan1']; echo "<br>";   
   echo "<strong>Sekolah Pilihan 2</strong><br>";    
   echo $siswa['pilihan2']; echo "<br>";   
      echo "<strong>Sekolah Pilihan 3</strong><br>";  
      echo $siswa['pilihan3']; echo "<br>";  
   echo "<br /></br>";    
   echo "<td>";    
   echo "<a href='form-edit.php?id=".$siswa['id']."'>Edit</a> | ";    
   echo "<a href='hapus.php?id=".$siswa['id']."'>Hapus</a>";    
   echo "</td>";    
   ?>    
   </p>    
  </html>    
  </body>    

  • style.php
 * {    
  margin: 1px;    
  padding: 1px;    
  }    
  body {    
  font-size: 120%;    
  background:#f5ffdc;    
  }    
  .header {    
  width: 20%;    
  margin: 50px auto 0px;    
  color: black;    
  background: #f5ffdc;    
  text-align: center;    
  border: 1px solid #B0C4DE;    
  border-bottom: none;    
  border-radius: 10px 10px 0px 0px;    
  padding: 20px;    
  }    
  form, .content {    
  width: 30%;    
  margin: 0px auto;    
  padding: 20px;    
  border: 1px solid #f5ffdc;    
  background: white;    
  border-radius: 0px 0px 10px 10px;    
  }    
  .input-group {    
  margin: 10px 0px 10px 0px;    
  }    
  .input-group label {    
  display: block;    
  text-align: left;    
  margin: 3px;    
  }    
  .input-group input {    
  height: 30px;    
  width: 93%;    
  padding: 5px 10px;    
  font-size: 16px;    
  border-radius: 5px;    
  border: 1px solid gray;    
  }    
  .btn {    
  padding: 10px;    
  font-size: 15px;    
  color: black;    
  background: #FFF8DC;    
  border: none;    
  border-radius: 5px;    
  }    
  .error {    
  width: 92%;    
  margin: 0px auto;    
  padding: 10px;    
  border: 1px solid #FFF8DC;    
  color: #a94442;    
  background: #f2dede;    
  border-radius: 5px;    
  text-align: left;    
  }    
  }    

  • unduh.php
 <?php    
  //export.php    
  $connect = mysqli_connect("localhost", "root", "1103199901", "pendaftaran_calonsiswa");    
  $output = '';    
  if(isset($_POST["download"]))    
  {    
  $query = "SELECT * FROM calon_siswa";    
  $result = mysqli_query($connect, $query);    
  if(mysqli_num_rows($result) > 0)    
  {    
  $output .= '    
   <table class="table" bordered="1">    
     <tr>    
           <th>nik</th>  
     <th>nama</th>   
          <th>tempat_lahir</th>   
          <th>tgl_lahir</th>           
     <th>alamat</th>    
     <th>jenis_kelamin</th>    
     <th>agama</th>    
     <th>sekolah_asal</th>    
     <th>pilihan1</th>    
          <th>pilihan2</th>  
                      <th>pilihan3</th>  
     </tr>    
  ';    
  while($row = mysqli_fetch_array($result))    
  {    
   $output .= '    
   <tr>     
            <td>'.$row["nik"].'</td>  
     <td>'.$row["nama"].'</td>   
          <td>'.$row["tempat_lahir"].'</td>   
          <td>'.$row["tgl_lahir"].'</td>   
     <td>'.$row["alamat"].'</td>    
     <td>'.$row["jenis_kelamin"].'</td>    
     <td>'.$row["agama"].'</td>    
     <td>'.$row["sekolah_asal"].'</td>    
     <td>'.$row["pilihan1"].'</td>   
          <td>'.$row["pilihan2"].'</td>  
                      <td>'.$row["pilihan3"].'</td>  
     </tr>    
   ';    
  }    
  $output .= '</table>';    
  header('Content-Type: application/xls');    
  header('Content-Disposition: attachment; filename=download.xls');    
  echo $output;    
  }    
  }    
  ?>    

  • download.php
  <?php include("connect.php"); ?>    
  <!DOCTYPE html>    
  <html>    
  <head>    
   <title>Formulir Pendaftaran Online Siswa Baru Kota Batam</title>   
  <style type="text/css">    
   body {    
   background-color: #87CEEB;    
   }    
   fieldset{    
   background-color: #f5ffdc;    
   }    
   </style>     
  </head>    
  </style>    
  <body>    
   <header>    
   <h2 align="center">FORMULIR PENDAFTARAN ONLINE SISWA BARU KOTA BATAM</h2>    
   <h3 align="center">SEKOLAH MENENGAH ATAS</h3>    
   </header>    
   <div class="login">    
   <fieldset>    
   <p>    
   <?php    
   $sql = "SELECT * FROM calon_siswa";    
   $query = mysqli_query($db, $sql);    
   $siswa = mysqli_fetch_array($query);    
   echo "<p align='center'> FORMULIR PENDAFTARAN ONLINE SISWA BARU 2019 KOTA BATAM</p>";    
   echo " <p align='center'> SEKOLAH MENENGAH ATAS</p>";    
   echo "<br />";    
   echo "<br />";     
     echo "<strong>NIK</strong><br>";    
   echo $siswa['nik']; echo "<br>";      
   echo "<br />";    
   echo "<strong>Nama</strong><br>";    
   echo $siswa['nama']; echo "<br>";    
   echo "<br />";    
     echo "<strong>Tempat Lahir</strong><br>";    
   echo $siswa['tempat_lahir']; echo "<br>";    
   echo "<br />";      
     echo "<strong>Tanggal Lahir</strong><br>";    
   echo $siswa['tgl_lahir']; echo "<br>";    
   echo "<br />";      
   echo "<strong>Alamat</strong><br>";    
   echo $siswa['alamat']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Jenis Kelamin</strong><br>";    
   echo $siswa['jenis_kelamin']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Agama</strong><br>";    
   echo $siswa['agama']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Sekolah Asal</strong><br>";    
   echo $siswa['sekolah_asal']; echo "<br>";    
   echo "<br />";    
   echo "<strong>Sekolah Pilihan 1</strong><br>";    
   echo $siswa['pilihan1'];     echo "<br>";    
   echo "<br />";   
   echo "<strong>Sekolah Pilihan 2</strong><br>";    
   echo $siswa['pilihan2']; echo "<br>";   
      echo "<br />";  
      echo "<strong>Sekolah Pilihan 3</strong><br>";  
      echo $siswa['pilihan3']; echo "<br>";  
   ?>    
   </p>    
   <form method="post" action="unduh.php">    
   <input type="submit" name="download" class="btn btn-success" value="Download" />    
  </html>    
  </body>    

  • errors.php
  <?php if (count($errors) > 0) : ?>    
  <div class="error">    
    <?php foreach ($errors as $error) : ?>    
    <p><?php echo $error ?></p>    
    <?php endforeach ?>    
  </div>    
  <?php endif ?>   

Senin, 10 Desember 2018

UAS PBO B

MEMBUAT IMAGE EDITOR

1. Gambarkan rancangan interfacenya.


2. Gambarkan dan jelaskan Class Diaram penyusun dari image viewer yang akan dibuat.
  • Image viewer : Class utama dari image editor.
  • Image panel : mengatur letak letak panel yang akan dibentuk dari OFImage
  • OFImage : Class yang mendefinisikan gambar kedalam format OF (Object First)
  • File Manager : mengatur pengelolaan file seperti membuka file dan menyimpan file.
  • Filter : untuk menambah efek-efek yang disediakan terhadap gambar. Terdiri atas 3 filter yaitu Grayscale (hitam-putih), Mirror (Pencerminan), dan Darker (Menggelapkan).
3. Implementasikan ke dalam program.

  • Class ImageFileManager
 import java.awt.image.*;   
 import javax.imageio.*;   
 import java.io.*;  
 /**  
  * Membuat Image Editor  
  *   
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class ImageFileManager  
 {  
   // A constant for the image format that this writer uses for writing.    
   // Available formats are "jpg" and "png".    
   private static final String IMAGE_FORMAT = "jpg";    
   /**    
   * Read an image file from disk and return it as an image. This method    
   * can read JPG and PNG file formats. In case of any problem (e.g the file    
   * does not exist, is in an undecodable format, or any other read error)    
   * this method returns null.    
   *    
   * @param imageFile The image file to be loaded.    
   * @return  The image object or null is it could not be read.    
   */    
   public static OFImage loadImage(File imageFile)    
   {    
     try   
     {    
       BufferedImage image = ImageIO.read(imageFile);    
       if(image == null || (image.getWidth(null) < 0))   
       {    
         // we could not load the image - probably invalid file format    
         return null;    
       }    
       return new OFImage(image);    
     }    
     catch(IOException exc)   
     {    
       return null;    
     }    
   }    
   public static void saveImage(OFImage image, File file)    
   {    
     try   
     {    
      ImageIO.write(image, IMAGE_FORMAT, file);    
     }    
     catch(IOException exc)   
     {    
       return;    
     }    
   }   
 }  

  • Class ImagePanel
 import java.awt.image.*;  
 import java.awt.*;   
 import javax.swing.*;  
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class ImagePanel extends JComponent  
 {   
   private int width, height;    
   // An internal image buffer that is used for painting. For    
   // actual display, this image buffer is then copied to screen.    
   private OFImage panelImage;     
   //Create a new, empty ImagePanel.     
   public ImagePanel()    
   {    
     width = 350; // arbitrary size for empty panel    
     height = 250;    
     panelImage = null;    
   }   
   // Set the image that this panel should show.     
   public void setImage(OFImage image)    
   {    
     if(image != null)   
     {    
      width = image.getWidth();    
      height = image.getHeight();    
      panelImage = image;    
      repaint();    
     }    
   }   
   // Clear the image on this panel.    
   public void clearImage()    
   {    
     Graphics imageGraphics = panelImage.getGraphics();    
     imageGraphics.setColor(Color.LIGHT_GRAY);    
     imageGraphics.fillRect(0, 0, width, height);    
     repaint();    
   }    
   // The following methods are redefinitions of methods    
   // inherited from superclasses.    
   /**    
   * Tell the layout manager how big we would like to be.    
   * (This method gets called by layout managers for placing    
   * the components.)    
   *    
   * @return The preferred dimension for this component.    
   */    
   public Dimension getPreferredSize()    
   {    
     return new Dimension(width, height);    
   }    
   /**    
   * This component needs to be redisplayed. Copy the internal image    
   * to screen. (This method gets called by the Swing screen painter    
   * every time it want this component displayed.)    
   *    
   * @param g The graphics context that can be used to draw on this component.    
   */    
   public void paintComponent(Graphics g)    
   {    
     Dimension size = getSize();    
     g.clearRect(0, 0, size.width, size.height);    
     if(panelImage != null)   
     {    
       g.drawImage(panelImage, 0, 0, null);    
     }    
   }    
 }  

  • Class OFImage
 import java.awt.*;   
 import java.awt.image.*;   
 import javax.swing.*;  
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class OFImage extends BufferedImage  
 {   
   public OFImage(BufferedImage image)    
   {    
     super(image.getColorModel(), image.copyData(null), image.isAlphaPremultiplied(), null);    
   }    
   public OFImage(int width, int height)    
   {    
     super(width, height, TYPE_INT_RGB);    
   }    
   public void setPixel(int x, int y, Color col)    
   {    
     int pixel = col.getRGB();    
     setRGB(x, y, pixel);    
   }    
   public Color getPixel(int x, int y)    
   {    
     int pixel = getRGB(x, y);    
     return new Color(pixel);    
   }    
   // Make this image a bit darker.     
   public void darker()    
   {    
     int height = getHeight();    
     int width = getWidth();    
     for(int y = 0; y < height; y++)   
     {    
       for(int x = 0; x < width; x++)   
       {    
         setPixel(x, y, getPixel(x, y).darker());    
       }    
     }    
   }    
   // Make this image a bit lighter.     
   public void lighter()    
   {    
     int height = getHeight();    
     int width = getWidth();    
     for(int y = 0; y < height; y++)   
     {    
       for(int x = 0; x < width; x++)   
       {    
         setPixel(x, y, getPixel(x, y).brighter());    
       }    
     }    
   }   
   /**    
   * Perform a three level threshold operation.    
   * That is: repaint the image with only three color values:    
   *  white, gray, and black.    
   */    
   public void threshold()    
   {    
     int height = getHeight();    
     int width = getWidth();    
     for(int y = 0; y < height; y++)   
     {    
       for(int x = 0; x < width; x++)   
       {    
         Color pixel = getPixel(x, y);    
         int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3;    
         if(brightness <= 85)   
         {    
          setPixel(x, y, Color.BLACK);    
         }    
         else if(brightness <= 170)   
         {    
           setPixel(x, y, Color.GRAY);    
         }    
         else   
         {    
           setPixel(x, y, Color.WHITE);    
         }    
       }    
     }    
   }    
 }  

  • Class Filter
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public abstract class Filter  
 {  
   private String name;    
   public Filter(String name)   
   {   
     this.name = name;   
   }   
   public String getName()   
   {   
     return name;   
   }   
   // Apply this filter to an image.   
   public abstract void apply(OFImage image);  
 }  

  • Class DarkerFilter
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class DarkerFilter extends Filter  
 {   
   public DarkerFilter(String name)   
   {   
     super(name);   
   }   
   // Apply this filter to an image.   
   public void apply(OFImage image)   
   {   
     int height = image.getHeight();   
     int width = image.getWidth();   
     for(int y = 0; y < height; y++)   
     {   
       for(int x = 0; x < width; x++)   
       {   
         image.setPixel(x, y, image.getPixel(x, y).darker());   
       }   
     }   
   }   
 }  

  • Class MirrorFilter
 import java.awt.Color;  
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class MirrorFilter extends Filter  
 {  
   public MirrorFilter(String name)   
   {   
     super(name);   
   }   
   // Apply this filter to an image.    
   public void apply(OFImage image)   
   {   
    int height = image.getHeight();   
    int width = image.getWidth();   
    for(int y = 0; y < height; y++)   
    {   
      for(int x = 0; x < width / 2; x++)   
      {   
        Color left = image.getPixel(x, y);   
        image.setPixel(x, y, image.getPixel(width - 1 - x, y));   
        image.setPixel(width - 1 - x, y, left);   
      }   
    }   
   }   
 }  

  • Class GrayScaleFilter
 import java.awt.Color;   
 /**  
  * Membuat Image Editor  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class GrayScaleFilter extends Filter  
 {   
   public GrayScaleFilter(String name)   
   {   
     super(name);   
   }   
   // Apply this filter to an image.   
   public void apply(OFImage image)   
   {   
     int height = image.getHeight();   
     int width = image.getWidth();   
     for(int y = 0; y < height; y++)   
     {   
       for(int x = 0; x < width; x++)   
       {   
         Color pix = image.getPixel(x, y);   
         int avg = (pix.getRed() + pix.getGreen() + pix.getBlue()) / 3;   
         image.setPixel(x, y, new Color(avg, avg, avg));   
       }   
     }   
   }   
 }  

  • Class ImageViewer
 import java.awt.*;  
 import java.awt.event.*;  
 import java.awt.image.*;  
 import java.awt.Graphics;  
 import java.awt.Image;  
 import java.awt.image.BufferedImage;  
 import javax.swing.*;  
 import javax.swing.border.*;  
 import java.util.ArrayList;  
 import java.util.List;  
 import java.util.Iterator;  
 import java.io.File;  
 /**  
  * Membuat Image Editor  
  * Main class  
  *  
  * @author (Christine Amelia)  
  * @version (UAS PBO B)  
  */  
 public class ImageViewer  
 {  
   private static final String VERSION = "Version 3.1";  
   private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));  
   private JFrame frame;  
   private ImagePanel imagePanel;  
   private JButton textButton;  
   private JButton zoominButton;  
   private JButton zoomoutButton;  
   private JButton cropButton;  
   private JButton rotate1Button;  
   private JButton rotate2Button;  
   private JLabel filenameLabel;  
   private JLabel statusLabel;  
   private OFImage currentImage;  
   private List<Filter> filters;  
   public ImageViewer()  
   {  
     currentImage = null;  
     filters = createFilters();  
     makeFrame();  
   }  
   private void makeText()  
   {  
     if(currentImage !=null)  
     {  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       String addText = JOptionPane.showInputDialog("Type something");  
       float fontSize = Float.parseFloat(JOptionPane.showInputDialog("Font Size"));  
       int xPosition = Integer.parseInt(JOptionPane.showInputDialog("X Position"));  
       int yPosition = Integer.parseInt(JOptionPane.showInputDialog("Y Position"));  
       OFImage newImage = new OFImage(width,height);  
       for(int y = 0; y < height; y++)   
       {    
         for(int x = 0; x < width; x++)   
         {    
           Color col = currentImage.getPixel(x, y);    
           newImage.setPixel(x, y, col);    
         }   
       }  
       Graphics g = newImage.getGraphics();    
       g.setFont(g.getFont().deriveFont(fontSize));    
       g.drawString(addText, xPosition, yPosition);    
       g.dispose();    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);   
     }  
   }  
   private void openFile()    
   {    
     int returnVal = fileChooser.showOpenDialog(frame);    
     if(returnVal != JFileChooser.APPROVE_OPTION)   
     {    
       return;    
     }    
     File selectedFile = fileChooser.getSelectedFile();    
     currentImage = ImageFileManager.loadImage(selectedFile);    
     if(currentImage == null)   
     {    
       JOptionPane.showMessageDialog(frame,    
       "The file was not in a recognized image file format.",    
       "Image Load Error",    
       JOptionPane.ERROR_MESSAGE);    
       return;    
     }    
     imagePanel.setImage(currentImage);    
     setButtonsEnabled(true);    
     showFilename(selectedFile.getPath());    
     showStatus("File loaded.");    
     frame.pack();    
   }  
   private void close()  
   {    
     currentImage = null;    
     imagePanel.clearImage();    
     showFilename(null);    
     setButtonsEnabled(false);    
   }  
   private void saveAs()    
   {    
     if(currentImage != null)   
     {    
       int returnVal = fileChooser.showSaveDialog(frame);    
       if(returnVal != JFileChooser.APPROVE_OPTION)   
       {    
         return;    
       }    
       File selectedFile = fileChooser.getSelectedFile();    
       ImageFileManager.saveImage(currentImage, selectedFile);    
       showFilename(selectedFile.getPath());    
     }    
   }  
   private void quit()    
   {    
     System.exit(0);    
   }   
   private void applyFilter(Filter filter)    
   {    
     if(currentImage != null)   
     {    
       filter.apply(currentImage);    
       frame.repaint();    
       showStatus("Applied: " + filter.getName());    
     }    
     else   
     {    
       showStatus("No image loaded.");    
     }    
   }    
   private void showAbout()    
   {    
     JOptionPane.showMessageDialog(frame,"ImageViewer\n" + VERSION,"About ImageViewer", JOptionPane.INFORMATION_MESSAGE);    
   }  
   private void makeZoomIn()    
   {    
     if(currentImage != null)   
     {    
       int width = currentImage.getWidth();    
       int height = currentImage.getHeight();    
       OFImage newImage = new OFImage(width * 2, height * 2);    
       for(int y = 0; y < height; y++)   
       {    
         for(int x = 0; x < width; x++)   
         {    
           Color col = currentImage.getPixel(x, y);    
           newImage.setPixel(x * 2, y * 2, col);    
           newImage.setPixel(x * 2 + 1, y * 2, col);    
           newImage.setPixel(x * 2, y * 2 + 1, col);    
           newImage.setPixel(x * 2+1, y * 2 + 1, col);    
         }    
       }    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);    
       frame.pack();    
     }    
   }    
   private void makeZoomOut()    
   {    
     if(currentImage != null)   
     {    
       int width = currentImage.getWidth() / 2;    
       int height = currentImage.getHeight() / 2;    
       OFImage newImage = new OFImage(width, height);    
       for(int y = 0; y < height; y++)   
       {    
         for(int x = 0; x < width; x++)   
         {    
           newImage.setPixel(x, y, currentImage.getPixel(x * 2, y * 2));    
         }    
       }    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);    
       frame.pack();    
     }    
   }    
   private void crop()    
   {    
     if (currentImage != null)    
     {    
       int width = currentImage.getWidth();    
       int height = currentImage.getWidth();    
       int xAwal = Integer.parseInt(JOptionPane.showInputDialog("x.akhir"));    
       int yAwal = Integer.parseInt(JOptionPane.showInputDialog("y.akhir"));    
       int xAkhir = Integer.parseInt(JOptionPane.showInputDialog("x.awal"));    
       int yAkhir = Integer.parseInt(JOptionPane.showInputDialog("y.awal"));    
       OFImage newImage = new OFImage(xAkhir - xAwal, yAkhir - yAwal);    
       for (int y = 0; y < yAkhir - yAwal; y++)    
       {    
         for (int x = 0; x < xAkhir - xAwal; x++)    
         {    
           newImage.setPixel(x, y, currentImage.getPixel(x + xAwal, y + yAwal));    
         }    
       }    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);    
       frame.pack();    
     }    
   }    
   private void showFilename(String filename)    
   {    
     if(filename == null)   
     {    
       filenameLabel.setText("No file displayed.");    
     }    
     else   
     {    
       filenameLabel.setText("File: " + filename);    
     }    
   }    
   private void showStatus(String text)    
   {    
     statusLabel.setText(text);    
   }    
   private void setButtonsEnabled(boolean status)    
   {    
     zoominButton.setEnabled(status);    
     zoomoutButton.setEnabled(status);    
     cropButton.setEnabled(status);    
     rotate1Button.setEnabled(status);    
     rotate2Button.setEnabled(status);     
   }    
   private List<Filter> createFilters()    
   {    
     List<Filter> filterList = new ArrayList<Filter>();    
     filterList.add(new DarkerFilter("Darker"));      
     filterList.add(new MirrorFilter("Mirror"));    
     filterList.add(new GrayScaleFilter("Grayscale"));    
     return filterList;    
   }    
   private void makeFrame()    
   {    
     frame = new JFrame("ImageViewer");    
     JPanel contentPane = (JPanel)frame.getContentPane();    
     contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));    
     makeMenuBar(frame);    
     contentPane.setLayout(new BorderLayout(6, 6));    
     imagePanel = new ImagePanel();    
     imagePanel.setBorder(new EtchedBorder());    
     contentPane.add(imagePanel, BorderLayout.CENTER);    
     filenameLabel = new JLabel();    
     contentPane.add(filenameLabel, BorderLayout.NORTH);    
     statusLabel = new JLabel(VERSION);    
     contentPane.add(statusLabel, BorderLayout.SOUTH);    
     JPanel toolbar = new JPanel();    
     toolbar.setLayout(new GridLayout(0, 1));    
     textButton = new JButton("Add Text");    
     textButton.addActionListener(new ActionListener()   
     {    
       public void actionPerformed(ActionEvent e)   
       {   
         makeText();  
       }    
     });  
     toolbar.add(textButton);    
     zoominButton = new JButton("Zoom In");    
     zoominButton.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        makeZoomIn();   
      }    
     });    
     toolbar.add(zoominButton);    
     zoomoutButton = new JButton("Zoom Out");    
     zoomoutButton.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        makeZoomOut();   
      }    
     });    
     toolbar.add(zoomoutButton);    
     cropButton = new JButton("Crop");    
     cropButton.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        crop();   
      }    
     });    
     toolbar.add(cropButton);   
     rotate1Button = new JButton("Rotate 90 Left");    
     rotate1Button.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        Rotate90left();   
      }    
     });    
     toolbar.add(rotate1Button);    
     rotate2Button = new JButton("Rotate 90 Right");    
     rotate2Button.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        Rotate90right();   
      }    
     });    
     toolbar.add(rotate2Button);    
     JPanel flow = new JPanel();    
     flow.add(toolbar);    
     contentPane.add(flow, BorderLayout.WEST);    
     showFilename(null);    
     setButtonsEnabled(false);    
     frame.pack();     
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();    
     frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);    
     frame.setVisible(true);    
   }    
   private void Rotate90left()   
   {    
     if(currentImage != null)   
     {    
       // create new image with double size    
       int width = currentImage.getWidth();    
       int height = currentImage.getHeight();    
       OFImage newImage = new OFImage(height, width);    
       //copy pixel data into new image    
       for(int y = 0; y < height; y++)   
       {    
         for(int x = 0; x < width; x++)   
         {    
           Color col = currentImage.getPixel(x, y);    
           newImage.setPixel(y, width-x-1, col);    
         }    
       }    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);    
       frame.pack();    
     }    
   }    
   private void Rotate90right()   
   {    
     if(currentImage != null)   
     {    
       // create new image with double size    
       int width = currentImage.getWidth();    
       int height = currentImage.getHeight();    
       OFImage newImage = new OFImage(height, width);    
       //copy pixel data into new image    
       for(int y = 0; y < height; y++)   
       {    
         for(int x = 0; x < width; x++)   
         {    
           Color col = currentImage.getPixel(x, y);    
           newImage.setPixel(height-y-1, x, col);    
         }    
       }    
       currentImage = newImage;    
       imagePanel.setImage(currentImage);    
       frame.pack();    
     }    
   }    
   private void makeMenuBar(JFrame frame)    
   {    
     final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();    
     JMenuBar menubar = new JMenuBar();    
     frame.setJMenuBar(menubar);    
     JMenu menu;    
     JMenuItem item;    
     // create the File menu    
     menu = new JMenu("File");    
     menubar.add(menu);    
     item = new JMenuItem("Open...");    
     item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));    
     item.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        openFile();   
      }    
     });    
     menu.add(item);    
     item = new JMenuItem("Close");    
     item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));    
     item.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        close();  
      }    
     });    
     menu.add(item);    
     menu.addSeparator();    
     item = new JMenuItem("Save As...");    
     item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, SHORTCUT_MASK));    
     item.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        saveAs();   
      }    
     });    
     menu.add(item);    
     menu.addSeparator();    
     item = new JMenuItem("Quit");    
     item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));    
     item.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        quit();   
      }    
     });    
     menu.add(item);    
     // create the Filter menu    
     menu = new JMenu("Effect");    
     menubar.add(menu);    
     for(final Filter filter : filters)   
     {    
       item = new JMenuItem(filter.getName());    
       item.addActionListener(new ActionListener()   
       {    
        public void actionPerformed(ActionEvent e)   
        {    
          applyFilter(filter);    
        }    
       });    
       menu.add(item);    
     }    
     // create the Help menu    
     menu = new JMenu("Help");    
     menubar.add(menu);    
     item = new JMenuItem("About ImageViewer...");    
     item.addActionListener(new ActionListener()   
     {    
      public void actionPerformed(ActionEvent e)   
      {   
        showAbout();   
      }    
     });    
     menu.add(item);    
   }    
 }    

Hasil:

  • Tampilan awal dan saat memunculkan gambar

  • Tampilan saat menambahkan text
  • Tampilan saat membesarkan dan mengecilkan gambar

  • Tampilan saat gambar diputar 90 derajat ke kanan dan kekiri

  • Tampilan saat gambar memakai filter Darker, Mirror dan Grayscale




Minggu, 09 Desember 2018

TUGAS PBO B (Game Pong)

MEMBUAT GAME PONG


1. Class Ball

  import java.awt.Color;    
  import java.awt.Graphics;    
  import java.util.Random;  
 /**  
  * Membuat Game Pong  
  *  
  * @author (Christine Amelia)  
  * @version (a version number or a date)  
  */  
  public class Ball    
  {    
   public int x, y, width = 25, height = 25;    
   public int motionX, motionY;    
   public Random random;    
   private Pong pong;    
   public int amountOfHits;    
   public Ball(Pong pong)    
   {    
     this.pong = pong;    
     this.random = new Random();    
     spawn();    
   }    
   public void update(Paddle paddle1, Paddle paddle2)    
   {    
     int speed = 5;    
     this.x += motionX * speed;    
     this.y += motionY * speed;    
     if (this.y + height - motionY > pong.height || this.y + motionY < 0)    
     {    
      if (this.motionY < 0)    
      {    
       this.y = 0;    
       this.motionY = random.nextInt(4);    
       if (motionY == 0)    
       {    
        motionY = 1;    
       }    
      }    
      else    
      {    
       this.motionY = -random.nextInt(4);    
       this.y = pong.height - height;    
       if (motionY == 0)    
       {    
        motionY = -1;    
       }    
      }    
     }    
     if (checkCollision(paddle1) == 1)    
     {    
      this.motionX = 1 + (amountOfHits / 5);    
      this.motionY = -2 + random.nextInt(4);    
      if (motionY == 0)    
      {    
       motionY = 1;    
      }    
      amountOfHits++;    
     }    
     else if (checkCollision(paddle2) == 1)    
     {    
      this.motionX = -1 - (amountOfHits / 5);    
      this.motionY = -2 + random.nextInt(4);    
      if (motionY == 0)    
      {    
       motionY = 1;    
      }    
      amountOfHits++;    
     }    
     if (checkCollision(paddle1) == 2)    
     {    
      paddle2.score++;    
      spawn();    
     }    
     else if (checkCollision(paddle2) == 2)    
     {    
      paddle1.score++;    
      spawn();    
     }    
   }    
   public void spawn()    
   {    
     this.amountOfHits = 0;    
     this.x = pong.width / 2 - this.width / 2;    
     this.y = pong.height / 2 - this.height / 2;    
     this.motionY = -2 + random.nextInt(4);    
     if (motionY == 0)    
     {    
      motionY = 1;    
     }    
     if (random.nextBoolean())    
     {    
      motionX = 1;    
     }    
     else    
     {    
      motionX = -1;    
     }    
   }    
   public int checkCollision(Paddle paddle)    
   {    
     if (this.x < paddle.x + paddle.width && this.x + width > paddle.x && this.y < paddle.y + paddle.height && this.y + height > paddle.y)    
     {    
      return 1; //bounce    
     }    
     else if ((paddle.x > x && paddle.paddleNumber == 1) || (paddle.x < x - width && paddle.paddleNumber == 2))    
     {    
      return 2; //score    
     }    
     return 0; //nothing    
   }    
   public void render(Graphics g)    
   {    
     g.setColor(Color.WHITE);    
     g.fillOval(x, y, width, height);    
   }    
  }    


2. Class Pong

  import java.awt.BasicStroke;    
  import java.awt.Color;    
  import java.awt.Font;    
  import java.awt.Graphics2D;    
  import java.awt.RenderingHints;    
  import java.awt.event.ActionEvent;    
  import java.awt.event.ActionListener;    
  import java.awt.event.KeyEvent;    
  import java.awt.event.KeyListener;    
  import java.util.Random;    
  import javax.swing.JFrame;    
  import javax.swing.Timer;  
 /**  
  * Membuat Game Pong  
  *  
  * @author (Christine Amelia)  
  * @version (a version number or a date)  
  */  
  public class Pong implements ActionListener, KeyListener    
  {    
   public static Pong pong;    
   public int width = 700, height = 700;    
   public Renderer renderer;    
   public Paddle player1;    
   public Paddle player2;    
   public Ball ball;    
   public boolean bot = false, selectingDifficulty;    
   public boolean w, s, up, down;    
   public int gameStatus = 0, scoreLimit = 7, playerWon; //0 = Menu, 1 = Paused, 2 = Playing, 3 = Over    
   public int botDifficulty, botMoves, botCooldown = 0;    
   public Random random;    
   public JFrame jframe;    
   public Pong()    
   {    
     Timer timer = new Timer(20, this);    
     random = new Random();    
     jframe = new JFrame("Pong");    
     renderer = new Renderer();    
     jframe.setSize(width + 15, height + 35);    
     jframe.setVisible(true);    
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
     jframe.add(renderer);    
     jframe.addKeyListener(this);    
     timer.start();    
   }    
   public void start()    
   {    
     gameStatus = 2;    
     player1 = new Paddle(this, 1);    
     player2 = new Paddle(this, 2);    
     ball = new Ball(this);    
   }    
   public void update()    
   {    
     if (player1.score >= scoreLimit)    
     {    
      playerWon = 1;    
      gameStatus = 3;    
     }    
     if (player2.score >= scoreLimit)    
     {    
      gameStatus = 3;    
      playerWon = 2;    
     }    
     if (w)    
     {    
      player1.move(true);    
     }    
     if (s)    
     {    
      player1.move(false);    
     }    
     if (!bot)    
     {    
      if (up)    
      {    
       player2.move(true);    
      }    
      if (down)    
      {    
       player2.move(false);    
      }    
     }    
     else    
     {    
      if (botCooldown > 0)    
      {    
       botCooldown--;    
       if (botCooldown == 0)    
       {    
        botMoves = 0;    
       }    
      }    
      if (botMoves < 10)    
      {    
       if (player2.y + player2.height / 2 < ball.y)    
       {    
        player2.move(false);    
        botMoves++;    
       }    
       if (player2.y + player2.height / 2 > ball.y)    
       {    
        player2.move(true);    
        botMoves++;    
       }    
       if (botDifficulty == 0)    
       {    
        botCooldown = 20;    
       }    
       if (botDifficulty == 1)    
       {    
        botCooldown = 15;    
       }    
       if (botDifficulty == 2)    
       {    
        botCooldown = 10;    
       }    
      }    
     }    
     ball.update(player1, player2);    
   }    
   public void render(Graphics2D g)    
   {    
     g.setColor(Color.BLACK);    
     g.fillRect(0, 0, width, height);    
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);    
     if (gameStatus == 0)    
     {    
      g.setColor(Color.WHITE);    
      g.setFont(new Font("Arial", 1, 50));    
      g.drawString("PONG", width / 2 - 75, 50);    
      if (!selectingDifficulty)    
      {    
       g.setFont(new Font("Arial", 1, 30));    
       g.drawString("Press Space to Play", width / 2 - 150, height / 2 - 25);    
       g.drawString("Press Shift to Play with Bot", width / 2 - 200, height / 2 + 25);    
       g.drawString("<< Score Limit: " + scoreLimit + " >>", width / 2 - 150, height / 2 + 75);    
      }    
     }    
     if (selectingDifficulty)    
     {    
      String string = botDifficulty == 0 ? "Easy" : (botDifficulty == 1 ? "Medium" : "Hard");    
      g.setFont(new Font("Arial", 1, 30));    
      g.drawString("<< Bot Difficulty: " + string + " >>", width / 2 - 180, height / 2 - 25);    
      g.drawString("Press Space to Play", width / 2 - 150, height / 2 + 25);    
     }    
     if (gameStatus == 1)    
     {    
      g.setColor(Color.WHITE);    
      g.setFont(new Font("Arial", 1, 50));    
      g.drawString("PAUSED", width / 2 - 103, height / 2 - 25);    
     }    
     if (gameStatus == 1 || gameStatus == 2)    
     {    
      g.setColor(Color.WHITE);    
      g.setStroke(new BasicStroke(5f));    
      g.drawLine(width / 2, 0, width / 2, height);    
      g.setStroke(new BasicStroke(2f));    
      g.drawOval(width / 2 - 150, height / 2 - 150, 300, 300);    
      g.setFont(new Font("Arial", 1, 50));    
      g.drawString(String.valueOf(player1.score), width / 2 - 90, 50);    
      g.drawString(String.valueOf(player2.score), width / 2 + 65, 50);    
      player1.render(g);    
      player2.render(g);    
      ball.render(g);    
     }    
     if (gameStatus == 3)    
     {    
      g.setColor(Color.WHITE);    
      g.setFont(new Font("Arial", 1, 50));    
      g.drawString("PONG", width / 2 - 75, 50);    
      if (bot && playerWon == 2)    
      {    
       g.drawString("The Bot Wins!", width / 2 - 170, 200);    
      }    
      else    
      {    
       g.drawString("Player " + playerWon + " Wins!", width / 2 - 165, 200);    
      }    
      g.setFont(new Font("Arial", 1, 30));    
      g.drawString("Press Space to Play Again", width / 2 - 185, height / 2 - 25);    
      g.drawString("Press ESC for Menu", width / 2 - 140, height / 2 + 25);    
     }    
   }    
   @Override    
   public void actionPerformed(ActionEvent e)    
   {    
     if (gameStatus == 2)    
     {    
      update();    
     }    
     renderer.repaint();    
   }    
   public static void main(String[] args)    
   {    
     pong = new Pong();    
   }    
   @Override    
   public void keyPressed(KeyEvent e)    
   {    
     int id = e.getKeyCode();    
     if (id == KeyEvent.VK_W)    
     {    
      w = true;    
     }    
     else if (id == KeyEvent.VK_S)    
     {    
      s = true;    
     }    
     else if (id == KeyEvent.VK_UP)    
     {    
      up = true;    
     }    
     else if (id == KeyEvent.VK_DOWN)    
     {    
      down = true;    
     }    
     else if (id == KeyEvent.VK_RIGHT)    
     {    
      if (selectingDifficulty)    
      {    
       if (botDifficulty < 2)    
       {    
        botDifficulty++;    
       }    
       else    
       {    
        botDifficulty = 0;    
       }    
      }    
      else if (gameStatus == 0)    
      {    
       scoreLimit++;    
      }    
     }    
     else if (id == KeyEvent.VK_LEFT)    
     {    
      if (selectingDifficulty)    
      {    
       if (botDifficulty > 0)    
       {    
        botDifficulty--;    
       }    
       else    
       {    
        botDifficulty = 2;    
       }    
      }    
      else if (gameStatus == 0 && scoreLimit > 1)    
      {    
       scoreLimit--;    
      }    
     }    
     else if (id == KeyEvent.VK_ESCAPE && (gameStatus == 2 || gameStatus == 3))    
     {    
      gameStatus = 0;    
     }    
     else if (id == KeyEvent.VK_SHIFT && gameStatus == 0)    
     {    
      bot = true;    
      selectingDifficulty = true;    
     }    
     else if (id == KeyEvent.VK_SPACE)    
     {    
      if (gameStatus == 0 || gameStatus == 3)    
      {    
       if (!selectingDifficulty)    
       {    
        bot = false;    
       }    
       else    
       {    
        selectingDifficulty = false;    
       }    
       start();    
      }    
      else if (gameStatus == 1)    
      {    
       gameStatus = 2;    
      }    
      else if (gameStatus == 2)    
      {    
       gameStatus = 1;    
      }    
     }    
   }    
   @Override    
   public void keyReleased(KeyEvent e)    
   {    
     int id = e.getKeyCode();    
     if (id == KeyEvent.VK_W)    
     {    
      w = false;    
     }    
     else if (id == KeyEvent.VK_S)    
     {    
      s = false;    
     }    
     else if (id == KeyEvent.VK_UP)    
     {    
      up = false;    
     }    
     else if (id == KeyEvent.VK_DOWN)    
     {    
      down = false;    
     }    
   }    
   @Override    
   public void keyTyped(KeyEvent e)    
   {    
   }    
  }    


3. Paddle

  import java.awt.Color;    
  import java.awt.Graphics;  
 /**  
  * Membuat Game Pong  
  *  
  * @author (Christine Amelia)  
  * @version (a version number or a date)  
  */  
  public class Paddle    
  {    
   public int paddleNumber;    
   public int x, y, width = 50, height = 250;    
   public int score;    
   public Paddle(Pong pong, int paddleNumber)    
   {    
     this.paddleNumber = paddleNumber;    
     if (paddleNumber == 1)    
     {    
      this.x = 0;    
     }    
     if (paddleNumber == 2)    
     {    
      this.x = pong.width - width;    
     }    
     this.y = pong.height / 2 - this.height / 2;    
   }    
   public void render(Graphics g)    
   {    
     g.setColor(Color.WHITE);    
     g.fillRect(x, y, width, height);    
   }    
   public void move(boolean up)    
   {    
     int speed = 15;    
     if (up)    
     {    
      if (y - speed > 0)    
      {    
       y -= speed;    
      }    
      else    
      {    
       y = 0;    
      }    
     }    
     else    
     {    
      if (y + height + speed < Pong.pong.height)    
      {    
       y += speed;    
      }    
      else    
      {    
       y = Pong.pong.height - height;    
      }    
     }    
   }    
  }    


4. Class Renderer

  import java.awt.Graphics;    
  import java.awt.Graphics2D;    
  import javax.swing.JPanel;   
 /**  
  * Write a description of class Renderer here.  
  *  
  * @author (your name)  
  * @version (a version number or a date)  
  */  
  public class Renderer extends JPanel    
  {    
   private static final long serialVersionUID = 1L;    
   @Override    
   protected void paintComponent(Graphics g)    
   {    
     super.paintComponent(g);    
     Pong.pong.render((Graphics2D) g);    
   }    
  }    

Hasil:

TUGAS PBO B

MEMBUAT SIMULASI FOX AND RABBIT



1. Class Simulator

  import java.util.Random;   
  import java.util.List;   
  import java.util.ArrayList;   
  import java.util.Iterator;   
  import java.awt.Color;   
  /**   
  * A simple predator-prey simulator, based on a rectangular field   
  * containing rabbits and foxes.   
  *    
  * @author David J. Barnes and Michael Kolling   
  * @version 2008.03.30   
  */   
  public class Simulator   
  {   
   // Constants representing configuration information for the simulation.   
   // The default width for the grid.   
   private static final int DEFAULT_WIDTH = 50;   
   // The default depth of the grid.   
   private static final int DEFAULT_DEPTH = 50;   
   // The probability that a fox will be created in any given grid position.   
   private static final double FOX_CREATION_PROBABILITY = 0.02;   
   // The probability that a rabbit will be created in any given grid position.   
   private static final double RABBIT_CREATION_PROBABILITY = 0.08;    
   // Lists of animals in the field. Separate lists are kept for ease of iteration.   
   private List<Rabbit> rabbits;   
   private List<Fox> foxes;   
   // The current state of the field.   
   private Field field;   
   // The current step of the simulation.   
   private int step;   
   // A graphical view of the simulation.   
   private SimulatorView view;   
   /**   
   * Construct a simulation field with default size.   
   */   
   public Simulator()   
   {   
    this(DEFAULT_DEPTH, DEFAULT_WIDTH);   
   }   
   /**   
   * Create a simulation field with the given size.   
   * @param depth Depth of the field. Must be greater than zero.   
   * @param width Width of the field. Must be greater than zero.   
   */   
   public Simulator(int depth, int width)   
   {   
    if(width <= 0 || depth <= 0) {   
     System.out.println("The dimensions must be greater than zero.");   
     System.out.println("Using default values.");   
     depth = DEFAULT_DEPTH;   
     width = DEFAULT_WIDTH;   
    }   
    rabbits = new ArrayList<Rabbit>();   
    foxes = new ArrayList<Fox>();   
    field = new Field(depth, width);   
    // Create a view of the state of each location in the field.   
    view = new SimulatorView(depth, width);   
    view.setColor(Rabbit.class, Color.orange);   
    view.setColor(Fox.class, Color.blue);   
    // Setup a valid starting point.   
    reset();   
   }   
   /**   
   * Run the simulation from its current state for a reasonably long period,   
   * e.g. 500 steps.   
   */   
   public void runLongSimulation()   
   {   
    simulate(500);   
   }   
   /**   
   * Run the simulation from its current state for the given number of steps.   
   * Stop before the given number of steps if it ceases to be viable.   
   * @param numSteps The number of steps to run for.   
   */   
   public void simulate(int numSteps)   
   {   
    for(int step = 1; step <= numSteps && view.isViable(field); step++) {   
     simulateOneStep();   
    }   
   }   
   /**   
   * Run the simulation from its current state for a single step.   
   * Iterate over the whole field updating the state of each   
   * fox and rabbit.   
   */   
   public void simulateOneStep()   
   {   
    step++;   
    // Provide space for newborn rabbits.   
    List<Rabbit> newRabbits = new ArrayList<Rabbit>();     
    // Let all rabbits act.   
    for(Iterator<Rabbit> it = rabbits.iterator(); it.hasNext(); ) {   
     Rabbit rabbit = it.next();   
     rabbit.run(newRabbits);   
     if(! rabbit.isAlive()) {   
      it.remove();   
     }   
    }   
    // Provide space for newborn foxes.   
    List<Fox> newFoxes = new ArrayList<Fox>();     
    // Let all foxes act.   
    for(Iterator<Fox> it = foxes.iterator(); it.hasNext(); ) {   
     Fox fox = it.next();   
     fox.hunt(newFoxes);   
     if(! fox.isAlive()) {   
      it.remove();   
     }   
    }   
    // Add the newly born foxes and rabbits to the main lists.   
    rabbits.addAll(newRabbits);   
    foxes.addAll(newFoxes);   
    view.showStatus(step, field);   
   }   
   /**   
   * Reset the simulation to a starting position.   
   */   
   public void reset()   
   {   
    step = 0;   
    rabbits.clear();   
    foxes.clear();   
    populate();   
    // Show the starting state in the view.   
    view.showStatus(step, field);   
   }   
   /**   
   * Randomly populate the field with foxes and rabbits.   
   */   
   private void populate()   
   {   
    Random rand = Randomizer.getRandom();   
    field.clear();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      if(rand.nextDouble() <= FOX_CREATION_PROBABILITY) {   
       Location location = new Location(row, col);   
       Fox fox = new Fox(true, field, location);   
       foxes.add(fox);   
      }   
      else if(rand.nextDouble() <= RABBIT_CREATION_PROBABILITY) {   
       Location location = new Location(row, col);   
       Rabbit rabbit = new Rabbit(true, field, location);   
       rabbits.add(rabbit);   
      }   
      // else leave the location empty.   
     }   
    }   
   }   
  }   


2. Class SimulatorView

  import java.awt.*;   
  import java.awt.event.*;   
  import javax.swing.*;   
  import java.util.LinkedHashMap;   
  import java.util.Map;   
  /**    
  * Membuat simulasi Fox and Rabbit.  
  *    
  * @author (Christine Amelia)   
  */   
  public class SimulatorView extends JFrame   
  {   
   // Colors used for empty locations.   
   private static final Color EMPTY_COLOR = Color.white;   
   // Color used for objects that have no defined color.   
   private static final Color UNKNOWN_COLOR = Color.gray;   
   private final String STEP_PREFIX = "Step: ";   
   private final String POPULATION_PREFIX = "Population: ";   
   private JLabel stepLabel, population;   
   private FieldView fieldView;   
   // A map for storing colors for participants in the simulation   
   private Map<Class, Color> colors;   
   // A statistics object computing and storing simulation information   
   private FieldStats stats;   
   /**   
   * Create a view of the given width and height.   
   * @param height The simulation's height.   
   * @param width The simulation's width.   
   */   
   public SimulatorView(int height, int width)   
   {   
    stats = new FieldStats();   
    colors = new LinkedHashMap<Class, Color>();   
    setTitle("Fox and Rabbit Simulation");   
    stepLabel = new JLabel(STEP_PREFIX, JLabel.CENTER);   
    population = new JLabel(POPULATION_PREFIX, JLabel.CENTER);   
    setLocation(100, 50);   
    fieldView = new FieldView(height, width);   
    Container contents = getContentPane();   
    contents.add(stepLabel, BorderLayout.NORTH);   
    contents.add(fieldView, BorderLayout.CENTER);   
    contents.add(population, BorderLayout.SOUTH);   
    pack();   
    setVisible(true);   
   }   
   /**   
   * Define a color to be used for a given class of animal.   
   * @param animalClass The animal's Class object.   
   * @param color The color to be used for the given class.   
   */   
   public void setColor(Class animalClass, Color color)   
   {   
    colors.put(animalClass, color);   
   }   
   /**   
   * @return The color to be used for a given class of animal.   
   */   
   private Color getColor(Class animalClass)   
   {   
    Color col = colors.get(animalClass);   
    if(col == null) {   
     // no color defined for this class   
     return UNKNOWN_COLOR;   
    }   
    else {   
     return col;   
    }   
   }   
   /**   
   * Show the current status of the field.   
   * @param step Which iteration step it is.   
   * @param field The field whose status is to be displayed.   
   */   
   public void showStatus(int step, Field field)   
   {   
    if(!isVisible()) {   
     setVisible(true);   
    }   
    stepLabel.setText(STEP_PREFIX + step);   
    stats.reset();   
    fieldView.preparePaint();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      Object animal = field.getObjectAt(row, col);   
      if(animal != null) {   
       stats.incrementCount(animal.getClass());   
       fieldView.drawMark(col, row, getColor(animal.getClass()));   
      }   
      else {   
       fieldView.drawMark(col, row, EMPTY_COLOR);   
      }   
     }   
    }   
    stats.countFinished();   
    population.setText(POPULATION_PREFIX + stats.getPopulationDetails(field));   
    fieldView.repaint();   
   }   
   /**   
   * Determine whether the simulation should continue to run.   
   * @return true If there is more than one species alive.   
   */   
   public boolean isViable(Field field)   
   {   
    return stats.isViable(field);   
   }   
   /**   
   * Provide a graphical view of a rectangular field. This is    
   * a nested class (a class defined inside a class) which   
   * defines a custom component for the user interface. This   
   * component displays the field.   
   * This is rather advanced GUI stuff - you can ignore this    
   * for your project if you like.   
   */   
   private class FieldView extends JPanel   
   {   
    private final int GRID_VIEW_SCALING_FACTOR = 6;   
    private int gridWidth, gridHeight;   
    private int xScale, yScale;   
    Dimension size;   
    private Graphics g;   
    private Image fieldImage;   
    /**   
    * Create a new FieldView component.   
    */   
    public FieldView(int height, int width)   
    {   
     gridHeight = height;   
     gridWidth = width;   
     size = new Dimension(0, 0);   
    }   
    /**   
    * Tell the GUI manager how big we would like to be.   
    */   
    public Dimension getPreferredSize()   
    {   
     return new Dimension(gridWidth * GRID_VIEW_SCALING_FACTOR,   
          gridHeight * GRID_VIEW_SCALING_FACTOR);   
    }   
    /**   
    * Prepare for a new round of painting. Since the component   
    * may be resized, compute the scaling factor again.   
    */   
    public void preparePaint()   
    {   
     if(! size.equals(getSize())) { // if the size has changed...   
      size = getSize();   
      fieldImage = fieldView.createImage(size.width, size.height);   
      g = fieldImage.getGraphics();   
      xScale = size.width / gridWidth;   
      if(xScale < 1) {   
       xScale = GRID_VIEW_SCALING_FACTOR;   
      }   
      yScale = size.height / gridHeight;   
      if(yScale < 1) {   
       yScale = GRID_VIEW_SCALING_FACTOR;   
      }   
     }   
    }   
    /**   
    * Paint on grid location on this field in a given color.   
    */   
    public void drawMark(int x, int y, Color color)   
    {   
     g.setColor(color);   
     g.fillRect(x * xScale, y * yScale, xScale-1, yScale-1);   
    }   
    /**   
    * The field view component needs to be redisplayed. Copy the   
    * internal image to screen.   
    */   
    public void paintComponent(Graphics g)   
    {   
     if(fieldImage != null) {   
      Dimension currentSize = getSize();   
      if(size.equals(currentSize)) {   
       g.drawImage(fieldImage, 0, 0, null);   
      }   
      else {   
       // Rescale the previous image.   
       g.drawImage(fieldImage, 0, 0, currentSize.width, currentSize.height, null);   
      }   
     }   
    }   
   }   
  }   


3. Class Location

  /**   
  * Membuat simulasi Fox and Rabbit.  
  *    
  * @author (Christine Amelia)  
  */   
  public class Location   
  {   
   // Row and column positions.   
   private int row;   
   private int col;   
   /**   
   * Represent a row and column.   
   * @param row The row.   
   * @param col The column.   
   */   
   public Location(int row, int col)   
   {   
    this.row = row;   
    this.col = col;   
   }   
   /**   
   * Implement content equality.   
   */   
   public boolean equals(Object obj)   
   {   
    if(obj instanceof Location) {   
     Location other = (Location) obj;   
     return row == other.getRow() && col == other.getCol();   
    }   
    else {   
     return false;   
    }   
   }   
   /**   
   * Return a string of the form row,column   
   * @return A string representation of the location.   
   */   
   public String toString()   
   {   
    return row + "," + col;   
   }   
   /**   
   * Use the top 16 bits for the row value and the bottom for   
   * the column. Except for very big grids, this should give a   
   * unique hash code for each (row, col) pair.   
   * @return A hashcode for the location.   
   */   
   public int hashCode()   
   {   
    return (row << 16) + col;   
   }   
   /**   
   * @return The row.   
   */   
   public int getRow()   
   {   
    return row;   
   }   
   /**   
   * @return The column.   
   */   
   public int getCol()   
   {   
    return col;   
   }   
  }   


4. Class FieldStats

  import java.awt.Color;   
  import java.util.HashMap;   
  /**   
  * Membuat simulasi Fox and Rabbit  
  *   
  * @author (Christine Amelia)   
  */   
  public class FieldStats   
  {   
   // Counters for each type of entity (fox, rabbit, etc.) in the simulation.   
   private HashMap<Class, Counter> counters;   
   // Whether the counters are currently up to date.   
   private boolean countsValid;   
   /**   
   * Construct a FieldStats object.   
   */   
   public FieldStats()   
   {   
    // Set up a collection for counters for each type of animal that   
    // we might find   
    counters = new HashMap<Class, Counter>();   
    countsValid = true;   
   }   
   /**   
   * Get details of what is in the field.   
   * @return A string describing what is in the field.   
   */   
   public String getPopulationDetails(Field field)   
   {   
    StringBuffer buffer = new StringBuffer();   
    if(!countsValid) {   
     generateCounts(field);   
    }   
    for(Class key : counters.keySet()) {   
     Counter info = counters.get(key);   
     buffer.append(info.getName());   
     buffer.append(": ");   
     buffer.append(info.getCount());   
     buffer.append(' ');   
    }   
    return buffer.toString();   
   }   
   /**   
   * Invalidate the current set of statistics; reset all    
   * counts to zero.   
   */   
   public void reset()   
   {   
    countsValid = false;   
    for(Class key : counters.keySet()) {   
     Counter count = counters.get(key);   
     count.reset();   
    }   
   }   
   /**   
   * Increment the count for one class of animal.   
   * @param animalClass The class of animal to increment.   
   */   
   public void incrementCount(Class animalClass)   
   {   
    Counter count = counters.get(animalClass);   
    if(count == null) {   
     // We do not have a counter for this species yet.   
     // Create one.   
     count = new Counter(animalClass.getName());   
     counters.put(animalClass, count);   
    }   
    count.increment();   
   }   
   /**   
   * Indicate that an animal count has been completed.   
   */   
   public void countFinished()   
   {   
    countsValid = true;   
   }   
   /**   
   * Determine whether the simulation is still viable.   
   * I.e., should it continue to run.   
   * @return true If there is more than one species alive.   
   */   
   public boolean isViable(Field field)   
   {   
    // How many counts are non-zero.   
    int nonZero = 0;   
    if(!countsValid) {   
     generateCounts(field);   
    }   
    for(Class key : counters.keySet()) {   
     Counter info = counters.get(key);   
     if(info.getCount() > 0) {   
      nonZero++;   
     }   
    }   
    return nonZero > 1;   
   }   
   /**   
   * Generate counts of the number of foxes and rabbits.   
   * These are not kept up to date as foxes and rabbits   
   * are placed in the field, but only when a request   
   * is made for the information.   
   * @param field The field to generate the stats for.   
   */   
   private void generateCounts(Field field)   
   {   
    reset();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      Object animal = field.getObjectAt(row, col);   
      if(animal != null) {   
       incrementCount(animal.getClass());   
      }   
     }   
    }   
    countsValid = true;   
   }   
  }   


5. Class Field

  import java.util.Collections;   
  import java.util.Iterator;   
  import java.util.LinkedList;   
  import java.util.List;   
  import java.util.Random;   
  /**   
  * Membuat simulasi Fox and Rabbit  
  *   
  *    
  * @author (Christine Amelia)   
  */   
  public class Field   
  {   
   // A random number generator for providing random locations.   
   private static final Random rand = Randomizer.getRandom();   
   // The depth and width of the field.   
   private int depth, width;   
   // Storage for the animals.   
   private Object[][] field;   
   /**   
   * Represent a field of the given dimensions.   
   * @param depth The depth of the field.   
   * @param width The width of the field.   
   */   
   public Field(int depth, int width)   
   {   
    this.depth = depth;   
    this.width = width;   
    field = new Object[depth][width];   
   }   
   /**   
   * Empty the field.   
   */   
   public void clear()   
   {   
    for(int row = 0; row < depth; row++) {   
     for(int col = 0; col < width; col++) {   
      field[row][col] = null;   
     }   
    }   
   }   
   /**   
   * Clear the given location.   
   * @param location The location to clear.   
   */   
   public void clear(Location location)   
   {   
    field[location.getRow()][location.getCol()] = null;   
   }   
   /**   
   * Place an animal at the given location.   
   * If there is already an animal at the location it will   
   * be lost.   
   * @param animal The animal to be placed.   
   * @param row Row coordinate of the location.   
   * @param col Column coordinate of the location.   
   */   
   public void place(Object animal, int row, int col)   
   {   
    place(animal, new Location(row, col));   
   }   
   /**   
   * Place an animal at the given location.   
   * If there is already an animal at the location it will   
   * be lost.   
   * @param animal The animal to be placed.   
   * @param location Where to place the animal.   
   */   
   public void place(Object animal, Location location)   
   {   
    field[location.getRow()][location.getCol()] = animal;   
   }   
   /**   
   * Return the animal at the given location, if any.   
   * @param location Where in the field.   
   * @return The animal at the given location, or null if there is none.   
   */   
   public Object getObjectAt(Location location)   
   {   
    return getObjectAt(location.getRow(), location.getCol());   
   }   
   /**   
   * Return the animal at the given location, if any.   
   * @param row The desired row.   
   * @param col The desired column.   
   * @return The animal at the given location, or null if there is none.   
   */   
   public Object getObjectAt(int row, int col)   
   {   
    return field[row][col];   
   }   
   /**   
   * Generate a random location that is adjacent to the   
   * given location, or is the same location.   
   * The returned location will be within the valid bounds   
   * of the field.   
   * @param location The location from which to generate an adjacency.   
   * @return A valid location within the grid area.   
   */   
   public Location randomAdjacentLocation(Location location)   
   {   
    List<Location> adjacent = adjacentLocations(location);   
    return adjacent.get(0);   
   }   
   /**   
   * Get a shuffled list of the free adjacent locations.   
   * @param location Get locations adjacent to this.   
   * @return A list of free adjacent locations.   
   */   
   public List<Location> getFreeAdjacentLocations(Location location)   
   {   
    List<Location> free = new LinkedList<Location>();   
    List<Location> adjacent = adjacentLocations(location);   
    for(Location next : adjacent) {   
     if(getObjectAt(next) == null) {   
      free.add(next);   
     }   
    }   
    return free;   
   }   
   /**   
   * Try to find a free location that is adjacent to the   
   * given location. If there is none, return null.   
   * The returned location will be within the valid bounds   
   * of the field.   
   * @param location The location from which to generate an adjacency.   
   * @return A valid location within the grid area.   
   */   
   public Location freeAdjacentLocation(Location location)   
   {   
    // The available free ones.   
    List<Location> free = getFreeAdjacentLocations(location);   
    if(free.size() > 0) {   
     return free.get(0);   
    }   
    else {   
     return null;   
    }   
   }   
   /**   
   * Return a shuffled list of locations adjacent to the given one.   
   * The list will not include the location itself.   
   * All locations will lie within the grid.   
   * @param location The location from which to generate adjacencies.   
   * @return A list of locations adjacent to that given.   
   */   
   public List<Location> adjacentLocations(Location location)   
   {   
    assert location != null : "Null location passed to adjacentLocations";   
    // The list of locations to be returned.   
    List<Location> locations = new LinkedList<Location>();   
    if(location != null) {   
     int row = location.getRow();   
     int col = location.getCol();   
     for(int roffset = -1; roffset <= 1; roffset++) {   
      int nextRow = row + roffset;   
      if(nextRow >= 0 && nextRow < depth) {   
       for(int coffset = -1; coffset <= 1; coffset++) {   
        int nextCol = col + coffset;   
        // Exclude invalid locations and the original location.   
        if(nextCol >= 0 && nextCol < width && (roffset != 0 || coffset != 0)) {   
         locations.add(new Location(nextRow, nextCol));   
        }   
       }   
      }   
     }   
     // Shuffle the list. Several other methods rely on the list   
     // being in a random order.   
     Collections.shuffle(locations, rand);   
    }   
    return locations;   
   }   
   /**   
   * Return the depth of the field.   
   * @return The depth of the field.   
   */   
   public int getDepth()   
   {   
    return depth;   
   }   
   /**   
   * Return the width of the field.   
   * @return The width of the field.   
   */   
   public int getWidth()   
   {   
    return width;   
   }   
  }   

6. Class Rabbit

  import java.util.List;   
  import java.util.Random;   
  /**   
  * Membuat simulasi Fox and Rabbit  
  *    
  * @author (Christine Amelia)   
  */   
  public class Rabbit    
  {    
   // Characteristics shared by all rabbits (static fields).    
   // The age at which a rabbit can start to breed.    
   private static final int BREEDING_AGE = 5;    
   // The age to which a rabbit can live.    
   private static final int MAX_AGE = 40;    
   // The likelihood of a rabbit breeding.    
   private static final double BREEDING_PROBABILITY = 0.15;    
   // The maximum number of births.    
   private static final int MAX_LITTER_SIZE = 4;    
   // A shared random number generator to control breeding.    
   private static final Random rand = Randomizer.getRandom();    
   // Individual characteristics (instance fields).    
   // The rabbit's age.    
   private int age;    
   // Whether the rabbit is alive or not.    
   private boolean alive;    
   // The rabbit's position.    
   private Location location;    
   // The field occupied.    
   private Field field;    
   /**    
   * Create a new rabbit. A rabbit may be created with age    
   * zero (a new born) or with a random age.    
   *    
   * @param randomAge If true, the rabbit will have a random age.    
   * @param field The field currently occupied.    
   * @param location The location within the field.    
   */    
   public Rabbit(boolean randomAge, Field field, Location location)    
   {    
   age = 0;    
   alive = true;    
   this.field = field;    
   setLocation(location);    
   if(randomAge) {    
    age = rand.nextInt(MAX_AGE);    
   }    
   }    
   /**    
   * This is what the rabbit does most of the time - it runs    
   * around. Sometimes it will breed or die of old age.    
   * @param newRabbits A list to add newly born rabbits to.    
   */    
   public void run(List<Rabbit> newRabbits)    
   {    
   incrementAge();    
   if(alive) {    
    giveBirth(newRabbits);     
    // Try to move into a free location.    
    Location newLocation = field.freeAdjacentLocation(location);    
    if(newLocation != null) {    
    setLocation(newLocation);    
    }    
    else {    
    // Overcrowding.    
    setDead();    
    }    
   }    
   }    
   /**    
   * Check whether the rabbit is alive or not.    
   * @return true if the rabbit is still alive.    
   */    
   public boolean isAlive()    
   {    
   return alive;    
   }    
   /**    
   * Indicate that the rabbit is no longer alive.    
   * It is removed from the field.    
   */    
   public void setDead()    
   {    
   alive = false;    
   if(location != null) {    
    field.clear(location);    
    location = null;    
    field = null;    
   }    
   }    
   /**    
   * Return the rabbit's location.    
   * @return The rabbit's location.    
   */    
   public Location getLocation()    
   {    
   return location;    
   }    
   /**    
   * Place the rabbit at the new location in the given field.    
   * @param newLocation The rabbit's new location.    
   */    
   private void setLocation(Location newLocation)    
   {    
   if(location != null) {    
    field.clear(location);    
   }    
   location = newLocation;    
   field.place(this, newLocation);    
   }    
   /**    
   * Increase the age.    
   * This could result in the rabbit's death.    
   */    
   private void incrementAge()    
   {    
   age++;    
   if(age > MAX_AGE) {    
    setDead();    
   }    
   }    
   /**    
   * Check whether or not this rabbit is to give birth at this step.    
   * New births will be made into free adjacent locations.    
   * @param newRabbits A list to add newly born rabbits to.    
   */    
   private void giveBirth(List<Rabbit> newRabbits)    
   {    
   // New rabbits are born into adjacent locations.    
   // Get a list of adjacent free locations.    
   List<Location> free = field.getFreeAdjacentLocations(location);    
   int births = breed();    
   for(int b = 0; b < births && free.size() > 0; b++) {    
    Location loc = free.remove(0);    
    Rabbit young = new Rabbit(false, field, loc);    
    newRabbits.add(young);    
   }    
   }    
   /**    
   * Generate a number representing the number of births,    
   * if it can breed.    
   * @return The number of births (may be zero).    
   */    
   private int breed()    
   {    
   int births = 0;    
   if(canBreed() && rand.nextDouble() <= BREEDING_PROBABILITY) {    
    births = rand.nextInt(MAX_LITTER_SIZE) + 1;    
   }    
   return births;    
   }    
   /**    
   * A rabbit can breed if it has reached the breeding age.    
   * @return true if the rabbit can breed, false otherwise.    
   */    
   private boolean canBreed()    
   {    
   return age >= BREEDING_AGE;    
   }    
  }    


7. Class Fox

  import java.util.List;   
  import java.util.Iterator;   
  import java.util.Random;   
  /**   
  * Membuat simulasi Fox and Rabbit  
  *   
  *    
  * @author (Christine Amelia)   
  */   
  public class Fox   
  {   
   // Characteristics shared by all foxes (static fields).   
   // The age at which a fox can start to breed.   
   private static final int BREEDING_AGE = 10;   
   // The age to which a fox can live.   
   private static final int MAX_AGE = 150;   
   // The likelihood of a fox breeding.   
   private static final double BREEDING_PROBABILITY = 0.35;   
   // The maximum number of births.   
   private static final int MAX_LITTER_SIZE = 5;   
   // The food value of a single rabbit. In effect, this is the   
   // number of steps a fox can go before it has to eat again.   
   private static final int RABBIT_FOOD_VALUE = 7;   
   // A shared random number generator to control breeding.   
   private static final Random rand = Randomizer.getRandom();   
   // Individual characteristics (instance fields).   
   // The fox's age.   
   private int age;   
   // Whether the fox is alive or not.   
   private boolean alive;   
   // The fox's position.   
   private Location location;   
   // The field occupied.   
   private Field field;   
   // The fox's food level, which is increased by eating rabbits.   
   private int foodLevel;   
   /**   
   * Create a fox. A fox can be created as a new born (age zero   
   * and not hungry) or with a random age and food level.   
   *    
   * @param randomAge If true, the fox will have random age and hunger level.   
   * @param field The field currently occupied.   
   * @param location The location within the field.   
   */   
   public Fox(boolean randomAge, Field field, Location location)   
   {   
    age = 0;   
    alive = true;   
    this.field = field;   
    setLocation(location);   
    if(randomAge) {   
     age = rand.nextInt(MAX_AGE);   
     foodLevel = rand.nextInt(RABBIT_FOOD_VALUE);   
    }   
    else {   
     // leave age at 0   
     foodLevel = RABBIT_FOOD_VALUE;   
    }   
   }   
   /**   
   * This is what the fox does most of the time: it hunts for   
   * rabbits. In the process, it might breed, die of hunger,   
   * or die of old age.   
   * @param field The field currently occupied.   
   * @param newFoxes A list to add newly born foxes to.   
   */   
   public void hunt(List<Fox> newFoxes)   
   {   
    incrementAge();   
    incrementHunger();   
    if(alive) {   
     giveBirth(newFoxes);      
     // Move towards a source of food if found.   
     Location newLocation = findFood(location);   
     if(newLocation == null) {    
      // No food found - try to move to a free location.   
      newLocation = field.freeAdjacentLocation(location);   
     }   
     // See if it was possible to move.   
     if(newLocation != null) {   
      setLocation(newLocation);   
     }   
     else {   
      // Overcrowding.   
      setDead();   
     }   
    }   
   }   
   /**   
   * Check whether the fox is alive or not.   
   * @return True if the fox is still alive.   
   */   
   public boolean isAlive()   
   {   
    return alive;   
   }   
   /**   
   * Return the fox's location.   
   * @return The fox's location.   
   */   
   public Location getLocation()   
   {   
    return location;   
   }   
   /**   
   * Place the fox at the new location in the given field.   
   * @param newLocation The fox's new location.   
   */   
   private void setLocation(Location newLocation)   
   {   
    if(location != null) {   
     field.clear(location);   
    }   
    location = newLocation;   
    field.place(this, newLocation);   
   }   
   /**   
   * Increase the age. This could result in the fox's death.   
   */   
   private void incrementAge()   
   {   
    age++;   
    if(age > MAX_AGE) {   
     setDead();   
    }   
   }   
   /**   
   * Make this fox more hungry. This could result in the fox's death.   
   */   
   private void incrementHunger()   
   {   
    foodLevel--;   
    if(foodLevel <= 0) {   
     setDead();   
    }   
   }   
   /**   
   * Tell the fox to look for rabbits adjacent to its current location.   
   * Only the first live rabbit is eaten.   
   * @param location Where in the field it is located.   
   * @return Where food was found, or null if it wasn't.   
   */   
   private Location findFood(Location location)   
   {   
    List<Location> adjacent = field.adjacentLocations(location);   
    Iterator<Location> it = adjacent.iterator();   
    while(it.hasNext()) {   
     Location where = it.next();   
     Object animal = field.getObjectAt(where);   
     if(animal instanceof Rabbit) {   
      Rabbit rabbit = (Rabbit) animal;   
      if(rabbit.isAlive()) {    
       rabbit.setDead();   
       foodLevel = RABBIT_FOOD_VALUE;   
       // Remove the dead rabbit from the field.   
       return where;   
      }   
     }   
    }   
    return null;   
   }   
   /**   
   * Check whether or not this fox is to give birth at this step.   
   * New births will be made into free adjacent locations.   
   * @param newFoxes A list to add newly born foxes to.   
   */   
   private void giveBirth(List<Fox> newFoxes)   
   {   
    // New foxes are born into adjacent locations.   
    // Get a list of adjacent free locations.   
    List<Location> free = field.getFreeAdjacentLocations(location);   
    int births = breed();   
    for(int b = 0; b < births && free.size() > 0; b++) {   
     Location loc = free.remove(0);   
     Fox young = new Fox(false, field, loc);   
     newFoxes.add(young);   
    }   
   }   
   /**   
   * Generate a number representing the number of births,   
   * if it can breed.   
   * @return The number of births (may be zero).   
   */   
   private int breed()   
   {   
    int births = 0;   
    if(canBreed() && rand.nextDouble() <= BREEDING_PROBABILITY) {   
     births = rand.nextInt(MAX_LITTER_SIZE) + 1;   
    }   
    return births;   
   }   
   /**   
   * A fox can breed if it has reached the breeding age.   
   */   
   private boolean canBreed()   
   {   
    return age >= BREEDING_AGE;   
   }   
   /**   
   * Indicate that the fox is no longer alive.   
   * It is removed from the field.   
   */   
   private void setDead()   
   {   
    alive = false;   
    if(location != null) {   
     field.clear(location);   
     location = null;   
     field = null;   
    }   
   }   
  }   


8. Class Counter

  import java.awt.Color;   
  /**   
  * Membuat simulasi Fox and Rabbit.  
  *   
  *    
  * @author (Christine Amelia)   
  */   
  public class Counter   
  {   
   // A name for this type of simulation participant   
   private String name;   
   // How many of this type exist in the simulation.   
   private int count;   
   /**   
   * Provide a name for one of the simulation types.   
   * @param name A name, e.g. "Fox".   
   */   
   public Counter(String name)   
   {   
    this.name = name;   
    count = 0;   
   }   
   /**   
   * @return The short description of this type.   
   */   
   public String getName()   
   {   
    return name;   
   }   
   /**   
   * @return The current count for this type.   
   */   
   public int getCount()   
   {   
    return count;   
   }   
   /**   
   * Increment the current count by one.   
   */   
   public void increment()   
   {   
    count++;   
   }   
   /**   
   * Reset the current count to zero.   
   */   
   public void reset()   
   {   
    count = 0;   
   }   
  }   


9. Class Randomizer

  import java.util.Random;   
  /**   
  * Membuat simulasi Fox and Rabbit   
  *   
  *    
  * @author (Christine Amelia)   
  */   
  public class Randomizer   
  {   
   // The default seed for control of randomization.   
   private static final int SEED = 1111;   
   // A shared Random object, if required.   
   private static final Random rand = new Random(SEED);   
   // Determine whether a shared random generator is to be provided.   
   private static final boolean useShared = true;   
   /**   
   * Constructor for objects of class Randomizer   
   */   
   public Randomizer()   
   {   
   }   
   /**   
   * Provide a random generator.   
   * @return A random object.   
   */   
   public static Random getRandom()   
   {   
    if(useShared) {   
     return rand;   
    }   
    else {   
     return new Random();   
    }   
   }   
   /**   
   * Reset the randomization.   
   * This will have no effect if randomization is not through   
   * a shared Random generator.   
   */   
   public static void reset()   
   {   
    if(useShared) {   
     rand.setSeed(SEED);   
    }   
   }   
  }   

Hasil:

MPPL 2020 - Manajemen Biaya

Christine Amelia / 05111740000174 Nandha Himawan / 05111740000180 Berikut merupakan manajemen biaya yang telah kami buat berdasarkan KAK ...