《C#程序设计》第六次作业:《猜猜看》游戏

3 篇文章 0 订阅

本周作业布置地址:http://user.qzone.qq.com/303727350/blog/1433931626。

信管1123 林少鑫 201211671312

完成目标:随机显示一张相片与若干个名字,选择正确的名字。选择正确或失败均会在数据库中更新数据。随机显示出现率与正确率正相关。

注:由于不限开发语言,因此选择最熟悉的PHP,数据库依然为mysql,开发环境为windows下的apache。

截图如下:






完整文件结构:


主要代码如下():

<index.php>

<?php 
require_once 'include.php';
if ($_SESSION['isset']==0){
	$arr[]=main();
	$_SESSION['imgPath']=$arr[0][0]['imgPath'];
	$_SESSION['name1']=$arr[0][0]['name1'];
	$_SESSION['name2']=$arr[0][0]['name2'];
	$_SESSION['name3']=$arr[0][0]['name3'];
}
if ($_SERVER["REQUEST_METHOD"] == "POST"){
	$arr[0][0]['imgPath']=$_SESSION['imgPath'];
	$arr[0][0]['name1']=$_SESSION['name1'];
	$arr[0][0]['name2']=$_SESSION['name2'];
	$arr[0][0]['name3']=$_SESSION['name3'];
	if(result($_POST['name'])){
		yes();
		$_SESSION['isset']=0;
		alertMes("恭喜您猜对了!", "");
	}
	else {
		no();
		$_SESSION['isset']=0;
		alertMes("很可惜,您没猜对哦", "");
	}
}
?>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<style type="text/css">
.img{position:absolute;left:35%;top:10%}
.form{position:absolute;left:35%;top:65%}
.sumit1{position:absolute;left:-20px;}
.sumit2{position:absolute;left:125px;}
.sumit3{position:absolute;left:260px;}
</style>
<body>
<img class=img alt="" height="360" width="280" src=<?php echo $_SESSION['imgPath']; ?>>
<form class=form action="" method="post" enctype="multipart/form-data">
	<p>你猜TA叫什么名字?</p>
	<br /><br />
	<input class=sumit1 type="submit" name="name" value=<?php echo $_SESSION['name1'] ?>>
	<input class=sumit2 type="submit" name="name" value=<?php echo $_SESSION['name2'] ?>>
	<input class=sumit3 type="submit" name="name" value=<?php echo $_SESSION['name3'] ?>>
</form>
</body>
</html>



<func.php>
<?php
require_once 'include.php';

//获取文件列表
function getFile($dir) {
	$fileArray[]=NULL;
	if (false != ($handle = opendir ( $dir ))) {
		$i=0;
		while ( false !== ($file = readdir ( $handle )) ) {
			//去掉"“.”、“..”以及带“.xxx”后缀的文件
			if ($file != "." && $file != ".."&&strpos($file,".")) {
				$file=mb_convert_encoding ($file,'UTF-8','GBK'); //极其重要的一句话,编码问题
				$fileArray[$i]=$dir.$file;
				if($i==200){
					break;
				}
				$i++;
			}
		}
		//关闭句柄
		closedir ( $handle );
	}
	return $fileArray;
}

//初始化数据
function createSql($pwd){
	if (md5($pwd)=="cdf4f90b8adcb0e1dc28652c83dd1e14"){
		clearDate();
		$dir="./photos/";
		$array=getFile($dir);
		$mes=0;
		foreach ($array as $imgPath){
			$str=str_replace($dir, "", $imgPath);
			$arr['name']=str_replace(".jpg","",substr($str,12));
			$arr['name']=str_replace(".JPG","",$arr['name']);
			$arr['number']=substr($str,0,12);
			$arr['class']="1".substr($str,2,2).substr($str,9,1);
			$arr['imgPath']=$imgPath;
			$arr['count']="0";
			$arr['wrong']="0";
			$arr['correct']="0";
			$mes=createDate($arr);
		}
		if($mes==1)alertMes("数据初始化失败", "");
		else alertMes("数据初始化成功", "");
	}
	else alertMes("口令有误", "");
}

//弹出对话框
function alertMes($mes,$url){
	echo "<script>alert('{$mes}');</script>";
	echo "<script>window.location='{$url}';</script>";
}

//对输入内容进行处理
function check($data) {
	$data = trim($data);
	$data = stripslashes($data);
	$data = htmlspecialchars($data);
	return $data;
}

//主方法
function main(){
	$ran=choose();
	$result=get("student", "*",$ran);
	while(($row = mysql_fetch_array($result))!=false){
		$arr['name1']=$row['name'];
		$arr['imgPath']=$row['imgPath'];
	}
	$_SESSION['name']=$arr['name1'];
	$arr['name2']=getName1($ran);
	$arr['name3']=getName2($ran);
	$arr['value']=1;
	$arr2[]=ranName($arr);
	$_SESSION['isset']=1;
	return $arr2;
}

