纠纷奇闻作文社交美文家庭
聚热点
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

用python制作AI欢乐斗地主出牌器,赢欢乐豆,实现财富自

7月7日 囍孤女投稿
  前言
  最近在网上看到一个有意思的开源项目,快手团队开发的开源AI斗地主DouZero。今天我们就一起来学习制作一个基于DouZero的欢乐斗地主出牌器,看看AI是如何来帮助我们斗地主,赢欢乐豆,实现财富自由的吧!
  首先一起来看看AI斗地主出牌器的效果:
  私信小编01即可获取大量python学习资源
  下面,我们开始介绍这个AI出牌器的制作过程。
  一、核心功能设计
  首先我们这款出牌器是基于DouZero开发的,核心是需要利用训练好的AI模型来帮助我们,给出最优出牌方案。
  其次关于出牌器,先要需要确认一个AI出牌角色,代表我们玩家自己。我们只要给这个AI输入玩家手牌和三张底牌。确认好地主和农民的各个角色,告诉它三个人对应的关系,这样就可以确定队友和对手。我们还要将每一轮其他两人的出牌输入,这样出牌器就可以根据出牌数据,及时提供给我们最优出牌决策,带领我们取得胜利!
  那么如何获取三者之间的关系呢?谁是地主?谁是农民?是自己一人作战还是农民合作?自己玩家的手牌是什么?三张底牌是什么?这些也都需要在开局后确认好。
  拆解需求,大致可以整理出核心功能如下:
  UI设计排版布局显示三张底牌显示AI角色出牌数据区域,上家出牌数据区域,下家出牌数据区域,本局胜率区域AI玩家手牌区域AI出牌器开始停止
  手牌和出牌数据识别游戏刚开始根据屏幕位置,截图识别AI玩家手牌及三张底牌确认三者之间的关系,识别地主和农民角色,确认队友及对手关系识别每轮三位玩家依次出了什么牌,刷新显示对应区域
  AI出牌方案输出加载训练好的AI模型,初始化游戏环境每轮出牌判断,根据上家出牌数据给出最优出牌决策自动刷新玩家剩余手牌和本局胜率预测
  二、实现步骤1。UI设计排版布局
  根据上述功能,我们首先考虑进行简单的UI布局设计,这里我们使用的是pyqt5。核心设计代码如下:defsetupUi(self,Form):Form。setObjectName(Form)Form。resize(440,395)fontQtGui。QFont()font。setFamily(Arial)font。setPointSize(9)font。setBold(True)font。setItalic(False)font。setWeight(75)Form。setFont(font)self。WinRateQtWidgets。QLabel(Form)self。WinRate。setGeometry(QtCore。QRect(240,180,171,61))fontQtGui。QFont()font。setPointSize(14)self。WinRate。setFont(font)self。WinRate。setAlignment(QtCore。Qt。AlignCenter)self。WinRate。setObjectName(WinRate)self。InitCardQtWidgets。QPushButton(Form)self。InitCard。setGeometry(QtCore。QRect(60,330,121,41))fontQtGui。QFont()font。setFamily(Arial)font。setPointSize(14)font。setBold(True)font。setWeight(75)self。InitCard。setFont(font)self。InitCard。setStyleSheet()self。InitCard。setObjectName(InitCard)self。UserHandCardsQtWidgets。QLabel(Form)self。UserHandCards。setGeometry(QtCore。QRect(10,260,421,41))fontQtGui。QFont()font。setPointSize(14)self。UserHandCards。setFont(font)self。UserHandCards。setAlignment(QtCore。Qt。AlignCenter)self。UserHandCards。setObjectName(UserHandCards)self。LPlayerQtWidgets。QFrame(Form)self。LPlayer。setGeometry(QtCore。QRect(10,80,201,61))self。LPlayer。setFrameShape(QtWidgets。QFrame。StyledPanel)self。LPlayer。setFrameShadow(QtWidgets。QFrame。Raised)self。LPlayer。setObjectName(LPlayer)self。LPlayedCardQtWidgets。QLabel(self。LPlayer)self。LPlayedCard。setGeometry(QtCore。QRect(0,0,201,61))fontQtGui。QFont()font。setPointSize(14)self。LPlayedCard。setFont(font)self。LPlayedCard。setAlignment(QtCore。Qt。AlignCenter)self。LPlayedCard。setObjectName(LPlayedCard)self。RPlayerQtWidgets。QFrame(Form)self。RPlayer。setGeometry(QtCore。QRect(230,80,201,61))fontQtGui。QFont()font。setPointSize(16)self。RPlayer。setFont(font)self。RPlayer。setFrameShape(QtWidgets。QFrame。StyledPanel)self。RPlayer。setFrameShadow(QtWidgets。QFrame。Raised)self。RPlayer。setObjectName(RPlayer)self。RPlayedCardQtWidgets。QLabel(self。RPlayer)self。RPlayedCard。setGeometry(QtCore。QRect(0,0,201,61))fontQtGui。QFont()font。setPointSize(14)self。RPlayedCard。setFont(font)self。RPlayedCard。setAlignment(QtCore。Qt。AlignCenter)self。RPlayedCard。setObjectName(RPlayedCard)self。PlayerQtWidgets。QFrame(Form)self。Player。setGeometry(QtCore。QRect(40,180,171,61))self。Player。setFrameShape(QtWidgets。QFrame。StyledPanel)self。Player。setFrameShadow(QtWidgets。QFrame。Raised)self。Player。setObjectName(Player)self。PredictedCardQtWidgets。QLabel(self。Player)self。PredictedCard。setGeometry(QtCore。QRect(0,0,171,61))fontQtGui。QFont()font。setPointSize(14)self。PredictedCard。setFont(font)self。PredictedCard。setAlignment(QtCore。Qt。AlignCenter)self。PredictedCard。setObjectName(PredictedCard)self。ThreeLandlordCardsQtWidgets。QLabel(Form)self。ThreeLandlordCards。setGeometry(QtCore。QRect(140,10,161,41))fontQtGui。QFont()font。setPointSize(16)self。ThreeLandlordCards。setFont(font)self。ThreeLandlordCards。setAlignment(QtCore。Qt。AlignCenter)self。ThreeLandlordCards。setObjectName(ThreeLandlordCards)self。StopQtWidgets。QPushButton(Form)self。Stop。setGeometry(QtCore。QRect(260,330,111,41))fontQtGui。QFont()font。setFamily(Arial)font。setPointSize(14)font。setBold(True)font。setWeight(75)self。Stop。setFont(font)self。Stop。setStyleSheet()self。Stop。setObjectName(Stop)self。retranslateUi(Form)self。InitCard。clicked。connect(Form。initcards)self。Stop。clicked。connect(Form。stop)QtCore。QMetaObject。connectSlotsByName(Form)defretranslateUi(self,Form):translateQtCore。QCoreApplication。translateForm。setWindowTitle(translate(Form,AI欢乐斗地主Dragon少年))self。WinRate。setText(translate(Form,胜率:))self。InitCard。setText(translate(Form,开始))self。UserHandCards。setText(translate(Form,手牌))self。LPlayedCard。setText(translate(Form,上家出牌区域))self。RPlayedCard。setText(translate(Form,下家出牌区域))self。PredictedCard。setText(translate(Form,AI出牌区域))self。ThreeLandlordCards。setText(translate(Form,三张底牌))self。Stop。setText(translate(Form,停止))
  实现效果如下:
  2。手牌和出牌数据识别
  下面我们需要所有扑克牌的模板图片与游戏屏幕特定区域的截图进行对比,这样才能获取AI玩家手牌、底牌、每一轮出牌、三者关系(地主、地主上家、地主下家)。
  识别AI玩家手牌及三张底牌:
  我们可以截取游戏屏幕,根据固定位置来识别当前AI玩家的手牌和三张底牌。核心代码如下:牌检测结果滤波defcardsfilter(self,location,distance):iflen(location)0:return0locList〔location〔0〕〔0〕〕count1foreinlocation:flag1是新的标志forhaveinlocList:ifabs(e〔0〕have)distance:flag0breakifflag:count1locList。append(e〔0〕)returncount获取玩家AI手牌deffindmycards(self,pos):userhandcardsrealimgpyautogui。screenshot(regionpos)forcardinAllCards:resultpyautogui。locateAll(needleImagepicsmcard。png,haystackImageimg,confidenceself。MyConfidence)userhandcardsrealcard〔1〕self。cardsfilter(list(result),self。MyFilter)returnuserhandcardsreal获取地主三张底牌deffindthreelandlordcards(self,pos):threelandlordcardsrealimgpyautogui。screenshot(regionpos)imgimg。resize((349,168))forcardinAllCards:resultpyautogui。locateAll(needleImagepicsocard。png,haystackImageimg,confidenceself。ThreeLandlordCardsConfidence)threelandlordcardsrealcard〔1〕self。cardsfilter(list(result),self。OtherFilter)returnthreelandlordcardsreal
  效果如下所示:
  地主、地主上家、地主下家:
  同理我们可以根据游戏屏幕截图,识别地主的图标,确认地主角色。核心代码如下:查找地主角色deffindlandlord(self,landlordflagpos):forposinlandlordflagpos:resultpyautogui。locateOnScreen(picslandlordwords。png,regionpos,confidenceself。LandlordFlagConfidence)ifresultisnotNone:returnlandlordflagpos。index(pos)returnNone
  这样我们就可以得到玩家AI手牌,其他玩家手牌(预测),地主三张底牌,三者角色关系,出牌顺序。核心代码如下:坐标self。MyHandCardsPos(414,804,1041,59)AI玩家截图区域self。LPlayedCardsPos(530,470,380,160)左侧玩家截图区域self。RPlayedCardsPos(1010,470,380,160)右侧玩家截图区域self。LandlordFlagPos〔(1320,300,110,140),(320,720,110,140),(500,300,110,140)〕地主标志截图区域(右我左)self。ThreeLandlordCardsPos(817,36,287,136)地主底牌截图区域,resize成349x168definitcards(self):玩家手牌self。userhandcardsrealself。userhandcardsenv〔〕其他玩家出牌self。otherplayedcardsrealself。otherplayedcardsenv〔〕其他玩家手牌(整副牌减去玩家手牌,后续再减掉ahrefhttps:www。q578。coml140targetblankclassinfotextkey历史a出牌)self。otherhandcards〔〕三张底牌self。threelandlordcardsrealself。threelandlordcardsenv〔〕玩家角色代码:0地主上家,1地主,2地主下家self。userpositioncodeNoneself。userposition开局时三个玩家的手牌self。cardplaydatalist{}出牌顺序:0玩家出牌,1玩家下家出牌,2玩家上家出牌self。playorder0self。envNone识别玩家手牌self。userhandcardsrealself。findmycards(self。MyHandCardsPos)self。UserHandCards。setText(self。userhandcardsreal)self。userhandcardsenv〔RealCard2EnvCard〔c〕forcinlist(self。userhandcardsreal)〕识别三张底牌self。threelandlordcardsrealself。findthreelandlordcards(self。ThreeLandlordCardsPos)self。ThreeLandlordCards。setText(底牌:self。threelandlordcardsreal)self。threelandlordcardsenv〔RealCard2EnvCard〔c〕forcinlist(self。threelandlordcardsreal)〕识别玩家的角色self。userpositioncodeself。findlandlord(self。LandlordFlagPos)ifself。userpositioncodeisNone:items(地主上家,地主,地主下家)item,okPressedQInputDialog。getItem(self,选择角色,未识别到地主,请手动选择角色:,items,0,False)ifokPressedanditem:self。userpositioncodeitems。index(item)else:returnself。userposition〔landlordup,landlord,landlorddown〕〔self。userpositioncode〕forplayerinself。Players:player。setStyleSheet(backgroundcolor:rgba(255,0,0,0);)self。Players〔self。userpositioncode〕。setStyleSheet(backgroundcolor:rgba(255,0,0,0。1);)整副牌减去玩家手上的牌,就是其他人的手牌,再分配给另外两个角色(如何分配对AI判断没有影响)foriinset(AllEnvCard):self。otherhandcards。extend(〔i〕(AllEnvCard。count(i)self。userhandcardsenv。count(i)))self。cardplaydatalist。update({threelandlordcards:self。threelandlordcardsenv,〔landlordup,landlord,landlorddown〕〔(self。userpositioncode0)3〕:self。userhandcardsenv,〔landlordup,landlord,landlorddown〕〔(self。userpositioncode1)3〕:self。otherhandcards〔0:17〕if(self。userpositioncode1)3!1elseself。otherhandcards〔17:〕,〔landlordup,landlord,landlorddown〕〔(self。userpositioncode2)3〕:self。otherhandcards〔0:17〕if(self。userpositioncode1)31elseself。otherhandcards〔17:〕})print(self。cardplaydatalist)生成手牌结束,校验手牌数量iflen(self。cardplaydatalist〔threelandlordcards〕)!3:QMessageBox。critical(self,底牌识别出错,底牌必须是3张!,QMessageBox。Yes,QMessageBox。Yes)self。initdisplay()returniflen(self。cardplaydatalist〔landlordup〕)!17orlen(self。cardplaydatalist〔landlorddown〕)!17orlen(self。cardplaydatalist〔landlord〕)!20:QMessageBox。critical(self,手牌识别出错,初始手牌数目有误,QMessageBox。Yes,QMessageBox。Yes)self。initdisplay()return得到出牌顺序self。playorder0ifself。userpositionlandlordelse1ifself。userpositionlandlordupelse2
  效果如下:
  3。AI出牌方案输出
  下面我们就需要用到DouZero开源的AI斗地主了。DouZero项目地址:https:github。comkwaiDouZero。我们需要将该开源项目下载并导入项目中。
  创建一个AI玩家角色,初始化游戏环境,加载模型,进行每轮的出牌判断,控制一局游戏流程的进行和结束。核心代码如下:创建一个代表玩家的AIaiplayers〔0,0〕aiplayers〔0〕self。userpositionaiplayers〔1〕DeepAgent(self。userposition,self。cardplaymodelpathdict〔self。userposition〕)初始化ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a环境self。envGameEnv(aiplayers)ahrefhttps:www。q578。coml60targetblankclassinfotextkey游戏a开始self。start()defstart(self):self。env。cardplayinit(self。cardplaydatalist)print(开始出牌)whilenotself。env。gameover:玩家出牌时就通过智能体获取action,否则通过识别获取其他玩家出牌ifself。playorder0:self。PredictedCard。setText(。。。)actionmessageself。env。step(self。userposition)更新界面self。UserHandCards。setText(手牌:str(。join(〔EnvCard2RealCard〔c〕forcinself。env。infosets〔self。userposition〕。playerhandcards〕))〔::1〕)self。PredictedCard。setText(actionmessage〔action〕ifactionmessage〔action〕else不出)self。WinRate。setText(胜率:actionmessage〔winrate〕)print(手牌:,str(。join(〔EnvCard2RealCard〔c〕forcinself。env。infosets〔self。userposition〕。playerhandcards〕)))print(出牌:,actionmessage〔action〕ifactionmessage〔action〕else不出,,胜率:,actionmessage〔winrate〕)whileself。havewhite(self。RPlayedCardsPos)1orpyautogui。locateOnScreen(picspass。png,regionself。RPlayedCardsPos,confidenceself。LandlordFlagConfidence):print(等待玩家出牌)self。counter。restart()whileself。counter。elapsed()100:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)self。playorder1elifself。playorder1:self。RPlayedCard。setText(。。。)passflagNonewhileself。havewhite(self。RPlayedCardsPos)0andnotpyautogui。locateOnScreen(picspass。png,regionself。RPlayedCardsPos,confidenceself。LandlordFlagConfidence):print(等待下家出牌)self。counter。restart()whileself。counter。elapsed()500:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)self。counter。restart()whileself。counter。elapsed()500:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)不出passflagpyautogui。locateOnScreen(picspass。png,regionself。RPlayedCardsPos,confidenceself。LandlordFlagConfidence)未找到不出ifpassflagisNone:识别下家出牌self。otherplayedcardsrealself。findothercards(self。RPlayedCardsPos)找到不出else:self。otherplayedcardsrealprint(下家出牌:,self。otherplayedcardsreal)self。otherplayedcardsenv〔RealCard2EnvCard〔c〕forcinlist(self。otherplayedcardsreal)〕self。env。step(self。userposition,self。otherplayedcardsenv)更新界面self。RPlayedCard。setText(self。otherplayedcardsrealifself。otherplayedcardsrealelse不出)self。playorder2elifself。playorder2:self。LPlayedCard。setText(。。。)whileself。havewhite(self。LPlayedCardsPos)0andnotpyautogui。locateOnScreen(picspass。png,regionself。LPlayedCardsPos,confidenceself。LandlordFlagConfidence):print(等待上家出牌)self。counter。restart()whileself。counter。elapsed()500:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)self。counter。restart()whileself。counter。elapsed()500:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)不出passflagpyautogui。locateOnScreen(picspass。png,regionself。LPlayedCardsPos,confidenceself。LandlordFlagConfidence)未找到不出ifpassflagisNone:识别上家出牌self。otherplayedcardsrealself。findothercards(self。LPlayedCardsPos)找到不出else:self。otherplayedcardsrealprint(上家出牌:,self。otherplayedcardsreal)self。otherplayedcardsenv〔RealCard2EnvCard〔c〕forcinlist(self。otherplayedcardsreal)〕self。env。step(self。userposition,self。otherplayedcardsenv)self。playorder0更新界面self。LPlayedCard。setText(self。otherplayedcardsrealifself。otherplayedcardsrealelse不出)else:passself。counter。restart()whileself。counter。elapsed()100:QtWidgets。QApplication。processEvents(QEventLoop。AllEvents,50)print({}胜,本局结束!。format(农民ifself。env。winnerfarmerelse地主))QMessageBox。information(self,本局结束,{}胜!。format(农民ifself。env。winnerfarmerelse地主),QMessageBox。Yes,QMessageBox。Yes)self。env。reset()self。initdisplay()
  到这里,整个AI斗地主出牌流程基本已经完成了。
  三、出牌器用法
  按照上述过程,这款AI出牌器已经制作完成了。后面应该如何使用呢?如果不想研究源码,只想使用这款AI斗地主出牌器,验证下效果,该怎么配置环境运行这个AI出牌器呢?下面就开始介绍。1。环境配置
  首先我们需要安装这些第三方库,配置相关环境,如下所示:torch1。9。0GitPython3。0。5gitdb22。0。6PyAutoGUI0。9。50PyQt55。13。0PyQt5sip12。8。1Pillow5。2。0opencvpythonrlcard2。坐标调整确认
  我们可以打开欢乐斗地主游戏界面,将游戏窗口模式下最大化运行,把AI出牌器程序窗口需要移至右下角,不能遮挡手牌、地主标志、底牌、历史出牌这些关键位置。
  其次我们要确认屏幕截图获取的各个区域是否正确。如果有问题需要进行区域位置坐标调整。坐标self。MyHandCardsPos(414,804,1041,59)我的截图区域self。LPlayedCardsPos(530,470,380,160)左边截图区域self。RPlayedCardsPos(1010,470,380,160)右边截图区域self。LandlordFlagPos〔(1320,300,110,140),(320,720,110,140),(500,300,110,140)〕地主标志截图区域(右我左)self。ThreeLandlordCardsPos(817,36,287,136)地主底牌截图区域,resize成349x168
  3。运行测试
  当所有环境配置完成,各区域坐标位置确认无误之后,下面我们就可以直接运行程序,测试效果啦
  首先我们运行AI出牌器程序,打开欢乐斗地主游戏界面,进入游戏。当玩家就位,手牌分发完毕,地主身份确认之后,我们就可以点击画面中开始按钮,让AI来帮助我们斗地主了。
  下面可以一起来看看这款AI出牌器的实验效果喔,看看AI是如何带领农民打倒地主,取得胜利的!
  若本篇内容对您有所帮助,请三连点赞,再看,转发支持一下。
