Java咖啡馆---编写猜数字游戏

猜数字游戏

    

  你肯定玩过猜数字游戏?游戏随机给出一个0至99(包括0和99)之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案。(见图1)

游戏设计(1)

    

  首先搭建Java程序框架。打开Eclipse,新建名为GuessNumberGame的项目,然后新建名为GuessNumber的Java类。别忘记给GuessNumber加上合适的javadoc。

  第一步:随机数的产生

  我们可以借助Java API提供的Random类来产生一个随机数。

  首先在main函数中加入以下三行代码:

// 新建一个随机数产生器,然后生成一个0到99之间的整数。
Random random = new Random();
int number = random.nextInt(100);

  不出所料,Eclipse就像语文老师一样,立即在错误语句处划出红线,把鼠标移动到红线上,可以看到具体出错信息(见图2)。

 

  包(Package)的概念

  Java API中包含了极其丰富、类似于Random这样由Sun预先定义好的类(Class,如果忘记相关概念,请参考第四篇连载?《品味第一杯咖啡》),与变量作用域的问题一样,不同包中可以有同名同姓的类,如果没有包的概念,就会遇到命名冲突问题。此外,包还能进行安全控制,你可以规定哪些类可以被包外部调用,哪些不可以。

  Random类是在java.util这个包中。可以手动在源程序顶部输入import java.util.Random;语句来申明该程序将要使用java.util包中的Random类,然而有了Eclipse,就不用那么麻烦了?把光标移动到有红色波浪线的Random上,然后按下Ctrl+Shift+M,Eclipse会自动帮你完成导入的工作了。此时保存一下源代码,警告是不是消失了?希望你牢记这个快捷键的用法,在开发大型项目时,再好的脑子也无法牢记每个类所在的包的名字,有了Eclipse的鼎力相助,偷个懒也没问题。

  语句翻译

  第一句定义了一个类型是Random类的变量random(Java语言区分大小写,所以Random和random是两回事儿),并且用new操作符生成一个Random类的实例赋给random变量。还记得我们上期连载说到变量还有一种引用类型吗?这就是一个例子。random变量实际上是一个参照,指向内存中用new操作符新建的Random类的实例。说起来很拗口,大多数情况下可以把random直接看做是一个Random类的实例,可以通过“random”加上“.操作符”来调用Random类的方法,比如用random.nextInt(100)来获取一个0至99之间的随机数。

  第二句语句定义一个整型变量number来保存随机产生的整数,并且用直接初始化的方法把random产生的随机数赋给number变量。

  第二步:标准输入输出

  标准输入输出(Standard I/O)是指可以被应用程序使用的信息流。比如,应用程序可以从标准输入(Standard input)读取数据,向标准输出(Standard output)写数据,把出错信息发送到标准错误(Standard error)。通过输入输出,应用程序和应用程序之间可以被串联起来使用。虽然标准输入输出是从UNIX发展出来的概念,在Windows中也广泛应用,如果你熟悉DOS,这个概念自然不陌生。
猜数字游戏主要用到标准输入,更明确一些,就是控制台输入。还记得我们经常使用System.out.println进行控制台输出吗?相反,要从控制台输入,就需要用到System.in。它是一个纯粹的输入流,而猜数字游戏主要是通过控制台获取玩家的字符(特别是能够支持多国语言的Unicode字符)输入,我们需要把它包装成一个BufferedReader实例来使用:

BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));

  这时,input就是一个能处理来自控制台输入的、支持Unicode的、可以整行读取的一个BufferedReader实例,比如能通过input.readLine()方法获取玩家在控制台整整一行的输入了。

  第三步:异常

  正如阿甘的名言?Shit happens,程序中的金科玉律就是?一定会出错。出错并不可怕,关键看如何对待错误,有错必究才善莫大焉。

  Java语言提供了异常(Exception)处理机制帮助程序员发现并处理异常。什么是异常呢?所谓异常,就是在程序执行过程中能干扰程序正常流程的事件。导致异常的原因很多,比如文件找不到、数组越界、除以零等。当异常出现时,一个异常对象将被自动生成并传递给Java“运行时环境”(runtime system),说得专业一点,就是抛出一个异常。异常对象包含了异常类型、程序运行状态等信息。“运行时环境”得到异常对象后便打断程序的正常流程,自动寻找一个专门处理该异常的代码块来解决问题。这样的代码块称作异常句柄(Exception Handler)。你可以在异常句柄中尝试修复错误、重试或者报错,或者实在无法进行下去的时候来个自我了断。如果“运行时环境”找不到异常句柄,Java程序便会自行中断。

  一个典型的异常处理是这个样子的:

