最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)俄羅斯方塊源碼

 更新時間:2021年06月18日 11:35:02   作者:網(wǎng)絡(luò)  
這篇文章主要為大家詳細介紹了C++實現(xiàn)俄羅斯方塊源碼完整版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++實現(xiàn)俄羅斯方塊的具體代碼,供大家參考,具體內(nèi)容如下

先是效果圖:

主菜單:

游戲:

設(shè)置:

錯誤處理:

代碼:

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <fstream.h>
#include <time.h>
#include <cstring>
#pragma comment( lib,"winmm.lib" )
//定義
    //方塊
#define NO 0
#define SQR 1
    //碰撞檢測
#define OK 0
#define CANTMOVE 1
    //方向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
    //錯誤碼
#define no_enough_memory    0
#define set_no_found    1
#define dat_no_found    2
#define error_argument  3
//函數(shù)聲明
    //模塊
void play();//開始游戲
void sets();//設(shè)置
void highscores();//排行榜
void copyright();//作者
    //功能
void mapsetup();//準(zhǔn)備地圖
bool newsqr();//放置方塊,返回是否游戲結(jié)束
int move(int direction);//移動方塊,返回定義表
void movetomap();//把當(dāng)前方塊移動到地圖上
int wholeline();//檢查是否組成了一層,返回層數(shù),-1表示沒有
void deleteline(int which);//刪除一行
void endup();//結(jié)束游戲,清理內(nèi)存
    //顯示
void show();//刷新畫面
void showmenu(char* menu);//顯示菜單
    //文件
void loadset();//加載設(shè)置
void saveset();//保存設(shè)置
void loadhs();//加載排行榜
bool addscores(int score,char name[50]);//增加一個分數(shù),返回是否是高分
void savehs();//保存排行榜
    //坐標(biāo)變換
int get(int x,int y);
void set(int x,int y,int date);
//結(jié)構(gòu)
    //設(shè)置
struct{
    int xs,ys;//屏幕大小
    int speed;//速度
    char sqr[3],no[3],frame[3];//方塊、空白處、邊框的樣式
}gameset;
    //排行榜
struct{
    char name[50];
    int score;
}rating[10];
//全局變量
    //變量
int* map=NULL;//地圖
bool now[4][4];//當(dāng)前方塊
int xnow,ynow;//當(dāng)前位置
int guide;//分數(shù)
    //常量
const bool shap[7][4][4]={//形狀
{\
0,0,0,0,\
0,0,0,0,\
1,1,1,1,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,1,1,0,\
0,1,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,1,1,1,\
0,0,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
1,0,0,0,\
1,1,1,0,\
0,0,0,0,\
},\
{\
0,0,0,0,\
0,0,0,1,\
0,1,1,1,\
0,0,0,0,\
},\
{\
0,1,0,0,\
0,1,1,0,\
0,0,1,0,\
0,0,0,0,\
},\
{\
0,0,1,0,\
0,1,1,0,\
0,1,0,0,\
0,0,0,0,\
}\
};
const char errword[4][50]={"程序沒能取得足夠的內(nèi)存","無法打開或找不到設(shè)置文件set.ini","無法打開或找不到排行榜數(shù)據(jù)highscore.dat","您設(shè)置的參數(shù)太大或者太小"};
    //控制臺
