项目简介:分析利用《社交网络》中评比算法,通过两两美女之间比较,计算出颜值,得出美女排名,PHP结合前端相关技术实现。想超越facebook?先做一个你自己的校花评选网站吧!
一、实验简介
1.1 实验目的
? 本次实验将带领大家完成一个有趣的 PHP 项目:校花评选。主要包含的知识点:前端页面布局,使用 Jquery 控制页面效果和操作 Cookie,使用 Ajax 方式与后台交互,PHP 操作 MySQL 完成数据查询,PHP 实现埃洛等级分系统算法。通过本次实验的操作,我们不仅可以欣赏并评选美丽的校花,也可以大大提升编程技术。
项目由 石头哥 发布在 实验楼 ,完整教程及在线练习地址: PHP - 校花评比排名项目 ,可以直接在教程中下载代码使用demo。
1.2 实验环境
本实验环境采用带桌面的Ubuntu Linux环境,数据库及服务器环境:
-
在线环境默认未开启数据库服务,输入以下命令开启:
$ sudo service mysql start
-
由于本项目比较简单,所以我们可以直接使用 PHP 内置的服务器。通过以下命令就可使用:
$ php -S localhost:8080 #端口可自定义
服务器需要在我们的项目目录下开启。
1.3 项目效果(人物图片来自网络)
![用PHP做颜值计算,评选校花](http://file.lexue001.com/www/201610/01/135151266.png)
评选过程:
![用PHP做颜值计算,评选校花](http://file.lexue001.com/www/201610/01/135151296.png)
评选结果:
![用PHP做颜值计算,评选校花](http://file.lexue001.com/www/201610/01/135151366.png)
二、项目制作
2.1 项目简介
校花评比项目这个想法来自于电影《社交网络》 ——马克扎克伯格被女友甩了之后,一气之下黑了所有宿舍的相册,将所有女生的照片放在Facemash上供人评比。如今我们实验楼的教程教大家也来过把瘾,把这个实现过程来重映一下。请同学们好好利用实验楼里面的环境~~
评选过程:
介绍: 校花排名页面随机产生两个女生(名字做了处理) , 比较两个女生的颜值, 然后利用鼠标点击选择一个你认为较漂亮的女生,随后数据自动提交到数据后台处理, 页面会自动刷新,再次随机产生两个女生,再次选择比较, 依次达到不断更新颜值的作用。 上方进度条可以显示你的进度,当进行10次选择以后, 页面自动弹到排名页面, 显示美女排名 ,以及校花。
想法来自《社交网络》,所以这里教程的步骤也跟着扎克伯格的脚步来进行。
由于本项目需要,你应该提前准备好几张美女的图片用来评选。这里我为了方便,就直接在网上找了几张图片,我也会在项目源码中为大家提供。不过这都不是我们关心的重点,我们应该着眼于编码功能实现。
排名算法(资料参考: 百度百科 ):
我们将会使用埃洛等级分系统来实现对校花的评选。设定每个女生的基础颜值为 1400,供用户评选之后,将会通过该算法计算出新的颜值,并最终排名。
算法示例:假设女生 A 和 B 的当前颜值分别为 Ra 和 Rb 。
A 对 B 的胜率期望值为:
同理,B 对 A 的胜率为:
假如一位女生在比赛中的真实得分(胜=1分,和=0.5分,负=0分)和她的胜率期望值不同,则她的颜值要作相应的调整。例如,女生A颜值为1613,与颜值为1573的女生B战平。若K取32,则A的胜率期望值为:
,因而A的新颜值分为 。
在不断的两两比较之后,由此可以得出他们的颜值排名。 最后就知道校花是谁了。
2.2 数据库及前端页面实现
本部分详细教程可以在实验楼查看并在线完成,为了节约时间,已把完整的项目源码打包,可以在实验楼课程中获取: PHP - 校花评比排名项目
2.3 PHP 后台处理
后台主要分为两个部分:数据库部分和颜值计算部分。
2.3.1 数据库操作辅助类
使用此类可以很方便的操作数据库。
DBMysql.php :
<?php class DBMysql { public static function connect(){ $dbc = new mysqli('localhost','root','','beauty') OR die('Could not connected to MySQL: '.mysql_error()); $dbc->query('SET NAMES utf8'); return $dbc; } }
定义了一个数据库连接方法,使用 mysqli 建立mysql 连接,设置字符编码,返回连接对象。
2.3.2 颜值计算类
此类根据 埃洛等级分系统 设计算法,实现读取、计算、更新颜值的操作。
<?php /** * 排名算法 */ class Rank { private static $K = 32; private static $db; //数据库连接对象 function __construct() { require_once 'DBMysql.php'; self::$db = DBMysql::connect(); } //根据id值查询颜值 public function queryScore($id) { $sql = "SELECT * FROM stu WHERE `id` = $id"; $info = mysqli_fetch_assoc(self::$db->query($sql)); return $info['score']; } //更新颜值 public function updateScore($Ra,$id) { self::$db->query("UPDATE `stu` SET `score` = $Ra WHERE `id` = $id"); } //计算二者的胜率期望值 public function expect($Ra,$Rb) { $Ea = 1/(1+pow(10,($Rb-$Rb)/400)); return $Ea; } //计算最后得分 public function calculateScore($Ra,$Ea,$num) { $Ra = $Ra + self::$K*($num-$Ea); return $Ra; } //获取本次参与评选的两位美女id,以及获胜方id:0,1 public function selectStu() { $id1 = $_POST['stu1']; $id2 = $_POST['stu2']; $victoryid = $_POST['vid']; return $this->getScore($id1,$id2,$victoryid); } //计算得分 public function getScore($id1,$id2,$victoryid) { $Ra = $this->queryScore($id1); $Rb = $this->queryScore($id2); if ($Ra & $Rb) { $Ea = $this->expect($Ra, $Rb); $Eb = $this->expect($Rb, $Ra); $Ra = $this->calculateScore($Ra, $Ea, 1-$victoryid); $Rb = $this->calculateScore($Rb, $Eb, $victoryid); $Rab = array($Ra,$Rb); $this->updateScore($Ra, $id1); $this->updateScore($Rb, $id2); return $Rab; } else { return false; } } } $Rank = new Rank(); $Rank->selectStu();
代码示例讲解:若前端页面展示的两位女生的 id 为 3 和 7,若用户选择 3,则 js 向后台传递的数据为 3,7,0,后台处理 女生 a 的 id 为3,女生 b 的 id 为7,获胜的 id 为 0 ,表示第一个获胜,则本轮真实得分 :a 的得分为 1,b 的得分为 0。计算调整后分数时:$Ra = $this->calculateScore($Ra, $Ea, 1); $Rb = $this->calculateScore($Rb, $Eb, 0);,代码中使用 1-$victoryid 和 $victoryid 来处理。
现在进入 Beauty 目录,开启 PHP 内置服务器,打开浏览器就可以看到效果了。
三、总结
本次实验通过校花评选项目,让我们对前端布局和后端 PHP 编码能力有了较大提升。同时也了解并运用埃洛登记分系统算法对校花进行评比。
本项目的完整代码及demo,可在 实验楼 查看并在线完成: PHP - 校花评比排名项目
更多PHP经典项目: PHP全部 - 课程