用PHP做颜值计算,评选校花

   2016-10-01 0
核心提示:项目简介:分析利用《社交网络》中评比算法,通过两两美女之间比较,计算出颜值,得出美女排名,PHP结合前端相关技术实现。想超越facebook?先做一个你自己的校花评选网站吧!一、实验简介1.1 实验目的? 本次实验将带领大家完成一个有趣的 PHP 项目:校花评选

用PHP做颜值计算,评选校花

项目简介:分析利用《社交网络》中评比算法,通过两两美女之间比较,计算出颜值,得出美女排名,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做颜值计算,评选校花

评选过程:

用PHP做颜值计算,评选校花

评选结果:

用PHP做颜值计算,评选校花

二、项目制作

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全部 - 课程

 
标签: PHP 数据库
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • php-fpm进程管理的三种模式 phpfpm子进程
    php-fpm进程管理的三种模式 phpfpm子进程
    php-fpm解读-进程管理的三种模式—程序媛大丽标明转载以示尊重 感谢原作者的分享。php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worke
    03-08
  • nginx和php-fpm 是使用 tcp socket 还是 unix s
    tcp socket允许通过网络进程之间的通信,也可以通过loopback进行本地进程之间通信。unix socket允许在本地运行的进程之间进行通信。分析从上面的图片可以看,unix socket减少了不必要的tcp开销,而tcp需要经过loopback,还要申请临时端口和tcp相关资源。但是
    03-08
  • [PHP8] 我参加了PHP8工程师认证初学者考试beta考试
    [PHP8] 我参加了PHP8工程师认证初学者考试beta
    前几天,2022/08/05,PHP工程师认证机构PHP8 技术员认证初级考试宣布实施考试将于 2023 年春季开始。和 beta 测试完成于 2022/09/11所以我收到了。一般社团法人BOSS-CON JAPAN(代表理事:Tadashi Yoshimasa,地点:东京都世田谷区,以下简称“BOSS-CON JAPAN
    03-08
  • 将 PHP Insights 放入旧版 PJ 不是很好吗?谈论
    将 PHP Insights 放入旧版 PJ 不是很好吗?谈论
    介绍在最近的PHP系统开发中,感觉故事在理所当然包含静态分析工具的前提下进行。我的周围现有代码很脏,我很久以前安装了工具,但几乎没有检查已经观察到许多这样的案例。 (这是小说。而不是像 0 或 100 这样不允许单行错误的静态分析,一点一点,逐渐我想介
    03-08
  • PHP基于elasticsearch全文搜索引擎的开发 php使
    1.概述:全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接
    02-09
  • php视图操作
    一、视图的基本介绍         视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。        使用视图需要MySQL5及以后的版本支持。        下面是视图的一些常见应用:        重用SQL语句;        简化复杂的S
    02-09
  • php中图像处理的常用函数 php图形图像处理技术
    php中图像处理的常用函数 php图形图像处理技术
    1.imagecreate()函数imagecreate()函数是基于一个调色板的画布。?php $im = imagecreate(200,80);                //创建一个宽200,高80的画布。$white = imagecolorallocate($im,225,35,180);     //设置画布的背景颜色imagegif($im);
    02-09
  • PHP安全之webshell和后门检测
    PHP安全之webshell和后门检测
    基于PHP的应用面临着各种各样的攻击:XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点。攻击者可以利用它盗取用户信息。你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入)来防范XSS攻击SQL注入:这是PHP应用中,数据库层的易受攻击点。防范
    02-09
  • php使用时间戳保存时间的意义 PHP获取时间戳
    时间戳记录的是格林尼治时间,使用date格式化的时候会根据你程序设置的不同时区显示不同的时间。如果使用具体时间,则还需要进行多一步转换。
    02-09
  • PHP 获取提交表单数据方法
    PHP $_GET 和 $_POST变量是用来获取表单中的信息的,比如用户输入的信息。PHP表单操作在我们处理HTML表单和PHP表单时,我们要记住的重要一点是:HTML页面中的任何一个表单元素都可以自动的用于PHP脚本:表单举例: htmlbodyform action="welcome.php" method
    02-09
点击排行