投诉 评论 转载

美国销量最火车型换电!福特F150纯电版将发布重启闪电命名这可能是美国今年年度最火爆的车型,当地时间周一,福特汽车在官网发布声明,正式宣布将于美东时间5月19日举办纯电动F150皮卡发布会。美国作为车轮上的国家,皮卡也是其国内最……中概股回归,科技股将迎来大考随着滴滴公告将启动美股退市工作,美国又要求中国在美上市企业交审计底稿。中国在美国的上市公司中概股在上周五的时候迎来了抛售潮。看来科技股在美国的退市回归,可能成为未来两年的主要趋……用python制作AI欢乐斗地主出牌器,赢欢乐豆,实现财富自前言最近在网上看到一个有意思的开源项目,快手团队开发的开源AI斗地主DouZero。今天我们就一起来学习制作一个基于DouZero的欢乐斗地主出牌器,看看AI是如何来帮助……别克GL8可以先放下,五菱征程重新定义商务车,可家用商务拉货很多人都考虑买别克GL8来商用,但是别克GL8的定价比较高了,它更适合哪些已经在市场中站稳脚跟的企业老板去选择,而不适合正在创业或是准备创业的创业者们。所以对于这些创业者来说,……KlipschTheFives音箱体验什么都能连,提升桌面幸音频无线化,可算是讲了好几年的新趋势。趋势影响的不仅仅是移动音频,家用领域也有越来越多的产品加入无线化的大家庭里面。在这里,以SoundBar为首的家庭影音系统就推……苹果再次发力,iPhone13性能参数全面提升,不愧是苹果旗最近数码圈比较火的要数9月份的苹果新品发布会了,苹果iPhone可以说是手机市场上最畅销的产品之一,也是大家喜爱的产品。但近年来,随着国产手机的不断发展,国产手机的设计发生了翻……首发全新ampampquot瀑布屏ampampquot,搭配近日沈义人的官方微博公布了全新的手机屏幕,最大亮点在于极大的屏幕曲率,达到88度近乎垂直的角度,结合照片显示的图标色彩度和清晰度来看,大概率的也是一块2K屏幕,超高的屏幕素质和……iPadPro加上它,太像缩小版的ProDisplayXDR本文来自于粉丝投稿,原作者弓长每禾火,转载本文请联系原作者获取授权。很荣幸获得iPadPro套装(磁吸保护壳充电支架)的体验资格,正好是收到21款iPadPro后一份最佳……必不可少的办公小程序,用了之后办公效率瞬间翻三倍你不知道的免费微信小程序还可以办公哦!你在办公的时候遇到过用录音笔找自己需要的内容很麻烦的时候吗,遇到过文件格式转换加班的时候吗,遇到过扫描仪不够用的时候吗,别怕!这些问题只需……阿里云被暂停工信部网络安全合作单位6个月,因未及时报告高危b出品搜狐科技编辑尹莉娜12月22日消息,近日,阿里云公司发现阿帕奇(Apache)Log4j2组件严重安全漏洞隐患后,未及时向电信主管部门报告,未有效支撑工信部开展……呼伦贝尔宋MAX欢迎垂询,降价0。4万元心心念念的宋MAX,等了这么久终于有优惠了,小编打听到比亚迪益丰祥泰店10。1410。14限时特惠4。22,这么好的机会朋友们是不是也和小编一样迫不及待的想到店去感受一下呢促销……国产品牌原厂轴ClassicD87RGBCherry茶轴机械随着收入的不断提高,机械键盘不再是程序员的专属,平时打个字都想买一把红轴体验一下。而机械键盘的发展也满足了各种使用场景的需求。在机械键盘的轴体方面,Cherry轴的机械键盘还是……
聚焦商品质检中科评测联合蚂蚁链推质检联盟平台摄影中的背景虚化关键是实而不是虚。古代十大名医之祖新手小白的电脑推荐客厅连着阳台该咋装,这样设计够时尚清洁能力很出色,小洁扫地机器人,用过之后让你爱不释手nodesass无vendor目录binding。node杰士T5IIANCANCMcLaren真无线耳机新增主动降噪憋了那么久,荣耀终于要放大招了!!!金融科技助力银行业务6G时代开启?日本美国纷纷布局,会超越中国吗?新飞度不再买发动机送车,内饰配置让老款车主羡慕
慢生活之三:放慢工作节奏,提高工作效率男生对你有好感的暗示喜欢是藏不住的美术教学计划四年级数学上册《大数的认识》的教学反思苹果MacBook“小白”升级GeForce9400M热文聚 全球十大雷人养宠怪事班主任与教学工作计划深受国家电网青睐的3所大学,录取分数不算高,有机会拿到铁饭碗盆栽葡萄(盆栽葡萄怎样养护管理?)送潍州詹倅五首其三地震引发海啸时有哪些自救常识要掌握腋下出汗解决的方法(腋下出汗多怎么解决)热文聚热点网

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形