try {
statement(s);
} catch (exceptiontype1 name) {
statement(s);
} catch (exceptiontype2 name) {
statement(s);
} finally {
statement(s);
}

  其中:

  ★try语句括起来的语句可能抛出异常。try语句至少要搭配一个catch语句或finally语句,不能单独使用。
  ★catch语句必须和一个try语句配套使用,根据异常类型(exception type)分别处理不同的异常。也就是说,Java有许多预先定义的异常,你可以通过多个catch语句对它们分门别类地处理。你还可以自己定义异常类型。如果try语句块中没有抛出异常,这里自然不会被执行。
  ★finally语句也必须和一个try语句配套使用,与catch语句不同,无论try语句块中是否抛出异常,finally所包括的语句块都会被执行

游戏设计(2)

    

  举个具体的例子来熟悉一下。猜数字游戏需要从控制台获取玩家输入的数字。我们先定义一个整型变量:

int guess;

  然后就可以编写如下代码:

guess = Integer.parseInt(input.readLine());

  通过input.readLine从控制台读取输入,并且用Integer.parseInt把获取的字符串类型的输入转换成整型,然后赋给guess变量。

  Eclipse又给你脸色看了——input.readLine()下面划上了红线(见图3)。

  看看提示,原来是未处理异常句柄。

  原来,Java有一种异常称作检查型异常(Checked Exceptions)。一般数组越界、除以零等等都是运行时异常,由于数量众多,Java允许你不必亲自捕捉每个这样的异常,而全权交给运行时环境去处理。但检查型异常就不一样了,Java把检查型异常提升到与参数、返回值同样的高度,也就是说,检查型异常你非处理不可,并且在javadoc中必须加以注释。

  那么怎样快速地捕捉这样的异常呢?按照如图3所示,用鼠标点击带有红叉的灯泡图标,在弹出菜单上选择Surround with Try/Catch,异常处理代码模块立即自动生成了。可以发现,这一句话将抛出两个异常:一个是格式异常(NumberFormatException),因为如果你用Integer.parseInt去转换一个汉字,自然是不可能的。另一个便是I/O异常,即标准输入可能会出现不可预料的问题。怎么样,连异常都能够自动捕捉,这就是Eclipse的魅力!

  需要说明的是,NumberFormatException并不是检查型异常,而是一个不必刻意捕捉的运行时异常。试试看把捕捉NumberFormatException的那个catch语句块全部删除,Eclipse也不会报错。不过,捕捉这个异常很有实用价值,后文的代码会进一步展示它的作用。

  小提示

  使用异常机制的诸多好处

  ★使得程序更健壮,界面更友善。
  ★把程序的业务逻辑与错误处理分开,代码更合理,更美观。
  ★异常可以分层次处理,使得代码更简洁。
  ★同类的异常可以归到一类一起处理,处理更方便。

  Java的异常处理机制是一个很大的话题,这里仅仅是展示了冰山一角,以实用为主,希望你能够自行阅读扩展知识,并且在编写代码过程中注意体会。

  while循环控制

  上回的Java咖啡馆介绍了for循环语句,这回需要介绍一个它的“亲戚”语句——while语句。

  while语句的语法是:

while ( expression ) {
statement(s)
}


游戏设计(3)

    

  首先,while语句判断返回一个布尔值的expression表达式,如果返回值为true,则执行下面语句,之后再测试expression表达式再执行语句,以此往复,直到expression表达式返回false为止。

do-while语句与while语句非常相似,语法是:

do {
statement(s)
} while ( expression );

  与while语句在循环顶部判断表达式真假值不同,do-while语句在底部判断,从而,do-while语句至少执行一次内部的代码。

  下面看看猜数字游戏的主体部分:

// 记录玩家猜测的次数
int counter = 0;
System.out.println("我心里有一个0到99之间的整数,你猜是什么?");

