1.php及数据库
2.街机模拟器MAME Plus!的源码使用方法
3.å¦Pythonè½å¹²ä»ä¹ï¼
php及数据库
PHP调用三种数据库的方法
本文比较详细的介绍PHP调用MySQL、ODBC以及ORACLE数据库。源码
MySQL是源码一个小巧灵珑的数据库服务器软件,对于中、源码小型应用系统是源码非常理想的。除了支持标准的源码csdn html源码背景ANSI SQL语句外,最重要的源码是,它还支持多种平台,源码而在Unix/Linux系统上,源码MySQL支持多线程运行方式,源码从而能获得相当好的源码性能。它和PHP、源码 Apache一样,源码是源码属于开放源代码软件。其官方网站是源码:,上面提供Windows,Linux,Unix版本的源代码的下载。
注意,MySQL访问函数都需要有相应的权限才能运行。常用的相关函数介绍如下:
(1)integer mysql_connect(主机,用户名,口令);
此函数开始一个对指定主机上的MySQL数据库的连接。若该数据库位于一个不同地端口,则在主机名后加上冒号和端口号。所有参数均为可选的,缺省情况下分别对应为本地主机、用户正在执行的脚本名和空。主机可以是IP地址或域名。
在脚本执行结束时,连接被自动关闭,也可以用mysql_close提前关闭。
(2)boolean mysql_create_db(数据库名);
创建一个数据库。注意必须用一个带有创建数据库许可权的帐号打开连接。
(3)boolean mysql_select_db(数据库名,连接号);
选择缺省数据库。
(4)integer mysql_query(SQL语句,连接号);
对指定数据库进行查询。如果SQL语句是select,则返回一个结果号,否则返回的值可以不理会。如果失败,返回false.。
(5)array mysql_fetch_array(结果号);
取出下一行,返回一个数组.可以用数字下标访问(第一个字段是下标 0),也可以用字符串下标访问(即使用各字段名)。如已取了最后一行,返回 false.。
(6)mysql_fetch_row(结果号);
返回一个矩阵代表结果集中一行的所有域。每次调用都会产生下一行,直到没有行剩下时返回false。每个域值都由一个从零开始的偏移量索引。这是从查询中获取结果的最快方法。
(7)integer mysql_num_rows(结果号);
返回结果集中行的数目
(8)integer mysql_num_fields(结果号);
返回结果集中域的数目。
(9)integer mysql_list_dbs();
向服务器查询数据库列表。它返回一个结果指针,该指针可用于mysql_fetch_row函数及类似函数。
()mysql_list_tables(数据库名);
获取一个指向指定数据库的表单列表的结果指针。该结果指针可用于任何从结果集中获取行的函数。
()mysql_close(连接号);
关闭对数据库的连接。连接必须是由mysql_connect打开的。该函数的使用不是严格必需的,因为在脚本结束时,所有非永久链路都会被自动关闭。
()mysql_pconnect(主机,用户名,口令);
与mysql_connect完全相似,但建立一个"永久连接",该连接一经建立永不关闭,即使使用mysql_close函数或程序执行完毕也不关闭.下一次试图建立永久连接时,系统如发现已存在一个永久连接,则直接返回该连接号而不重新创建。
下面是一个调用MYSQL数据库并分页显示的例子。
<?
$pagesize = 5; //每页显示5条记录
$host="localhost";
$user="user";
$password="psw";
$dbname="book"; //所查询的库表名;
//连接MySQL数据库
mysql_connect("$host","$user","$password") or die("无法连接MySQL数据库服务器!");
$db = mysql_select_db("$dbname") or die("无法连接数据库!");
$sql = "select count(*) as total from pagetest";//生成查询记录数的SQL语句
$rst = mysql_query($sql) or die("无法执行SQL语句:$sql !"); //查询记录数
$row = mysql_fetch_array($rst) or die("没有更多的记录!"); /取出一条记录
$rowcount = $row["total"];//取出记录数
mysql_free_result($rst) or die("无法释放result资源!"); //释放result资源
$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出总共有几页
if(!isset($pageno)) {
$pageno = 1; //在没有设置pageno时,缺省为显示第1页
}
if($pageno<1) {
$pageno = 1; //若pageno比1小,则把它设置为1
}
if($pageno>$pagecount) {
$pageno = $pagecount; //若pageno比总共的页数大,则把它设置为最后一页
}
if($pageno>0) {
$href = eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF转换为可以在URL上使用的字符串,这样的话就可以处理中文目录或中文文件名
if($pageno>1){ //显示上一页的裢接
echo "<a href="" . $href . "?pageno=" . ($pageno-1) . "">上一页</a> ";
}
else{
echo "上一页";
}
for($i=1;$i<$pageno;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
echo $pageno . " ";
for($i++;$i<=$pagecount;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
if($pageno<$pagecount){ //显示下一页的裢接
echo "<a href="" . $href . "?pageno=" . ($pageno+1) . "">下一页</a> ";
}
else{
echo "下一页 ";
}
$offset = ($pageno-1) * $pagesize;//算出本页第一条记录在整个表中的位置(第一条记录为0)
$sql = "select * from pagetest LIMIT $offset,$pagesize";//生成查询本页数据的SQL语句
$rst = mysql_query($sql);//查询本页数据
$num_fields = mysql_num_fields($rst);//取得字段总数
$i = 0;
while($i<$num_fields){ //取得所有字段的名字
$fields[$i] = mysql_field_name($rst,$i);//取得第i+1个字段的名字
$i++;
}
echo "<table border="1" cellspacing="0" cellpadding="0">";//开始输出表格
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){ //显示字段名称
echo "<th>$field_name</th>";
}
echo "</tr>";
while($row=mysql_fetch_array($rst)){ //显示本页数据
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){ //显示每个字段的值
$field_value = $row[$field_name];
if($field_value==""){
echo "<td> </td>";
}
else{
echo "<td>$field_value</td>";
}
}
echo "</tr>";
}
echo "</table>";//表格输出结束
mysql_free_result($rst) or die("无法释放result资源!");//释放result资源
}
else{
echo "目前该表中没有任何数据!";
}
mysql_close($server) or die("无法与服务器断开连接!");//断开连接并释放资源
>开放数据库连接(ODBC)已成为一种与数据库进行通信的工业标准。PHP也提供了标准的接口,使得PHP能调用Access,SQL SERVER等数据库。其相关函数是:
(1)integer odbc_connect(string dsn, string user, string password)
连接到一个ODBC数据库源名字上。
(2)integer odbc_exec(integer connection,gradle plugin 源码 string query)或 odbc_do(integer connection, string query)
在一个连接上执行查询。
(3)boolean odbc_fetch_row(integer result, integer row)
从一个结果集中获取一行数据。Row参数是可选的,若为空缺,则返回下一个有效行。在结果集中不再剩余行时返回false。
(4)boolean odbc_close(integer connection)
关闭一个数据库的连接。若在该连接上有打开的事务,则返回一个错误,而且连接不会被关闭。
最后,还是看个分页的例子:
<?
//设定每页显示条数
$show_num = ;
$spages = $pages;//避免$pages后期被改变
//定义连接
$dsn = "localhost";
$user = "sa";
$password = "";
//计算总记录数
$rs_num = "select count(*) as id from bbs where zu='0' and lei='".$lei."'";
$conn_id = odbc_connect($dsn,$user,$password);
$rnum = odbc_exec($conn_id,$rs_num);
while(odbc_fetch_row($rnum)){
$total_rs = odbc_result($rnum,"id");//将总记录数放入$total_rs变量
}
//计算与页有关的条数
$nnn = $total_rs / $show_num;//计算总页数
$hnnn = intval($nnn);//将总页数取整
$cnnnn = $nnn - $hnnn;
//计算所需总页数
switch ($cnnn){
case "0":
$hnnn++;
$nnn = $hnnn;//总页数
break;
default :
$nnn = $hnnn;//总页数
break;
};
if ($nnn == 0)$nnn++;
//计算页面改变所需的条件
$fore = $pages;
$next = $pages;
$fore -= 1;
$next += 1;
if ($fore > 0) {
echo "<a>首页</a>";
echo "<a>前页</a>";
};
if ($pages < $nnn) {
echo "<a>后页</a>";
echo "<a>尾页</a>";
};
echo "共".$nnn."页";
$query_string = "SELECT * FROM table where condition order by you wanted order";
$cur = odbc_exec($conn_id,$query_string);
//取到循环的顶部
$cnum = ($pages-1) * $show_num;//计算当前的记录游标的位置
//空循环到显示记录游标处
if ($cnum != 0){
for ($i=0;$i<=$cnum;odbc_fetch_row($cur));
};
$i=1;
//显示记录
while(odbc_fetch_row($cur)){
echo ;
if ($i == $show_num){ //在不满页数时跳出程序
break;
};
$i++;
};
//关闭连接
odbc_close($conn_id);
>Oracle(甲骨文)是世界上最为流行的关系数据库。它是大公司推崇的工业化的强有力的引擎。我们先看看其相关的函数:
(1)integer ora_logon(string user , string password)
开始对一个Oracle数据库服务器的连接。
(2)integer ora_open(integer connection)
打开给出的连接的游标。
(3)integer ora_do(integer connection, string query)
在给出的连接上执行查询。PHP生成一个指示器,解析查询,并执行之。
(4)integer ora_parse(integer cursor, string query)
解析一个查询并准备好执行。
(5)boolean ora_exec(integer cursor)
执行一个先前由ora_parse函数解析过的查询。
(6)boolean ora_fetch(integer cursor)
此函数会使得一个执行过的查询中的行被取到指示器中。这使得您可以调用ora_getcolumn函数。
(7)string ora_getcolumn(integer cursor, integer column)
返回当前的值。列由零开始的数字索引。
(8)boolean ora_logoff(integer connection)
断开对数据库服务器的链接。
以下是向ORACLE数据库插入数据的示例程序:
<html>
<head><title>向ORACLE数据库中插入数据</title></head>
<body>
<form action="<?echo $PHP_SELF;?>" method="post">
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>ID</th>
<th>name</th>
<th>Description</th>
</tr>
<tr>
<td><input type="text" name="name" maxlength="" size=""></td>
<td><input type="text" name="email" maxlength="" size=""></td>
<td><input type="text" name="Description" maxlength="" size=""></td>
</tr>
<tr align="center">
<td colspan="3"><input type="submit" value="提交"> <input type="reset" value="重写"></td>
</tr>
</table>
</form>
<?
//先设置两个环境变量ORACLE_HOME,ORACLE_SID
putenv("ORACLE_HOME=/oracle/app/oracle/product/8.0.4");
putenv("ORACLE_SID=ora8");
//设置网页显示中文
putenv("NLS_LANG=Simplified_Chinese.zhscgb");
if($connection=ora_logon("scott","tiger")) {
//库表test有ID,name,Description三项
$sql = 'insert into test(ID,name,Description) values ';
$sql .= '('' . $ID . '','' . $name . '',''. $Description . '')';
if($cursor=ora_do($connect,$sql)) {
print("insert finished!");
}
$query = 'select * from test';
if($cursor=ora_do($connect,$query)) {
ora_fetch($cursor);
$content0=ora_getcolumn($cursor,0);
$content1=ora_getcolumn($cursor,1);
$content2=ora_getcolumn($cursor,2);
print("$content0");
print("$content1");
print("$content2");
ora_close($cursor);
}
ora_logoff($connection);
}
></body>
</html>
通过PHP你可以轻松的连接到数据库,请求数据并将其显示在你的web站点中,甚至修改数据库中的数据。 MySQL是一种很流行的数据库,并且在互联网中有许多有关PHP与MySQL的教程。MySQL是免费的,这一点也许就吸引了不少人。由于其广泛应用, 我就不想在这里赘述MySQL的使用方法了。Oracle被大量在企业应用中采用,因此我们就利用Oracle来介绍PHP与数据库的连接。我们当然不会 提及Oracle数据库的设计原理,原因是这已经超出了我们的讨论范围。
PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数。其中ORA_函数略显陈旧。OCI函数更新据说更好一些。两者的使用语法几乎相差无几。如前所述,你的PHP安装选项应该可以支持两者的使用。
想获得更多有关在Microsoft Windows平台上安装支持PHP3的Apache服务器的知识以及更多有关Oracle数据库的知识,请查阅以下URL:。
4.1 连接
if ($conn=Ora_Logon("user@TNSNAME","password"))
{
echo "SUCCESS ! Connected to database\n";
}
else
{
echo "Failed :-( Could not connect to database\n";
}
Ora_Logoff($conn);
phpinfo();
>以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。
4.2 查询
假设与数据库已经连接就绪,下面我们就来实际的应用对数据库的查询。下面的代码演示了一个连接并查询的典型例子:
/*
* 连接数据库并执行查询
*/
function printoraerr($in_cur)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
if(ora_errorcode($in_cur))
echo "Oracle code - ".ora_error($in_cur)."\n";
return;
}
/** 主程序 */
if (!($conn=ora_logon("user@TNSNAME","password")))
{
echo "Connection to database failed\n";
exit;
}
echo "Connected as connection - $conn
\n";
echo "Opening cursor ...
\n";
$cursor=ora_open($conn); printoraerr($cursor);
echo "Opened cursor - $cursor
\n";
$qry="select user,sysdate from dual";
echo "Parsing the query $qry ...
\n";
ora_parse($cursor,$qry,0); printoraerr($cursor);
echo "Query parsed
\n";
echo "Executing cursor ...
\n";
ora_exec($cursor); printoraerr($cursor);
echo "Executed cursor
\n";
echo "Fetching cursor ...
\n";
while(ora_fetch($cursor))
{
$user=ora_getcolumn($cursor,0); printoraerr($cursor);
$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
echo " row = $user, $sysdate
\n";
}
echo "Fetched all records
\n";
echo "Closing cursor ...
\n";
ora_close($cursor);
echo "Closed cursor
\n";
echo "Logging off from oracle...
\n";
ora_logoff($conn);
echo "Logged off from oracle
\n";
>(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
4.3 显示结果
以下代码演示了怎样查询数据库并将结果输出:
function printoraerr($in_cur, $conn)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
// If it encountered an error, we exit immediately
if(ora_errorcode($in_cur))
{
echo "Oracle code - ".ora_error($in_cur)."
n";
ora_logoff($conn);
exit;
}
return;
}
function exequery($w_qry,$conn)
{
$cursor=ora_open($conn); printoraerr($cursor,$conn);
ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
ora_exec($cursor); printoraerr($cursor,$conn);
$numrows=0;
$w_numcols=ora_numcols($cursor);
// 显示头部
echo "
\n";
for ($i=0;$i<$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
echo "\t ".ora_columnname($cursor,$i)." \n";
}
echo "
\n";
while(ora_fetch($cursor))
{
echo " \n";
for ($i=0;$i<$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
if(ora_columntype($cursor,$i)=="LONG")
echo " ".
ora_getcolumn($cursor,$i)."
\n";
else
echo " ".ora_getcolumn($cursor,$i)." \n";
printoraerr($cursor,$conn);
}
$numrows++;
echo "
\n";
}
if ($numrows==0)
echo " Query returned no records
\n";
else
{
echo " \n";
echo " Count \n";
echo " $numrows \n";
echo "
\n";
}
echo " \n";
ora_close($cursor);
return;
}
// 主程序
if(!($conn=ora_logon("user@SID","password")))
{
echo "Error: Cannot connect to database\n";
exit;
}
$qry="SELECT
deptno \"Dept\"
,empno \"Emp\"
,empnm \"Name\"
,salary \"Salary\"
FROM
employee
ORDER BY 1,2";
exequery($qry);
ora_logoff($conn);
>(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
4.4 基于HTTP的Oracle登录
将以下代码加在PHP页面代码之前以确认Oracle登录。注意你必须正确设定$ SID。
if(!isset($PHP_AUTH_USER))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 Unauthorized");
$title="Login Instructions";
echo "
You are not authorized to enter the site
\n";
exit;
}
else
{
if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 Unauthorized");
$title="Login Instructions";
echo "
You are not authorised to enter the site
\n";
exit;
}
}
>街机模拟器MAME Plus!的使用方法
MAME超详细教程(MAME)
MAME是Multiple Arcade Machine Emulator,也就是"多类型街机模拟器"的简称,是一个DOS环境下的应用程序,由MAME小组开发。这是一个仍在不断更新、完善的模拟器,也是一个模拟街机游戏数量最多的模拟器——到目前最新的. beta 版本(2K)已超过个街机游戏,许多现在市面上已经绝迹的老游戏,已经和正准备在MAME上恢复青春。MAME走的是"多机种制霸"的路线,大肆入侵原来由Callus、NeoRage、Rage、Raine、M、Shark等等贫机种模拟器所盘踞的领域,目前,php 支付源码已经模拟了以Z族、族、族等8位CPU和以K族等/位CPU为主处理器的多种街机基板,其中包括了大名鼎鼎的Capcom System 1和SNK MVS(Neo Geo)这样的王牌位基板,使得MAME成了Callus和NeoRage之外的又一顶尖选择。自年诞生以来,MAME在以Nicola Salmoria为主程序员的制作小组以及许多协力人员的共同努力之下,在各方面持续吸收先进技术,不断进行版本更新,支持新的硬件,增加被模拟游戏的数量,为MAME成为模拟器王者奠定了坚实的基础。
MAME主要是用C语言进行编程的,使用Allegro工具开发包。它还是模拟器界少有的完全开放源代码的模拟器之一,任何人想对MAME进行修改的话,只要同意把自己所用的代码公开,并遵循他们制定的规则(主要是:不得用于商业牟利等等),MAME小组就允许他对MAME加以改进并自由发行。基于这种特性,其他的程序员便可以自由的利用其源代码为蓝本编写出各种增强版本的MAME,使它成为拥有最多变种的模拟器,比较著名的有:对应各种流行OS的如MacMAME、LinuxMAME、OS2MAME、RISCMAME、BeOSMAME、WindowsCEMAME(为各种PocketPC所用)等,即便在PC平台上,也有专为AMD、 PII、以及PC等各种CPU进行优化的版本,以及C语言、汇编语言两个不同编译核心的版本;有专门模拟NeoGeo的KBMAME(For IBM)、NeoMAME(For Mac),以及一些局部增强版的MAME,如提供按键连发功能的EmuPlus、图像输出功能增强的VsyncMAME、AdvanceMAME等;还有一个利用其源码编写的跨越家用机、早期8-位电脑平台的多用模拟器MESS(反正核心都是K、Z、之类CPU的模拟);值得一提的是一个用在柯达DC///数码相机上的版本MAMED,虽然我没有用过这个相机版,详细的情况还不是太了解,但是鉴于现在的FlashMemory卡容量越来越大,我想这个版本在游戏的存储上应该没有什么问题(当然暂不包括NeoGeo类的超大游戏),如果再能增添手柄之类方便于控制的外设,或许相机版MAME能够成为目前任何一款游戏掌机的劲敌——只是价格障碍实在太大;MAME team还发行一个名为MAME的Windows版本,具备标准的GUI界面,大大方便了众多初级玩家,同样的,它也拥有支持TCP/IP协议的NETMAME、非官方版本UOMAME、多国语言提示的MAMELang、Neogeo专用增强版本NMAME等多个变种。我现在介绍的就是新发行的官方版本MAME和MAME,至于其他的衍生版,相信大家看完本文之后,一定会触类旁通的。
一、 系统需求:
自然是越高级越好了,不过至少都要PMMX/M/Vesa2.0显卡,这个级别的机器可以让你的模拟器完美的运行所有8bit主CPU的街机游戏,但是对于以K这样的bitCPU为主处理器的基板的模拟就差一点了,显示帧速率在-fps左右,Neogeo类的大容量的游戏速度还更慢一些。虽然这样的帧速率较街机标准fps还有一定差距,但是马马虎虎也可以接受了。以目前的状况来说,一台Mhz+以上的兆外频CPU+M内存就基本可以满帧跑MAME所有的游戏了,如果你想在街机显示器上使用MAME,那么最好选用自带VBE3.0的显卡,SDD是没有用的。此外,因为内存管理的垂钓网站源码原因,在纯DOS下工作时,MAME需要调用一个保护模式下的管理软件cwsdpmi.exe共同与之工作,我们必须将这个程序放在path指定的路径之内。
二、 MAME的获得与安装:
作为一个完全免费的模拟器, MAME的各个版本基本上都是在网上以Zip文件形式发行的,我们可以去到其官方站点下载回来使用。当然了,对于这样一个著名的模拟器,国内外许多大大小小的模拟器站点也都会提供相关下载,比如Emuhq、Classicgaming、Arcade@Home等,过去国内的模拟器站点一般只提供指向国外服务器的下载链接,现在也都提供本地下载了。在一阵风的bleem!、impact等等的热潮过后,MAME这个持续更新的老牌模拟器正逐渐为本土的玩家所重视,国内许多的站点已经同步提供新版本的MAME本地下载了。一些光碟杂志也会附带有MAME,但时效性不强。
获得MAME的Zip文件后,用Winzip之类程序将其解压至你所指定的目录,安装就算完成了,如果你使用DOS版的PKzip来解压,请记得加上 -d 参数以确保解压后的目录结构的准确性。MAME主目录下有以下几个目录,用于存放相关数据:
<HI>存放游戏最高分存档;
<SNAP>存放游戏抓图,旧版本的抓图目录名为<PCX>,而MAME的相同功能目录过去名为<IMAGES>,自.b5起改为与DOS版相同的<SNAP>了;
<INP>存放游戏纪录;
<CFG>存放对应每一个已经运行过的游戏的配置文件;
<STA>存放游戏状态数据;
<MEMCARD>NeoGeo游戏专用的虚拟记忆卡;
<ROMS>顾名思义,存放各种ROM的缺省目录;
<SAMPLES>存放游戏声音采样数据的目录。
<NVRAM>存放有关基板参数设定的目录,作用和基板上用于存放调试参数的SRAM是一样的。
<FLYERS>MAME专用,存放游戏海报图像文件的目录。
<CABINETS>MAME专用,存放街机箱体照片图像文件的目录。
<ICONS>MAME专用,存放游戏小图标的目录。
三、 ROM镜像文件:
MAME只是一个模拟器程序,如果要玩被模拟的街机游戏,还需要这个游戏的ROM镜像文件。通常,街机上的游戏文件都是放在诸如mask ROM(掩膜只读存储器)、EPROM/EEPROM(可擦写存储器)等半导体存储器集成电路芯片当中并固定在基板上的——这种高速但昂贵的存储方式至今未有太大改变——要把这些ROM芯片直接用于PC上当然不是很方便,于是便有人以专门的读写器将街机基板上每一颗ROM芯片内的内容全部拷贝出来,形成一一对应的电脑文件,这就是模拟器可用的ROM镜像文件的由来,而进行这项工作的人就是受到我们广大模拟器爱好者所尊敬的Dumper了;现在在互联网上传播的ROM镜像一般都是经过压缩打包的Zip格式,但我们在使用的时候不必将其解开——和其他模拟器一样,MAME很早(从V.开始吧)就支持Zip文件的直接内存展开操作了。这样就大大节省了我们的存储空间。为方便管理,我们最好把这些ROM文件放入专门的目录。
平常我们在玩MAME的时候,可能会遇上这样的问题:旧版本MAME用得好好的ROM文件,新版本的MAME却给出"xxxx文件校验错误、xxx文件未找到"这样的提示并拒绝执行,或者勉强执行后,部分功能却失效了之。这是怎么回事呢?原来,除去ROM文件真的不存在、ROM路径指向错误(下文祥述)之外,ROM的版本问题就是造成这种现象的主要原因。有的游戏ROM在拷贝的时候,由于dumper自身的技术水平或所用读写器的限制,造成了部分数据丢失、错误或无法完全读出,导致ROM镜像残缺。之后又有人重新制作,或修正,或补充,qemu img 源码把过去错误的ROM版本补完。新版的模拟器当然要支持矫正了的ROM,所以旧的ROM就不能用了,解决的办法就是更新你的ROM镜像——当然了,使用旧版本的MAME也可以。下载站点我个人推荐Emuviews,这个站点的ROM分门别类摆放,非常齐全,而且几乎都是更新版的,并随着模拟器的更新不断补充新的ROM,还有最重要的一个优点就是:下栽速度极快。另外还有一个我强烈推荐的MAME ROM专门站:www.mame.dk,该站内建ROM搜索引擎,这个搜索引擎可比emuviews的强多了,ROM数量可以说是最齐全的,速度也不错,另外,该站对每一个ROM的描述也是非常的完备(现在,Emuviews也提供了类似mame.dk那样的ROM下载、评价页面了)。此外,网上还有其他专门的补完ROM站,读者可在文末的MAME资源中查到。
顺便提一句:MAME使用的各个ROM文件都是各个游戏公司的呕心沥血之作,版权也是属于各自的制作公司的,如果你没有对应的街机基板,拥有这些ROM是非法行为,这个原则大家一定要清楚。
四、 MAME主要配置参数:
既然是DOS下的应用程序,MAME不可避免的就需要用命令行的方式来启动各种游戏和激活各项参数,呵呵,又回到了“遥远”的DOS时代了……OK,言归正传,MAME的运行命令为:mame [游戏ROM名] [参数]
[游戏ROM名]这一项要求填入MAME规定的游戏名称,实际上就是ROM的Zip文件名。MAME对游戏名的正确输入要求较高,所以最好不要对下载的ROM文件进行改名操作。现在的MAME包含了一个ROM名比较程序来处理ROM名问题:当你输入的游戏名不正确时,ROMCMP.EXE会在MAME的游戏名库中找到一个最接近你所输入文字的游戏名并执行之。对于第一次运行的ROM,MAME会出现一个版权提示,而那些游戏模拟程度上有些问题的ROM,则每一次运行都会提示该游戏部分功能不齐全,我们看完这些提示后,按照其要求顺序按"O""K"(或者按方向键“左”、“右”亦可)两个健就能继续游戏了。和NeoRage一样,如果需要运行NeoGeo的游戏的话,还必须拥有一个名为neogeo.zip的BIOS压缩档,其中包含neo-geo.rom、ng-sfix.rom、ng-sm1.rom、ng-lo.rom等几个文件,这个压缩档可以在我的主页上找到。我们最好把这个zip包放在MAME的<ROMS>子目录当中。
MAME的各项参数都放在名为mame.cfg的配置文件中,这是一个由MAME自动生成的文件,由于MAME的每一次更新都可能对这个配置文件的语句做出修改,所以建议各位玩家不要把旧版本MAME使用的mame.cfg沿用到新的版本,因为这样可能会导致MAME工作的不正常。另外,你也可以把参数加入命令行之内,虽然两者的作用和句法基本是一样的,但命令行参数的优先级别高于配置文件,也就是说,对同样的一个参数,MAME将执行命令行设定并忽略配置文件内的相同选项设定。下面就介绍一下MAME的几个主要的配置命令:
[directory]栏,本栏目定义路径,需要修改的只有一项:
rompath,缺省配置是MAME所在路径及其下的ROMS子目录,当你的ROM还存在于另外的目录时,可以采用追加的方式,例如:
rompath = .;ROMS;f:\download\emu\roms;f:\neogeo,追加的目录之间用分号隔开即可,这样MAME在执行时就会在指定的四个路径范围内搜寻ROM。
[config]栏,本栏是模拟器执行参数设定栏,主要参数解释如下:
tweak = no 关闭非标准VGA模式,此为缺省设定。MAME支持x、x、x、x、x之类的街机原始分辨率,这些都是与电脑标准VGA模式不同的模式,如果你的显示卡、显示器支持这些tweaked分辨率,可以将此选项设为yes,显示速度会比VESA模式快一些。
scanlines = yes 打开隔行显示模式;由于街机显示分辨率一般都比较低,打开这个类似于两行画面水平线之间插入一条黑线效果的选项,会让你觉得PC上显示的图像不是太粗糙到难以接受,同时也有一种街机显示器的感觉;基本上,这种隔行显示模式是每一个低分辨率游戏机(小于x)模拟器的缺省设定,其中包括了绝大部分2D街机模拟器、FC模拟器、SFC模拟器、MD模拟器、PCE模拟器等,不过某些模拟器的隔行显示图像的场频高达Hz以上,比如Rage、NESticle(x模式),如果这个数值超过了你的显示器的场频允许范围,那么就不能实现隔行显示,而会变成高亮度的、看起来象是被压缩的画面,甚至花屏、黑屏。如果出现这种情况的话,为了确保你的显示器的安全,最好是把隔行显示模式关闭。
stretch = yes 打开像素延展选项,使得显示的画面尽可能的大,会降低游戏速度,除非你的机器配置过低,否则不要关闭之;
vesamode = vesa3 选择VESA画面优化模式,由vesa1、vesa2b、vesa2l、vesa3等4 项可选,该用哪一项取决于你的显卡自带的VBE版本,对于新的显示卡,比如Voodoo3、TNT2之类,可以选择vesa3,若你的显卡比较老(、),则应该选择vesa2b/vesa2l,超老的、就只能选vesa1了,实在不行的话还得需要SDD来驱动。
resolution = auto由模拟器自动选择显示分辨率;我们可以把auto改为x或者x来获得接近满屏的画面,不过由于大部分街机游戏显示分辨率本来就很低,拉大之后你可能会觉得画面更粗糙了;另外,更改成上述数字后,纵版游戏和分辨率在x以上的横版游戏的画面反而变小了。
depth = 选择位显示颜色深度,某些游戏需要位高彩色才能正确显示,比如NeoGeo类、Cave类等;有必要时可以把它降到8位色以提高游戏速度。
gamma = 1. 设置伽马系数,数字越大画面越亮,可用热键控制。
frameskip = auto 自动跳帧调节,适用于大多数机器,在低配置的机器上,若你觉得游戏太慢,可以在游戏中按F9键来加大跳帧数以取得较满意的游戏速度。
注:所谓的跳帧(frame skip),就是减少单位时间内显示的帧画面,比如fps(frames per second,意每秒钟显示连续的帧静止画面)的画面只显示其中的一部分,也就是fps、fps甚至fps的效果,这固然对提高显示速度有益,但同时也会造成角色动作不连贯、画面跳跃式进行的恶果,几乎每一种模拟器都有这个可调节的选项。
soundcard = 1 声卡选择,数字表示:0-无声,1-声霸卡及兼容,3-Pro Audio Spetrum, 4-UltraSound Max,5-UltraSound,6-Windows Sound System,7-Ensoniq Soundscape,一般选1或6就行了,除非你用的是表列中别的声卡。使用创新SBPCI、SBPCI 和 Ensoniq Soundscape PCI声卡的用户最好选 7。缺省值为-1,即在初始化程序时列出声卡类型供手动选择。如果遇到声卡实在无法通过MAME的辨认而又想玩游戏,只能选用0了。
ymopl = no 禁用SoundBlaster的OPL芯片来模拟YM FM音源,虽然这两者硬件%兼容,模拟执行速度也加快,但打开这个选项会使音量控制失效。
samplerate = 声音采样频率选择,可选、、三项,单位hz,数字越大,声音还原越好,游戏速度也越慢,命令行简写为:sr。
samplebits = 声音采样深度,可选8、位,效果同上一项,命令行简写为:sb。新版本的MAME去掉了这个选项,改为自动识别了。
stereo = yes 打开立体声选择,会降低游戏速度,本项自动对单声道游戏无效。
volume = 0 音量衰减控制,可选数字是负值,单位是分贝,例如"volume -3"意为游戏音量降低3分贝,可在游戏时用键"~"直接调节,祥见下文第五部分。
mouse = yes 启用鼠标,用于光枪游戏的准星控制及"怒"类游戏的转向控制。
ror/rol 屏幕右/左转度显示,可使纵版游戏满屏显示
joystick = name 游戏控制器选择,缺省为:none 键盘控制,MAME支持的游戏控制器很多, name是它们的名字,分别为:
auto:自动检测,只能测出标准2键、Creative眼镜蛇、gamepad pro等少数种类的手柄,还是不要用这个选项的好;
standard:标准2键模拟式手柄 @1P
dual:双标准2键模拟式手柄 @2P
4button:标准4键模拟式手柄 @1P
6button:标准6键模拟式手柄 @1P
8button:标准8键模拟式手柄 @1P
fspro:CH flightstick PRO飞行摇杆 @1P
wingex:Wingman Extreme 飞行摇杆 @1P
wingwarrior:Wingman Warrior 手柄 @1P
sidewinder:微软响尾蛇手柄 @4P
gamepadpro:Gravis gamepad pro手柄
grip:Gravis GrIP手柄
grip4:限定4轴向的Gravis GrIP手柄
/* 以下为并行打印口手柄,均易于自制,
sneslpt1:接在第一打印口的超级任天堂手柄 @4P
sneslpt2:接在第二打印口的超级任天堂手柄 @4P
sneslpt3:接在第三打印口的超级任天堂手柄 @4P
psxlpt1:接在第一打印口的SONY PS手柄 @4P
psxlpt2:接在第二打印口的SONY PS手柄 @4P
psxlpt3:接在第三打印口的SONY PS手柄 @4P
nlpt1:接在第一打印口的任天堂手柄 @2P
nlpt2:接在第二打印口的任天堂手柄 @2P
nlpt3:接在第三打印口的任天堂手柄 @2P
注:1、模拟式手柄初次使用或者出现方向混乱故障时可以在游戏中按Tab进入设定菜单调用Calibrate joystick功能进行校正,数码式手柄则不会存在这种问题。
2、@1P表示只能单打,@2P表示可以双打,@4P表示可以四打,未标注则为不祥。超任和PS的手柄理论上能达到5P的效果(我只试到了4P,未再继续,呵呵)。
3、不直接支持创新公司的Cobra手柄(工作于数码方式时)和并口土星手柄;MAME内建有对IF-SEGA的支持,这是一种专用的扩展卡,可以把世嘉土星手柄接到PC,过去处于起步时期的第一批3D图形卡就把它跟着PC版的VR战士、装甲飞龙等游戏软件一起捆绑销售,现在已经看不到了。
4、PS dual shock手柄的两个模拟小摇杆亦可当作按键使用,左、右摇杆按下时分别被识别为L3和R3(用处不大)。
5、用于命令行时,语句可简化为 joy。
6、使用并口手柄对游戏速度降低影响较大。大体上各种手柄的CPU占用率由高到低依次为:PS、SFC、SS/MD、标准模拟式。
7、不支持异类手柄混用,但是可以手柄、键盘同时使用。
hotrod = no 键盘接口摇杆支持(就是在Emuviews主页上打广告那个双人摇杆)设定,因为我们用不上,所以选no。
cheat = no 作弊功能开关,可以改成yes以打开它,最好配合作弊数据使用。
debug = no 除错、调试模式开关,高级用户选用,这个功能只有在源程序中打开debug选项才有用。
monitor = standard 设定显示输出类型,对于PC用户选择standard,另外还可以选择以下设备:
ntsc:输出至NTSC电视监视器
pal:输出至PAL电视监视器
arcade:输出至街机监视器
均需要特殊方式转换信号及相关硬件支持,有兴趣可参看下文第九节。
至于其他的栏目和选项,只要保留其缺省设定即可。如果上面各项参数用于命令行,请在其之前加一个"-"号,同时可以把"="去掉,例如:
mame ddragon2 -joy psxlpt1 -soundcard 6 -resolution x
由于MAME的使用显得繁琐了一些,也有不少方便对DOS比较陌生的玩家的MAME前端(front end)程序被开发出来,这些程序具备亲和性较高的GUI图形界面,配置菜单里基本上囊括了MAME的各个选项,一般玩家通过这些前端程序都能很方便的玩转MAME了。由于我使用过的前端程序并不多(只有ArcadeOS一个,还是因为其无可替代的特殊功能采用的),所以对他们也不是很熟悉,传说中arcade@home是比较好用的,大家可以去它的主页下载?..∮肕AME好了。
五、 MAME主要配置参数:
MAME是使用DirectX SDK的WIN应用程序,在使用上较MAME方便许多,另外还增加了一些MAME所不曾有的功能,但是在同等配置的机器上,MAME的运行速度会比MAME慢一些,这种差别在低配置的机器上比较明显,甚至会影响到游戏运行的流畅性。在软件环境设置方面,我们通常需要更改的部分只有:
1、ROM路径:进入options/directoies,点击Insert按键,在跳出的对话框中选中你的ROM目录,如有多个目录,重复Insert,选好目录后点OK退出到主界面,按F5键刷新一下,MAME就会在你所指定的所有ROM目录内进行自动搜索,并在主窗口左方目录树available子项中显示出可用的游戏了,双击该游戏名即可执行之,但若游戏名称前的小图标是一个红叉的话,说明该游戏无法正常模拟。如果在你的ROM目录当中增加入了新的ROM,你也需要刷新一下,否则不能运行你新加入的ROM文件;
2、使用手柄:进入options/default options/controllers菜单,复选Use joystick选项即可,MAME支持所有兼容DirectInput界面的手柄。
3、画面设定:缺省配置下,MAME使用的是和MAME同样的全屏隔行显示模式,若你想以窗口模式执行游戏,可以进入options/default options/display子菜单,将Full screen display选项禁止,再进入位于同层的Advanced菜单,禁止现存的scanlines选项,这样就能得到较好的窗口显示模式。在窗口模式下,由于使用到了Windows的相关优化效果,游戏画面显得比较柔和,不过游戏速度慢了一些……
4、优化设定:声音:options/default options/sound,sound system选MIDAS, Sample rate选,Sample bit选,FM synthesis打开(视你的声卡效果而定)。图像:options/default options/display,colors选bit(与游戏本身的原始画面色深有关),在全屏模式下工作时将Triple buffer打开。其他:options/default options/miscellaneous,打开Enable game cheats,并根据你的CPU特性决定是否将Disable MMX选项保留。
5、关于抓图:MAME支持的游戏太多了,但并不每一个游戏都值得玩的,你是不是在下载某一个游戏之前想知道该游戏的大致内容呢?又或者,你想知道某一仅知其形不知其名的老游戏是否被MAME模拟了呢?这好办,只要你找到MAME的游戏抓图,把它们全部压缩成一个名为snap.zip的文件,放入MAME下的<snap>(MAME.b5起)子目录当中,然后执行MAME,当你用鼠标单击某一个游戏时,相关的抓图就会显示在最右边的窗口中,这样你寻找游戏不就做到有的放矢了吗?MAME的抓图文件可以到我的主页去下载,EmuViews的ROM下载也配有抓图,点击每一个ROM前面的磁盘形图标就可以查看。
6、 游戏版本:许多游戏都有美版、日版、全球版以及2P版、4P版、6P版之分,而某些ROM是多版合一的Merged Romset,如本站提供的《黑龙》,因为ROM名可以是统一的,所以在DOS下看不出来,而MAME有显示游戏的详细信息的功能,其中就包括了版本号,这样它可就帮了那些喜欢玩某一版本的游戏的玩家了。一般而言,除了文字显示上的差异外,同一游戏的日版比美版难度更大一些。
7、联网对战:MAME的源程序已经内建了通过TCP/IP规则来连线对战的功能,但是可能因为这个功能比较简陋,尚不能满足MAME小组预期的要求,所以在官方版本中这个功能都未曾激活,但是有不少MAME的非官方版本已经提供了这个功能。鉴于网络对战越来越受大家的欢迎,我就简单介绍一下如何使用:在支持TCP/IP协议的网络中找几台机器,其中一台作为服务器,首先运行windows系统自带的IPCONFIG.EXE程序,找出本机的IP地址,并告诉想要联机的朋友。接着运行MAME,从File/Run network game...进入网络设定菜单,选中Server mode,改好你的Player's Network name(不改也行,就用缺省的“MAME玩家”好了),在Number of players项中决定联网的玩家数量,至于所有连线的玩家能否一起玩就要看所用的游戏了,然后点击OK,等待其他玩家加入吧。服务器设立好以后,在客户机端也运行与服务器相同版本的MAME,同样通过File/Run network game...,但是这次需要选择Client mode,并在Network configration项中填入服务器的IP地址,点击OK按钮就可以连上服务器了,连入后在出现的对话窗口下方是一个聊天器,通过它可以跟连在线上的所有玩家通话。当所有玩家都已经正确连入后,就可以有服务器端来决定玩什么游戏了——客户端只能提建议,呵呵。能够联网运行的游戏都会显示在连通窗口的左方——不是所有的游戏都能用,比如KOF系列就不行。进入联机游戏后,玩家要注意控制方面的问题:MAME在联机模式下,对于服务器端和客户端的控制设备ID未做修正(连通窗口中的Controls功能好像并无效果),如果各方都使用1P控制方式的话,那么都在控制1P的活动,所以必须有一方改用2P、3P、4P……控制方式才能协同作战,这一点比Callus就差多了。在操作方法上,无论局域网还是互联网都是一样的,不过以我国目前的线路状况来看,通过互联网对战还不是很现实……
MAME的配置设定是存在注册表当中的,当你的MAME版本升级以后,第一次执行的时候程序会询问是否以新版本的配置参数覆盖原来的设定。和对mame.cfg的处理方法一样:出于对模拟器正常运行的考虑,建议大家还是回答“Yes”——尽管这样需要重新设定路径、控制设备、输入设备等等选项。
六、 MAME/MAME热键操作:
3/4:1P/2P投币键;
1/2:1P/2P开始键,这样的设定已经成为了除Callus/Impact外所有街机模拟器的标准,如果是4打类游戏,则1P/2P/3P/4P的投币键改为5/6/7/8,按1/2/3/4或各人的开火键开始游戏——MAME自从.RC1开始已经将这种4打类投币开始键位作为初始设定。
P:游戏暂停;
Shift+P:游戏暂停,同时显示下一帧;
F3:复位键;
F4:显示游戏所用调色板,再按一次恢复游戏;
F9:动态跳帧调节键,跳帧数在auto、0、1、2、3……之间循环;
F:游戏速度调节,偶尔用来玩一下"超速版"游戏也不错;
F:F9、F功能的状态显示开关,数据显示在画面右上角;
F:抓图,游戏抓图以PNG格式储存在子目录当中;
~:控制台键(像Quakez一样,呵呵),呼出菜单后,↑、↓键选择功能,←、→键调节大小。可供调节的选项有:总音量,DAC数码音效音量、FM音源音量、画面Gamma和亮度等,也可以用手柄方向键来操作;
TAB:游戏配置键,在呼出的菜单中,Input(general)用于配置通用键盘、手柄控制设
å¦Pythonè½å¹²ä»ä¹ï¼
Pythonå¯ä»¥åä»ä¹ï¼
1ï¼ç½ç«å端ç¨åºåï¼ä½¿ç¨å®åé´ç½ç«ï¼åå°æå¡æ¯è¾å®¹æç»´æ¤ãå¦ï¼GmailãYoutubeãç¥ä¹ãè±ç£
2ï¼èªå¨åè¿ç»´ï¼èªå¨åå¤ç大éçè¿ç»´ä»»å¡
3ï¼æ°æ®åæå¸ï¼å¿«éå¼åå¿«ééªè¯ï¼åææ°æ®å¾å°ç»æ
4ï¼æ¸¸æå¼åè ï¼ä¸è¬æ¯ä½ä¸ºæ¸¸æèæ¬å åµå¨æ¸¸æä¸
5ï¼èªå¨åæµè¯ï¼ç¼å为ç®åçå®ç°èæ¬ï¼è¿ç¨å¨Selenium/lrä¸ï¼å®ç°èªå¨åã
6ï¼ç½ç«å¼åï¼åå©django,flaskæ¡æ¶èªå·±æ建ç½ç«ã
7ï¼ç¬è«è·åæå¤ç大éä¿¡æ¯ï¼æ¹éä¸è½½ç¾å§ãè¿è¡æèµçç¥ãç¬åéæ¿æºãç³»ç»ç®¡çåçèæ¬ä»»å¡çã