倉庫クエ(敵一覧)
ゲーム完美世界の倉庫クエの敵一覧を見るプログラムの紹介をします
これは、MMORPGの完美世界の中で、初心者~上級者までが苦労して集めるアイテムの一覧を集めるという趣旨のプログラムです。全体を公開したものではありませんが(多分)、こういったプログラムで作っているんだよというプログラムの勉強に使っていただけたらと思います。
特に、データベース周りが参考になるのではないでしょうか?
ファイル名:souko_quest.php
<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><?php
// DB接続用ファイルとGETとPOSTの値をチェックするファイルを読み込み
require_once __DIR__ . '/db_config.php';
require_once __DIR__ . '/get_post_check.php';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>倉庫クエアップデート</title>
<link rel="icon" href="img/favicon.ico">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="main">
<table>
<tr>
<th>
<h2>倉庫クエ<?= $step; ?>(敵一覧)データ</h2>
</th>
</tr>
</table>
<p>
<?php
try {
// DB接続開始
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (empty($search)) {
// 検索ワードが設定されていない時のSQL文
$sql = 'SELECT * FROM souko_kue WHERE step = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $step, PDO::PARAM_INT);
} else {
// $drop_item_nameの部分検索を行って、該当するものがあるかをチェック
/*
foreach ($drop_item_name as $key => $value) {
if (str_contains($value, $search)) {
$cnt = $key;
break;
}
*/
// PHP7以前の場合はこちらの方法で
if (preg_match('/'.$search.'/', $value)) {
$cnt = $key;
break;
}
}
// 検索ワードが設定されている時のSQL文
$sql = 'SELECT * FROM souko_kue WHERE step = ? and (drop_item = ? or drop_enemy like ? or drop_area1 like ? or drop_area2 like ?)';
// あいまい検索用変数
$search_like = '%' . $search . '%';
// 各種DB接続に関する設定
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $step, PDO::PARAM_INT);
if (isset($cnt)) {
$stmt->bindValue(2, $cnt, PDO::PARAM_INT);
} else {
$stmt->bindValue(2, NULL, PDO::PARAM_INT);
}
$stmt->bindValue(3, $search_like, PDO::PARAM_STR);
$stmt->bindValue(4, $search_like, PDO::PARAM_STR);
$stmt->bindValue(5, $search_like, PDO::PARAM_STR);
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '<table>' . PHP_EOL;
echo '<tr>' . PHP_EOL;
echo '<th>' . PHP_EOL;
echo '<form method="get" action="souko_quest.php?step=' . htmlspecialchars($step, ENT_QUOTES) . '&search=' . htmlspecialchars($search, ENT_QUOTES) . '">' . PHP_EOL;
echo '<input type="text" class="reset_place" name="search" value="' . htmlspecialchars($search, ENT_QUOTES) . '" size="22" maxlength="10">' . PHP_EOL;
echo '<input type="hidden" name="step" value="' . htmlspecialchars($step, ENT_QUOTES) .'">' . PHP_EOL;
echo '<input type="submit" value="検索">' . PHP_EOL;
echo '<button class="reset">リセット</button>' . PHP_EOL;
echo '</form>' . PHP_EOL;
echo '</th>' . PHP_EOL;
echo '</tr>' . PHP_EOL;
echo '</table>' . PHP_EOL;
echo '<table border="1">' . PHP_EOL;
echo '<tr>' . PHP_EOL;
echo '<th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>座標(付近)</th>' . PHP_EOL;
echo '</tr>' . PHP_EOL;
// 倉庫クエ(敵一覧データ)の表示
foreach ($result as $row) {
echo '<tr>' . PHP_EOL;
echo '<td>' . $drop_item_name[(int)$row['drop_item']] . '</td>' . PHP_EOL;
echo '<td>' . htmlspecialchars($row['drop_enemy']) . '</td>' . PHP_EOL;
echo '<td>' . htmlspecialchars($row['drop_area1']) . '</td>' . PHP_EOL;
echo '<td>' . htmlspecialchars($row['drop_area2']) . '</td>' . PHP_EOL;
echo '<td>(' . htmlspecialchars($row['x'], ENT_QUOTES) . ',' . htmlspecialchars($row['y'], ENT_QUOTES) . ')↑' . htmlspecialchars($row['height'], ENT_QUOTES) . '</td>' . PHP_EOL;
echo '</tr>' . PHP_EOL;
}
echo '</table>' . PHP_EOL;
// DB領域の開放
$dbh = null;
} catch (PDOException $e) {
echo 'エラー発生:表示に失敗しました。';
exit;
}
?>
<table>
<tr>
<th>
<form method="post" action="index.html">
<input type="submit" value="戻る">
</form>
</th>
</tr>
</table>
</p>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/souko_quest.js"></script>
</body>
</html></pre>
ファイル名:db_config.php
<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><?php
// DBのユーザー名とパスワード
$user = "moyasea_patako";
$pass = "hogehoge";
// DB接続(ローカル、ネットワーク切り替え)
$dbh = new PDO('mysql:host=localhost;dbname=moyasea_kanbi;charset=utf8', $user, $pass);
//$dbh = new PDO('mysql:host=mysql8.star.ne.jp;dbname=moyasea_kanbi;charset=utf8', $user, $pass);
</pre>
データベースに接続する部分は、数回使い回すので、ファイルに切り出しました。一番上で、一回呼び出すだけで済むようになるので、便利な手法です。
ファイル名:get_post_check.php
<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><?php
// GETの値をチェックする
if (empty($_GET['step'])) {
echo 'IDを正しく入力してください。';
exit;
}
$step = (int)$_GET['step'];
// $stepの値により、$drop_item_nameに入れるデータを切り替える
switch ($step) {
case 1:
$drop_item_name = ['冥獣の肉片', '呪術の皮', '元素の粉末', '柔軟な毛皮', '触角', 'サイの角'];
break;
case 2:
$drop_item_name = ['冥獣の鋭い爪', '丈夫な皮袋', '元素の破片', '鈍い爪', '蜜', '百草液'];
break;
default:
echo 'IDが正しくありません。';
exit;
}
// 検索ワードがあるかどうかを調べる
if (isset($_GET['search'])) {
$search = $_GET['search'];
} else {
$search = NULL;
}
// POSTの値をチェックする
if (isset($_POST['id'])) {
$id = $_POST['id'];
} else {
$id = NULL;
}
</pre>
getやpostでやり取りするデータの整合性を確認するためのファイルです。
ファイル名:style.css
<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">body {
background: #FFF;
}
.header h1 {
color: #700;
width: 100%;
text-align: center;
}
.slideshow {
width: 550px;
margin: auto;
}
.slideshow img {
width: 100%;
}
.main p,h2 {
width: 80%;
margin-left: auto;
margin-right: auto;
}
.main table {
margin-left: auto;
margin-right: auto;
}
.main th,td {
white-space: nowrap;
}
</pre>
スタイルシートは苦手なので、お粗末ですみません。
ファイル名:souko_quest.js
項目のリセットを行うためのJavaScriptです。JQueryで書いてあります。
<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">$('.reset').on('click', function() {
$('.reset_place').val('');
});
</pre>
コメント