do {
try {
// 获取玩家的输入
guess = Integer.parseInt(input.readLine());
} catch (NumberFormatException e) {
// 如果玩家不是输入一个合法的整数,则让他重新输入
System.out.println("请输入一个0-99之间的整数!");
continue;
} catch (IOException e) {
System.out.println("程序发生异常错误将被关闭!");
e.printStackTrace();
}

// 对玩家的输入进行判断
if (guess > number)
System.out.println("大了点,再猜!");
if (guess < number)
System.out.println("小了点,再试试!");

// 计数器增加一
counter++;
} while (guess != number);

  首先定义了一个counter变量来记录玩家猜测的次数,并直接初始化为0。在打印一行游戏提示以后,便开始一个do-while语句。

  在do-while语句中,首先用异常处理语句获取玩家的输入,如果玩家输入不合法,提示以后用continue语句从头重新执行循环语句,等待玩家的输入。从而,guess变量一定包含一个合法的整数。之后要对玩家的输入进行判断。如果玩家的猜测太大或者太小,都做出提示。接着把计数器增加1,表示玩家做过一次猜测。最后便是do-while语句的判断:当玩家猜测的数字和随机产生的答案不同,则再次进入循环,否则便结束循环,执行下面的代码。

  最后提醒一句,别忘记用Eclipse的Alt+/快捷键帮助编写do-while语句哦!

  switch语句

  switch语句是基于整型表达式的条件判断语句,猜数字用它来进行成绩判断:

// 判断成绩
switch (counter) {
case 1:
System.out.println("东渐……快来看上帝……");
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
System.out.println("这么快就猜对了,你很smart啊!");
break;
default:
System.out.println("猜了半天才猜出来,小同志,尚须努力啊!");
break;
}

  可以看出,switch语句是和若干case语句和一个default语句搭配使用的。代码中的switch语句用counter变量的值进行判断。当counter的值为1时,便执行case 1里面的语句,即打印“东渐……快来看上帝……”的字样,随后的break语句表示整个switch语句执行到这里结束了。当counter的值为2时,便执行case 2里面的语句。可以发现case 2到case 6都没有break语句,这表示依次执行下面的语句,从而counter的值为2至7时,都打印“这么快就猜对了,你很smart啊!”字样。当counter的值不是1至7时,便执行default语句,打印鼓励的话语。

  Just Do It

  想想看怎样编写一个会玩猜数字游戏的Java程序呢?

  小结

  这是Java咖啡馆开张以来最漫长的一回,涉及的知识面很广,希望你能够感到充实而不是烦琐。此外,自己动手编写几个小程序是最好的练习方法。Eclipse是良师益友,有什么问题都会及时通知你,有时还会附上解决方法,希望你善加利用,不要辜负一片心意哦。