//挑选一名学生
function choose(){
	$n=getN();
	$ran1=rand(1, $n);
	$ran2=rand(1, $n);
	$result1=get("student", "*",$ran1);
	while(($row1 = mysql_fetch_array($result1))!=false){
		$result2=get("student", "*",$ran2);
		while(($row2 = mysql_fetch_array($result2))!=false){
			if($row1['count']!=0&&$row2['count']!=0){
				$rate1=$row1['correct']/$row1['count'];
				$rate2=$row2['correct']/$row2['count'];
				if($rate1>$rate2){
					$ran1=$ran2;
				}
			}
			else if($row1['count']!=0){
				$ran1=$ran2;
			}
		}
	}
	return $ran1;
}

//获取一个学生名字
function getName1($ran0){
	$name=null;
	$n=getN();
	$ran=rand(1, $n*0.5);
	if ($ran==$ran0)
		$ran--;
	$result=get("student", "*",$ran);
	while(($row = mysql_fetch_array($result))!=false){
		$name=$row['name'];
	}
	return $name;
}

//获取又一个学生名字
function getName2($ran0){
	$name=null;
	$n=getN();
	$ran=rand($n*0.5+1, $n);
	if ($ran==$ran0)
		$ran--;
	$result=get("student", "*",$ran);
	while(($row = mysql_fetch_array($result))!=false){
		$name=$row['name'];
	}
	return $name;
}

//打乱三个学生名字顺序
function ranName($arr){
	$i=rand(1, 3);
	if ($i==1){
		$temp=$arr['name1'];
		$arr['name1']=$arr['name2'];
		$arr['name2']=$temp;
	}
	else if ($i==2){
		$temp=$arr['name1'];
		$arr['name1']=$arr['name3'];
		$arr['name3']=$temp;
	}
	return $arr;
}

//对点击结果进行判断
function result($name){
	if ($_SESSION['name']==$name)return 1;
	else return 0;
}

//点击正确
function yes(){
	change("correct");
}

//点击错误
function no(){
	change("wrong");
}













<mysql.func.php>
<?php 
/**
 * 连接数据库
 * @return resource
 */
function connect(){
	$link=mysql_connect(DB_HOST,DB_USER,DB_PWD) or die("数据库连接失败Error:".mysql_errno().":".mysql_error());
	mysql_set_charset(DB_CHARSET);
	mysql_select_db(DB_DBNAME) or die("指定数据库打开失败");
	return $link;
}

function clearDate(){
	mysql_query("truncate student");
}

function getN(){
	$result=mysql_query("select count(*) from student");
	while(($row = mysql_fetch_array($result))!=false){
		$n=$row[0];
	}
	return $n;
}

/**
 * 初始化
 * @param string $table
 * @param array $array
 * @return string
 */
function createDate($array){
	$keys=join(",",array_keys($array));
	@$vals=isset($vals)?$vals:"'".join("','",array_values($array))."'";
	$sql="insert into student($keys)values({$vals})";
	if (mysql_query($sql))$is=1;
	else $is=0;
	if($is==0)return 1;
}

function get($table,$name,$value){
	$result = mysql_query("select {$name} from {$table} where id=($value)");
	return $result;
}

function change($name){
	$sql="update student set count=count+1,{$name}={$name}+1 where name='{$_SESSION['name']}'";   //注意空格问题
	mysql_query($sql);
}


总结:

遇到的第一个问题依旧是编码问题,通过$file=mb_convert_encoding ($file,'UTF-8','GBK');这一句解决,感觉每次进行有关文件操作的时候都会遇到这样的问题,应该找个时间整合一下,方便自己,也可以给别人帮助。

第二个问题是mysql语句的错误,花了很多时间才改正完成,感觉是熟练度仍然不够,才会低效率。

第三个问题是数组,对于php的数组用的不少,但是经常会遇到问题,花费大量时间处理。

第四个考虑的问题是session,大量将session作为全局变量不知道合不合适,感觉是自己没把整个结构设计好,因此才会需要大量的session作辅助。

第五个考虑的问题是,这个程序完全没有面向对象,自己的感觉就是一步一步写,函数的调用按照先后顺序进行,接触编程三年多,投入的时间精力太少,感觉还是在用很低级的方式编程。

核心算法很简单,如下:

总人数N,ran1=ran(1—N),ran2=ran(1—N),比较ran1和ran2正确率,选择正确率低者为相片来源;

随机一个名字ran3=ran(1—N/2),随机又一个名字ran4=ran(N/2+1—N),两名字均不与ran1相同即可,这样就有三个名字可选择。

通过计算,在正常情况下,正确率从高到低排列者出现率为:1/N*N、3/N*N、5/N*N……(2*N-3)/N*N、(2*N-1)/N*N。

以上算法满足以下四原则:

原则1:认识概率 高的学生,在猜猜看游戏中出现的频率相对低一些。
原则2:认识概率 低的学生,在猜猜看游戏中出现的频率相对高一些。
原则3:认识概率 100%的学生,也有出现的可能性。
原则4:认识概率 0%的学生,也不必每次都出现。

这个功能只是猜猜看游戏我可以设计出来的其中一部分,因为最近课程设计和考试原因,没有时间精力投入,仅用了半天时间完成这个小程序,考完试有时间再进行扩展。欢迎指正。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值