HANDLE    hout;//控制臺句柄
COORD curpos={0,0};//光標(biāo)坐標(biāo)
//主函數(shù)
int main()
{
start1:
    try
    {
    hout = GetStdHandle(STD_OUTPUT_HANDLE);//獲取控制臺句柄,以便移動光標(biāo)
    srand(time(0));//用當(dāng)前時間初始化隨機數(shù)生成器
    loadset();//加載
    loadhs();
start2:
    while(1)
    {
        showmenu("俄羅斯方塊\n請選擇菜單:\n1.開始游戲\n2.設(shè)置\n3.排行榜\n4.幫助\n5.保存并退出\n");
        switch(getch())
        {
        case '1':
            system("cls");//play函數(shù)覆蓋界面而不是清屏,所以需要先清屏
            play();
            break;
        case '2':
            sets();
            break;
        case '3':
            highscores();
            break;
        case '4':
            copyright();
            break;
        case '5':
            savehs();//保存數(shù)據(jù)
            saveset();
            return 0;
        }
    }
    }
    catch(int errnum)//錯誤處理
    {
        system("cls");
        printf("o(>﹏<)o 出錯啦!\n程序收到了一條錯誤信息,錯誤碼是:%d(%s)\n您可以聯(lián)系我們解決這個問題。\n",errnum,errword[errnum]);
        printf("\n你可以選擇以下操作:\n1.重啟程序\n2.以默認設(shè)置重啟程序\n3.向設(shè)置和數(shù)據(jù)文件寫入默認設(shè)置然后重啟\n4.退出\n");
        switch(getch())
        {
        case '1':
            goto start1;
        case '2':
            gameset.xs=20;
            gameset.ys=20;
            gameset.speed=100;
            strcpy(gameset.sqr,"[]");//無法直接給數(shù)組復(fù)制數(shù)據(jù)
            strcpy(gameset.no,"  ");
            strcpy(gameset.frame,"::");
            int i;
            for(i=0;i<10;i++)
                strcpy(rating[i].name,"未命名"),rating[i].score=0;
            goto start2;
        case '3':
            {
            ofstream fout;
            fout.open("set.ini");
            fout<<"20\n20\n100[]\n  \n::\n";
            fout.close();
            fout.clear();
            fout.open("highscore.dat");
            int j;
            for(j=0;j<10;j++)
                fout<<"未命名\n0\n";
            goto start1;
            }
        default:
            return -1;//返回異常退出
        }
    }
    return 0;
}
void play()
{
    mapsetup();//初始化
    /*for(int i=0;i<20;i++)
        set(i,19,SQR);*/
    while(newsqr())//不斷新建方塊,直到返回NO
    {
        while(move(DOWN)!=CANTMOVE)//每次向下移動方塊,直到不能移動
        {
            guide+=1;//向下移動一次加1分
            show();//顯示
            while(kbhit())//不斷處理鍵盤,直到?jīng)]有按鍵
            {
                switch(getch())//獲取按鍵
                {
                case 'w':
                    move(UP);
                    break;
                case 's':
                    move(DOWN);
                    break;
                case 'a':
                    move(LEFT);
                    break;
                case 'd':
                    move(RIGHT);
                    break;
                }
            }
            Sleep(gameset.speed);//延時
        }
        movetomap();//退出循環(huán)時無法向下移動,把當(dāng)前方塊移動到地圖上
        int line;
        while((line=wholeline())!=-1);//不斷檢查是否出現(xiàn)整行,直到?jīng)]有
            deleteline(line);//刪除整行
    }
    endup();//無法新建方塊,游戲結(jié)束
    return;//結(jié)束
}
//函數(shù)定義
void mapsetup()
{
    map=new int[gameset.xs*gameset.ys];//申請內(nèi)存
    if(!map)//如果申請到0
        throw no_enough_memory;//拋出異常
    //初始化地圖
    int i,j;
    for(i=0;i<gameset.xs;i++)
    {
        for(j=0;j<gameset.ys;j++)
        {
            set(i,j,NO);
        }
    }
    guide=0;//分數(shù)清零
    return;
}
int get(int x,int y)
{
    if(y<0)//上方虛擬為空
        return NO;
    if(x>=0&&x<gameset.xs&&y>=0&&y<gameset.ys)//是否在地圖范圍內(nèi)
        return *(map+y*gameset.xs+x);//提取數(shù)據(jù)
    else
        return SQR;//虛擬地圖側(cè)面和底部有方塊
}
void set(int x,int y,int date)
{
    if(x>=0&&x<gameset.xs&&y>=0&&y<gameset.ys)//if(x>0&&x<gameset.xs&&y>0&&y<gameset.ys)//是否在地圖范圍內(nèi)
        *(map+y*gameset.xs+x)=date;//寫入
    return;
}
bool newsqr(){
    int i,j;
    for(i=0;i<4;i++)//檢查下一個方塊要出現(xiàn)的地方是否有方塊
        if(get(gameset.xs/2+i,0)==SQR)
            return false;//有方塊,創(chuàng)建失敗
    int which=rand()%7;//隨機選擇形狀
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            now[i][j]=shap[which][i][j];//復(fù)制形狀
        }
    }
    for(i=rand()%4;i>0;i--)//旋轉(zhuǎn)隨機0-3次
        move(UP);
    xnow=gameset.xs/2;//設(shè)置坐標(biāo)
    ynow=-4;
    return true;
}
int move(int direction){
    int x,y;//儲存坐標(biāo)偏移量
    int i,j;
    switch(direction)
    {
    case UP://上鍵是旋轉(zhuǎn)
        bool newshap[4][4];//儲存旋轉(zhuǎn)后的圖形
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                newshap[i][j]=now[j][3-i];//坐標(biāo)變換
            }
        }
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                if(newshap[i][j]==true&&get(xnow+i,ynow+j)==SQR)//對新圖形碰撞檢測
                    return CANTMOVE;//不能旋轉(zhuǎn)
            }
        }
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                now[i][j]=newshap[i][j];//檢測完畢,復(fù)制形狀
            }
        }
        return OK;
    case DOWN://先記錄坐標(biāo)的偏移量,確定沒有碰撞以后移動
        x=0,y=1;
        break;
    case LEFT:
        x=-1;y=0;
        break;
    case RIGHT:
        x=1,y=0;
        break;
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(now[i][j]==true&&get(i+x+xnow,j+y+ynow)==SQR)//如果和地圖上的方塊重合(邊緣以外get函數(shù)也返回SQR,不必單獨處理)//if(get(i+x,j+y)==SQR)//if(now[i+x][j+y]==SQR)
            {
                return CANTMOVE;//無法移動
            }
        }
    }
    xnow+=x;//檢測完畢,更改坐標(biāo)
    ynow+=y;
    return OK;
}
void movetomap(){
    guide+=10;//成功放置方塊,加10分
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(now[i][j]==true)
                set(xnow+i,ynow+j,SQR);//復(fù)制方塊到地圖
        }
    }
    return;
}
int wholeline(){
    int i,j;
    bool whole;//儲存是否是整行
    for(j=0;j<gameset.ys;j++)//for(i=0;i<gameset.ys;i++)
    {
        whole=true;//假設(shè)是整行
        for(i=0;i<gameset.xs;i++)//for(j=0;j<gameset.xs;j++)
        {
            if(get(i,j)==NO)
                whole=false;//有空,不是整行
        }
        if(whole)
            return j;//是整行,返回
    }
    return -1;//沒找到整行,返回
}
void deleteline(int which){
    int i,j;
    guide+=1000;//消方塊,獎勵分數(shù)
    for(i=which;i>=0;i--)
    {
        for(j=0;j<gameset.xs;j++)
        {
            set(j,i,get(j,i-1));//移動上面的所有方塊,覆蓋這一行。最上面虛擬成了空,不必特殊處理
        }
    }
    return;
}
void endup(){
    delete map;//清理內(nèi)存
    system("cls");
    while(kbhit())//清除所有未處理的按鍵
        getchar();
    showmenu("游戲結(jié)束,請輸入您的姓名:");
    char name[50]="noname";
    scanf("%s",&name[0]);//輸入
    char word[1000];//儲存格式化以后的字符串
    sprintf(&word[0],"游戲結(jié)束!\n\n您(%s)的積分是:%d\n\n%s\n\n請按任意鍵繼續(xù)···\n",name,guide,((addscores(guide,name))?"你進入了排行榜":"你沒有進入排行榜"));
    showmenu(&word[0]);
    getch();
    highscores();//顯示排行榜
    savehs();//保存排行榜
    return;
}
void show(){
    int i,j;
    SetConsoleCursorPosition(hout,curpos);//system("cls");//光標(biāo)移至左上角,覆蓋之前的圖案
    printf("當(dāng)前積分:%d\n",guide);
    for(i=0;i<gameset.xs+2;i++)//輸出上邊框
        printf(gameset.frame);
    printf("\n");
    for(j=0;j<gameset.ys;j++)
    {
        printf(gameset.frame);//左邊框
        for(i=0;i<gameset.xs;i++)
        {
            if(i>=xnow&&i<(xnow+4)&&j>=ynow&&j<(ynow+4))//if(i>=xnow&&i<(xnow+1)&&j>=ynow&&j<(ynow+1))//在當(dāng)前方塊范圍內(nèi)
            {
                if(now[i-xnow][j-ynow]==true)//如果有方塊
                    printf(gameset.sqr);
                else if(get(i,j)==SQR)//如果地圖有方塊
                    printf(gameset.sqr);
                else//否則,空白
                    printf(gameset.no);
            }
            else//不在當(dāng)前方塊范圍內(nèi),輸出地圖
            {
                if(get(i,j)==SQR)//有方塊
                    printf(gameset.sqr);
                else//否則,沒方塊
                    printf(gameset.no);
            }
        }
        printf("::\n");//右邊框和換行
    }
    for(i=0;i<gameset.xs+2;i++)//下邊框
        printf(gameset.frame);
    printf("\n");
    return;
}
void showmenu(char* menu)
{
    int i,j;
    char output[100];//儲存本行的文字
    system("cls");
    for(i=0;i<gameset.xs;i++)
        printf(gameset.frame);//輸出上邊框
    printf("\n");
    i=0,j=0;
    while(*menu!='\0')
    {
        printf(gameset.frame);//左邊框
        for(i=0,j=0;*(menu+i)!='\n'&&*(menu+i)!='\0';i++,j++)//復(fù)制本行
        {
            if(*(menu+i)=='\t')//如果是制表符,輸出空格直到列數(shù)是6的倍數(shù)
            {
                for(;j%6!=5;j++)
                    output[j]=gameset.no[0];
                j--;
            }
            else
                output[j]=*(menu+i);//直接復(fù)制
        }
        menu=menu+i+1;//移動指針到下一行
        for(;j<gameset.xs*2-6;j++)//用空格填充本行的后面
            output[j]=gameset.no[0];
        output[j]='\0';//結(jié)束標(biāo)記
        printf(gameset.no);//行首空格,讓界面更好看
        printf(output);//輸出內(nèi)容
        printf(gameset.frame);//右邊框
        printf("\n");//換行
        Sleep(100);//延時,顯示漸漸出現(xiàn)的效果
    }
    for(i=0;i<gameset.xs;i++)
        printf(gameset.frame);//輸出下邊框
    printf("\n");
    return;
}
void sets()
{
    char word[1000];//要顯示的文字
while(1)
{//使用符號'\'告訴編譯器下一行應(yīng)該和本行連起來再編譯
    sprintf(&word[0],"\
設(shè)置菜單\n\
請選擇你要更改的選項:\n\
屏幕大小:\n\
\t1.寬度:%d\n\
\t2.高度:%d\n\
速度:\n\
\t3.方塊下落速度:%d\n\
顯示:\n\
\t4.方塊形狀:\"%s\"\n\
\t5.空白區(qū)域形狀:\"%s\"\n\
\t6.邊框形狀:\"%s\"\n\
7.返回\n\
",gameset.xs,gameset.ys,gameset.speed,gameset.sqr,gameset.no,gameset.frame);
    showmenu(&word[0]);
    char choice=getch();
    showmenu("請輸入改變后的參數(shù):");//顯示提示
    switch(choice)//分情況輸入
    {
    case '1':
        scanf("%d",&gameset.xs);
        if(gameset.xs<15||gameset.xs>70)
            throw error_argument;
        break;
    case '2':
        scanf("%d",&gameset.ys);
        if(gameset.ys<15||gameset.ys>70)
            throw error_argument;
        break;
    case '3':
        scanf("%d",&gameset.speed);
        if(gameset.speed<0)
            throw error_argument;
        break;
    case '4':
        cin.getline(&gameset.sqr[0],3);//scanf("%s",&gameset.sqr[0]);
        cout<<endl;
        //gameset.sqr[3]='\0';
        break;
    case '5':
        cin.getline(&gameset.no[0],3);//scanf("%s",&gameset.no[0]);
        cout<<endl;
        //gameset.no[3]='\0';
        break;
    case '6':
        cin.getline(&gameset.frame[0],3);//scanf("%s",&gameset.frame[0]);
        cout<<endl;
        //gameset.frame[3]='\0';
        break;
    case '7':
        saveset();//保存設(shè)置并返回
        return;
    }
}
}
void highscores()
{
    int i;
    char word[1000]="排行榜\n排名\t姓名\t積分\n\0";//抬頭
    for(i=0;i<10;i++)
    {
        sprintf(&word[0],"%s%d\t%s\t%d\n",&word[0],i+1,rating[i].name,rating[i].score);//追加名單
    }
    sprintf(&word[0],"%s請按任意鍵繼續(xù)···\n",&word[0]);//追加提示
    showmenu(&word[0]);
    getch();//等待按鍵
    return;
}
void copyright()
{
    showmenu("\
請使用a,s,d,w鍵,\n\
a,s,d分別為\n\
向左下右移動,\n\
w為旋轉(zhuǎn)\n\
\n\
移動速度是越小越快\n\
\n\
請按任意鍵繼續(xù)···\n\
");
        getch();
    return;
}
void loadset()
{
    ifstream fin;
    fin.open("set.ini",ios::in|ios::nocreate);//輸入文件流
    if(!fin)
        throw set_no_found;
    fin>>gameset.xs>>gameset.ys>>gameset.speed;
    fin.getline(gameset.sqr,4);//獲取整行,因為可能有空格
    fin.getline(gameset.no,4);
    fin.getline(gameset.frame,4);
    return;
}
void saveset()
{
    ofstream fout;//輸出文件流
    fout.open("set.ini",ifstream::out|ios::nocreate);
    if(!fout)
        throw set_no_found;
    fout<<gameset.xs<<'\n'<<gameset.ys<<'\n'<<gameset.speed<<gameset.sqr<<'\n'<<gameset.no<<'\n'<<gameset.frame<<'\n';
    return;
}
void loadhs()
{
    int i;
    ifstream fin;
    fin.open("highscore.dat",ifstream::in|ios::nocreate);//打開文件,不存在則錯誤
    if(!fin)//如果錯誤
        throw dat_no_found;
    for(i=0;i<10;i++)//讀取文件 
        fin>>rating[i].name>>rating[i].score;
    return;
}
bool addscores(int score,char name[50])
{
    int i,j;
    for(i=0;i<10;i++)//枚舉 
    {
        if(rating[i].score<score)//如果排行榜的積分比新積分小 
        {
            for(j=9;j>i;j--)//移動數(shù)據(jù)空出位置 
            {
                for(int k=0;k<50;k++)
                    rating[j].name[k]=rating[j-1].name[k];
                rating[j].score=rating[j-1].score;
            }
            rating[i].score=score;//插入數(shù)據(jù) 
            strcpy(rating[i].name,name);
            return true;//返回進入排行 
        }
    }
    return false;//返回沒有進入 
}
void savehs()
{
    int i;
    ofstream fout;
    fout.open("highscore.dat",ifstream::out|ios::nocreate);
    if(!fout)
        throw dat_no_found;
    for(i=0;i<10;i++)
        fout<<rating[i].name<<'\n'<<rating[i].score<<'\n';
    return;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言生成隨機uuid編碼示例

    c語言生成隨機uuid編碼示例

    這篇文章主要介紹了c語言生成隨機uuid編碼示例,需要的朋友可以參考下
    2014-05-05
  • C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法

    C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法

    這篇文章主要介紹了C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法,實例分析了strlen函數(shù)的實現(xiàn)原理與不使用變量求字符串長度的實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C語言中_string.h庫函數(shù)功能及其用法詳解

    C語言中_string.h庫函數(shù)功能及其用法詳解

    在計算機編程中,字符串處理是一項常見而重要的任務(wù),C語言的string.h頭文件提供了一系列函數(shù)和工具,用于對字符串進行操作和處理,本文將對string.h頭文件中的所有函數(shù)進行全面介紹,包括它們的功能和使用方法,以幫助大家更好地理解和利用該頭文件
    2023-12-12
  • C++虛析構(gòu)函數(shù)的使用分析

    C++虛析構(gòu)函數(shù)的使用分析

    本篇文章是對C++虛析構(gòu)函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 適合初學(xué)者的C語言常量類型的講解

    適合初學(xué)者的C語言常量類型的講解

    常量是固定值,在程序執(zhí)行期間不會改變。這些固定的值,又叫做字面量。常量可以是任何的基本數(shù)據(jù)類型,比如整數(shù)常量、浮點常量、字符常量,或字符串字面值,也有枚舉常量。常量就像是常規(guī)的變量,只不過常量的值在定義后不能進行修改
    2022-04-04
  • QT實現(xiàn)自定義Http客戶端的示例代碼

    QT實現(xiàn)自定義Http客戶端的示例代碼

    這篇文章主要為大家詳細介紹了QT如何實現(xiàn)自定義Http客戶端的,可以實現(xiàn)支持get,post請求方式;支持連接超時處理;支持網(wǎng)絡(luò)錯誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • C++實現(xiàn)LeetCode(186.翻轉(zhuǎn)字符串中的單詞之二)

    C++實現(xiàn)LeetCode(186.翻轉(zhuǎn)字符串中的單詞之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(186.翻轉(zhuǎn)字符串中的單詞之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言lseek()函數(shù)詳解

    C語言lseek()函數(shù)詳解

    這篇文章主要介紹了C語言lseek()函數(shù)詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++深入了解模板的使用

    C++深入了解模板的使用

    這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C++特殊成員函數(shù)以及其生成機制詳解

    C++特殊成員函數(shù)以及其生成機制詳解

    這篇文章主要給大家介紹了關(guān)于C++特殊成員函數(shù)以及其生成機制的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02

最新評論

商洛市| 丰都县| 都匀市| 阜康市| 清苑县| 双牌县| 喀什市| 高陵县| 平原县| 海兴县| 明溪县| 临武县| 杭锦后旗| 贵德县| 合川市| 旬阳县| 泽州县| 汤阴县| 巫溪县| 南江县| 千阳县| 都匀市| 拜城县| 祁连县| 乾安县| 开原市| 滦平县| 迁西县| 玛多县| 普格县| 沈丘县| 开阳县| 云梦县| 景德镇市| 德化县| 大安市| 都安| 工布江达县| 西林县| 毕节市| 枞阳县|