<script type="text/javascript">&amp;amp;amp;amp;amp;lt;!--google_ad_client = "pub-3051157228350391";google_alternate_color = "FF0000";google_ad_width = 336;google_ad_height = 280;google_ad_format = "336x280_as";google_ad_channel ="9050871643";google_page_url = document.location;google_color_border = "CCCCCC";google_color_bg = "FFFFFF";google_color_link = "000000";google_color_url = "666666";google_color_text = "333333";//--&amp;amp;amp;amp;amp;gt;</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script><iframe name="google_ads_frame" allowtransparency="65535" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3051157228350391&amp;amp;dt=1112786052046&amp;amp;prev_fmts=336x280_as&amp;amp;format=336x280&amp;amp;output=html&amp;amp;u_h=768&amp;amp;u_w=1024&amp;amp;u_ah=740&amp;amp;u_aw=1024&amp;amp;u_cd=32&amp;amp;u_tz=480&amp;amp;u_his=3&amp;amp;u_java=true" marginwidth="0" height="280" frameborder="0" scrolling="no" width="336" marginheight="0"></iframe><iframe name="google_ads_frame" allowtransparency="65535" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3051157228350391&amp;amp;dt=1112786057593&amp;amp;prev_fmts=336x280_as%2C336x280&amp;amp;format=336x280&amp;amp;output=html&amp;amp;u_h=768&amp;amp;u_w=1024&amp;amp;u_ah=740&amp;amp;u_aw=1024&amp;amp;u_cd=32&amp;amp;u_tz=480&amp;amp;u_his=3&amp;amp;u_java=true" marginwidth="0" height="280" frameborder="0" scrolling="no" width="336" marginheight="0"></iframe>
fanjsp
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java咖啡馆(PDF格式)
03-11
### Java咖啡馆知识点详解 #### 一、Java入门与学习指南 **1.1 Java咖啡馆简介** - **目标读者**: 针对初学者,尤其是那些希望从零开始了解Java编程的人。 - **内容特点**: 以轻松、易于理解的方式介绍Java的基础...
C语言学习记录(猜数游戏
youmi551的博客
03-07 4003
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int magic,guess,counter=0,ret; //定义系统所想数,玩家猜测数,猜测次数,输入函数scanf返回值 char reply; //定义用户回复值判断是否继续游戏 srand(time(NULL)); //srand函数可以为rand函数设置随机种子 time函数返回以秒计算的日历...
JAVA猜数字游戏
热门推荐
netuser1937的博客
01-23 3万+
JAVA猜数字游戏
java实现猜数游戏(幸运猜猜猜)
cloud-cai的博客
09-30 7752
游戏随机给出一个0~99(包括0和99)的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案。在游戏过程中,记录你最终猜对时所需要的次数,游戏结束后公布结果。要求,猜测次数最多20次。 package Zuoye; import java.util.Scanner; public class Guess_Number {
Java游戏】幸运猜猜猜
郁闷的飞鱼的博客
07-22 2424
/* 小游戏:幸运猜猜猜 游戏规则:游戏随机给出一个0~99(包括0,99)的数字,然后你猜是什么数字。 你可以随便猜一个数字,游戏提示你太大还是太小,从而缩小结果范围。 经过计策猜测与提示后,最终推出答案。 在游戏过程中,记录你最终猜对时所需要的次数,游戏结束后公布结果。 */
JAVA咖啡馆
10-14
叹咖啡 第一杯咖啡 EcliPse 品味第一杯咖啡 Java语言基础 编写猜数字游戏 大话面向对象 个压缩归档实用软件 情人节的Applet Java插件技术 Tic-Tac-Toe 终结者
Cafe-and-Restaurant-:咖啡馆和餐厅的本地应用程序包含菜单和Google地图上的位置
04-28
本文将聚焦于“Cafe-and-Restaurant-”这款专为咖啡馆和餐厅设计的本地应用程序,探讨其核心功能——菜单展示和Google地图上的位置定位,以及背后的开发技术——Java编程语言。 首先,让我们深入了解一下这款应用的...
基于jsp的咖啡馆管理系统源码数据库.doc
最新发布
02-28
因此,开发一个基于JSP(JavaServer Pages)的咖啡馆管理系统显得尤为重要。该系统可以实现自动化订单处理、库存监控以及财务统计等功能,从而提升咖啡馆的运营效率和服务水平。 #### 二、国内外相关研究状态 ####...
java咖啡馆
07-05
### Java咖啡馆——走进Java的世界 #### 一、引言:探索Java的魅力 在这个充满活力的数字时代,Java作为一种强大的编程语言,不仅被广泛应用于各种软件开发领域,也成为许多编程爱好者的首选。本文旨在通过一系列...
java猜数程序_Java实现猜数程序
weixin_35082950的博客
02-13 655
Java编写一个猜数程序,供大家参考,具体内容如下要求如下:编写一个猜数程序。命令行显示菜单:1.开始;2.退出。用户选择1,则程序生成一个0~99之间的随机整数,命令行显示“请输入你猜的数:”让用户猜。用户输入猜测的数据,猜对了命令行显示“你猜对了”,并且出现菜单:1.再来一次;2.退出。没有猜对程序给出提示(如:太大了,太小了),并要求在命令行继续输入猜测的值;三次没猜对则程序公布正确的数字...
JAVA实现猜数字游戏
weixin_44903290的博客
07-13 1万+
随机生成一个1-100之间的整数提示用户进行猜测,猜测过大则提示您猜测的整数过大,猜测过小则提示您猜测的整数过小,直到用户猜对。
java写数字游戏
weixin_47669758的博客
11-15 785
总共分了2个类,方法类作为子类继承父类,然后父类里边直接按照静态类方法的调运方式调运静态方法,在父类里输入您的账号密码进入数字游戏内,输入你想输入的数字【0-100】和随机数值【0-101)比较的代码。
使用异常处理,完成猜数字游戏(try..catch)
fashion_dog的博客
06-14 799
这里是将异常抓取,并处理
Java编程实现猜数游戏,使用try catch处理异常
Rickwubaa的博客
09-29 816
【代码】Java编程实现猜数游戏,使用try catch处理异常。
Java语言实现猜数字小游戏
weixin_64308540的博客
10-31 1万+
Java语言实现猜数字小游戏
静态方法
fayzoro的博客
08-29 2353
静态方法:@staticmethod 静态方法是定义在类的内部的函数,此函数的作用域是函数的内部 * 说明: 静态方法需要使用@staticmethod 装饰器定义 静态方法与普通函数定义相同, 不需要传入参数self实例参数和cls类参数 静态方法只能凭借该类或类创建的对象(实例)调用 静态方法不能访问类变量和实例变量 * 实质: 就是定义在类内的函数。类名.函数() 或 实例名...
Java-Random生成随机数案例:猜数字游戏
weixin_52309279的博客
04-05 4150
需求: 随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏. 分析: ① 随机生成一个1-100之间的数据 ② 使用死循环让用户不断猜测并提示用户范围,猜大提示过大,猜小提示过小,猜中使用break结束游戏. public static void main(String[] args){ //1.随机生成一个1-100之间的幸运数字(0-99) + 1 Random r = new Random();//创建对象 int data
猜数字范围逐渐缩小java程序_用JAVA一个“猜数”应用程序,该程序随机1到1000的范围中选择一个用户猜测的整数,我写的哪里错了?...
weixin_31968831的博客
02-24 416
packagecaishuzi;importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Random;importjavax.swing.JButton;importja...package caishuzi;import jav...
Java实现0-99数字猜谜游戏:互动挑战
Java猜数字游戏是一种简单的编程练习,它通常用于教学目的,让学生熟悉Java GUI(图形用户界面)组件以及事件监听器的使用。在这个游戏中,程序会随机生成一个0到99之间的整数用户通过输入框猜测这个数字,并在...
写文章

热门文章

  • 获取股票实时交易数据的方法 1942
  • 让DNS服务器支持泛域名解析 950
  • 赤裸艺术! 930
  • 路由器的内部结构 817
  • 我在上海奋斗五年 从月薪3500到700万 805

分类专栏

  • java 1篇

最新评论

  • 我在上海奋斗五年 从月薪3500到700万

    一个天蝎座的程序员: 小说吗

  • JSP, J2SDK, Tomcat, 连接SQL Server 2000 全套系统配置

    杨晓尚: 感谢博主分享!

  • 如何当好一个项目经理

    weixin_45468725: 博主写的很棒啊

  • 使用JSP + JAVABEAN + XML 开发的一个例子

    lpw757294: 作者可以给我项目包的截图么

大家在看

  • 解决项目中资源文件能找到但运行失败Exception in thread “main“ java.io.FileNotFoundException: ..\image\1.jpg (系统找不到指定路径
  • 最新独家技术微博CK跳注册,无需接码无限注册抖音 392
  • ubuntu 系统安装(简洁小白版) 144
  • 1292 - Truncated incorrect DOUBLE value: ‘NaN‘
  • 第七章作业 75

最新文章

  • 获取股票实时交易数据的方法
  • Hello JavaEye
  • 乱了,乱了,乱了,宇宙超级无敌乱
2008年2篇
2007年15篇
2006年47篇
2005年94篇
2004年300篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家玻璃钢天鹅雕塑价格天津个性化玻璃钢雕塑定制苏州玻璃钢人物雕塑设计邢台玻璃钢雕塑定制重庆多彩玻璃钢雕塑生产厂家信阳玻璃钢雕塑加工厂玻璃钢球雕塑属于装饰材料吗玻璃钢人物雕塑一键获取报价汉中玻璃钢商场美陈淄博玻璃钢雕塑公司哪家好玻璃钢雕塑 天鹅铜仁玻璃钢雕塑厂有哪些南湖玻璃钢造型雕塑石景山区商场圣诞美陈安装银川玻璃钢景观雕塑定做武冈玻璃钢花盆花器攀枝花连锁店玻璃钢卡通雕塑六安多彩玻璃钢雕塑定制黄山创意玻璃钢雕塑专业定做玻璃钢花盆宝山区玻璃钢雕塑厂家报价南京通用玻璃钢雕塑服务介绍兰州玻璃钢雕塑咨询郑州景观玻璃钢雕塑定做厂家玻璃钢口红唇膏雕塑无锡商场新年美陈嘉兴玻璃钢卡通雕塑水果玻璃钢马雕塑的含义呼市商场美陈安装玻璃钢雕塑卡通哪个靠谱香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化