久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

時(shí)間:2019-05-12 03:57:25下載本文作者:會(huì)員上傳
簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》。

第一篇:黑白棋游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

青島大學(xué)軟件技術(shù)學(xué)院

游戲算法實(shí)踐報(bào)告

姓 名 專(zhuān) 業(yè) 班 級(jí) 指導(dǎo)教師

2013年 1 月 16日

目錄 問(wèn)題定義與描述...................................................................................................3 1.1 問(wèn)題定義.....................................................................................................3 1.2 問(wèn)題描述.....................................................................................................3 2 關(guān)鍵技術(shù)...............................................................................................................3 3 數(shù)據(jù)的組織...........................................................................................................3 3.1數(shù)據(jù)類(lèi)型定義..............................................................................................3 3.2數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)..............................................................................................3 4 總體設(shè)計(jì)...............................................................................................................4 4.1 系統(tǒng)模塊圖..................................................................................................4 4.2 二維數(shù)組的基本操作..................................................................................4 5.詳細(xì)設(shè)計(jì)................................................................................................................5 5.1主函數(shù)流程圖...............................................................................................5 5.2雙方走棋函數(shù)流程圖...................................................................................6 5.3計(jì)算分?jǐn)?shù)函數(shù)流程圖...................................................................................8 6 測(cè)試結(jié)果及分析...................................................................................................9 7 心得體會(huì)...............................................................................................................9 附錄:程序代碼.......................................................................................................9 1 問(wèn)題定義與描述

1.1 問(wèn)題定義

黑白棋游戲

1.2 問(wèn)題描述

將黑白棋8X8的棋盤(pán)轉(zhuǎn)化為一個(gè)二維數(shù)組,將棋的各種操作轉(zhuǎn)化為二維數(shù)組的操作 關(guān)鍵技術(shù)

二維數(shù)組,判斷情況的選擇 數(shù)據(jù)的組織

棋盤(pán)各個(gè)格子的地址x、y,雙方棋子放置的地址i、j,雙方新棋子放置的地址ii、jj,棋子活動(dòng)的地址kk,將要被連成一行的棋子k,圖形、顏色文件的調(diào)用等

3.1數(shù)據(jù)類(lèi)型定義

#define LEFT 0x4b00 /*光標(biāo)左鍵值*/ #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/ #define DOWN 0x5000 /*光標(biāo)下鍵值*/ #define UP 0x4800 /*光標(biāo)上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車(chē)鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/ 3.2數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)

二維數(shù)組以順序存儲(chǔ)的形式實(shí)現(xiàn) 4 總體設(shè)計(jì) 4.1 系統(tǒng)模塊圖

圖4.1 系統(tǒng)模塊圖

4.2 二維數(shù)組的基本操作

向上:縱坐標(biāo)-1 向下:縱坐標(biāo)+1 向左:橫坐標(biāo)-1 向右:橫坐標(biāo)+1 左上:橫-1,縱-1 左下:橫-1,縱+1 右上:橫+1,縱-1 右下:橫+1,縱+1 確定落子:返回1值,結(jié)束循環(huán),跳入player2,反之亦然 統(tǒng)計(jì)分?jǐn)?shù):落子后score++,結(jié)束循環(huán),跳入score2,反之亦然

5.詳細(xì)設(shè)計(jì)

5.1主函數(shù)流程圖

圖5.1 主函數(shù)流程圖

5.2雙方走棋函數(shù)流程圖

圖5.2 雙方走棋函數(shù)流程圖

5.3計(jì)算分?jǐn)?shù)函數(shù)流程圖

圖5.3 計(jì)算分?jǐn)?shù)函數(shù)流程圖

6 測(cè)試結(jié)果及分析

圖6

運(yùn)行程序,初始狀態(tài)如圖所示 心得體會(huì)

數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì)學(xué)習(xí)讓我初步體會(huì)到編程需要的耐心、細(xì)致,在調(diào)整程序時(shí)更深刻地體會(huì)到函數(shù)調(diào)用名必須一致,C語(yǔ)言對(duì)大寫(xiě)小寫(xiě)十分敏感,以前沒(méi)用過(guò)這么復(fù)雜的程序,這次更有了深刻的體會(huì)。與此同時(shí)更加熟悉了二維數(shù)組在游戲編程中的應(yīng)用和C語(yǔ)言的圖形文件的使用方法,不止迷宮的邊界,棋盤(pán)的操作也是靠二維數(shù)組完成的。

附錄:程序代碼

/*3.3.4 源程序*/ #include “graphics.h” /*圖形系統(tǒng)頭文件*/ #include “stdio.h” #define LEFT 0x4b00 /*光標(biāo)左鍵值*/ #define RIGHT 0x4d00 /*光標(biāo)右鍵值*/ #define DOWN 0x5000 /*光標(biāo)下鍵值*/ #define UP 0x4800 /*光標(biāo)上鍵值*/ #define ESC 0x011b /* ESC鍵值*/ #define ENTER 0x1c0d /* 回車(chē)鍵值*/ int a[8][8]={0},key,score1,score2;/*具體分?jǐn)?shù)以及按鍵與存放棋子的變量*/ char playone[3],playtwo[3];/*兩個(gè)人的得分轉(zhuǎn)換成字符串輸出*/ void playtoplay(void);/*人人對(duì)戰(zhàn)函數(shù)*/ void DrawQp(void);/*畫(huà)棋盤(pán)函數(shù)*/ void SetPlayColor(int x);/*設(shè)置棋子第一次的顏色*/ void MoveColor(int x,int y);/*恢復(fù)原來(lái)棋盤(pán)狀態(tài)*/ int QpChange(int x,int y,int z);/*判斷棋盤(pán)的變化*/ void DoScore(void);/*處理分?jǐn)?shù)*/ void PrintScore(int n);/*輸出成績(jī)*/ void playWin(void);/*輸出勝利者信息*/ /******主函數(shù)*********/ void main(void){

int gd=DETECT,gr;

initgraph(&gd,&gr,“c: c”);/*初始化圖形系統(tǒng)*/

DrawQp();/*畫(huà)棋盤(pán)*/

playtoplay();/*人人對(duì)戰(zhàn)*/

closegraph();/*關(guān)閉圖形系統(tǒng)*/

getch();} void DrawQp()/*畫(huà)棋盤(pán)*/ {

int i,j;

score1=score2=0;/*棋手一開(kāi)始得分都為0*/

setbkcolor(BLUE);

for(i=100;i<=420;i+=40)

{

line(100,i,420,i);/*畫(huà)水平線*/

line(i,100,i,420);/*畫(huà)垂直線*/

}

setcolor(0);/*取消圓周?chē)囊蝗|西*/

setfillstyle(SOLID_FILL,15);/*白色實(shí)體填充模式*/

fillellipse(500,200,15,15);/*在顯示得分的位置畫(huà)棋*/

setfillstyle(SOLID_FILL,8);/*黑色實(shí)體填充模式*/

fillellipse(500,300,15,15);

a[3][3]=a[4][4]=1;/*初始兩個(gè)黑棋*/

a[3][4]=a[4][3]=2;/*初始兩個(gè)白棋*/

setfillstyle(SOLID_FILL,WHITE);

fillellipse(120+3*40,120+3*40,15,15);

fillellipse(120+4*40,120+4*40,15,15);

setfillstyle(SOLID_FILL,8);

fillellipse(120+3*40,120+4*40,15,15);

fillellipse(120+4*40,120+3*40,15,15);

score1=score2=2;/*有棋后改變分?jǐn)?shù)*/

DoScore();/*輸出開(kāi)始分?jǐn)?shù)*/ } void playtoplay()/*人人對(duì)戰(zhàn)*/ {

int x,y,t=1,i,j,cc=0;

while(1)/*換棋手走棋*/

{

x=120,y=80;/*每次棋子一開(kāi)始出來(lái)的坐標(biāo),x為行坐標(biāo),y為列坐標(biāo)*/

while(1)/*具體一個(gè)棋手走棋的過(guò)程*/

{

PrintScore(1);/*輸出棋手1的成績(jī)*/

PrintScore(2);/*輸出棋手2的成績(jī)*/

SetPlayColor(t);/*t變量是用來(lái)判斷棋手所執(zhí)棋子的顏色*/

fillellipse(x,y,15,15);

key=bioskey(0);/*接收按鍵*/

if(key==ESC)/*跳出游戲*/

break;

else

if(key==ENTER)/*如果按鍵確定就可以跳出循環(huán)*/

{

if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒(méi)有棋子*/

{

if(t%2==1)/*如果是棋手1移動(dòng)*/

a[(x-120)/40][(y-120)/40]=1;

else/*否則棋手2移動(dòng)*/

a[(x-120)/40][(y-120)/40]=2;

if(!QpChange(x,y,t))/*落子后判斷棋盤(pán)的變化*/

{

a[(x-120)/40][(y-120)/40]=0;/*恢復(fù)空格狀態(tài)*/

cc++;/*開(kāi)始統(tǒng)計(jì)嘗試次數(shù)*/

if(cc>=64-score1-score2)/*如果嘗試超過(guò)空格數(shù)則停步*/

{

MoveColor(x,y);

fillellipse(x,y,15,15);

break;

}

else

continue;/*如果按鍵無(wú)效*/

}

DoScore();/*分?jǐn)?shù)的改變*/

break;/*棋盤(pán)變化了,則輪對(duì)方走棋*/

}

else/*已經(jīng)有棋子就繼續(xù)按鍵*/

continue;

}

else /*四個(gè)方向按鍵的判斷*/

if(key==LEFT&&x>120)/*左方向鍵*/

{

MoveColor(x,y);

fillellipse(x,y,15,15);

SetPlayColor(t);

x-=40;

fillellipse(x,y,15,15);

}

else

if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/

{

MoveColor(x,y);

fillellipse(x,y,15,15);

SetPlayColor(t);

x+=40;

fillellipse(x,y,15,15);

}

else

if(key==UP&&y>120)/*上方向鍵*/

{

MoveColor(x,y);

fillellipse(x,y,15,15);

SetPlayColor(t);

y-=40;

fillellipse(x,y,15,15);

}

else

if(key==DOWN&&y<400)/*下方向鍵*/

{

MoveColor(x,y);

fillellipse(x,y,15,15);

SetPlayColor(t);

y+=40;

fillellipse(x,y,15,15);

}

}

if(key==ESC)/*結(jié)束游戲*/

break;

if((score1+score2)==64||score1==0||score2==0)/*格子已經(jīng)占滿(mǎn)或一方棋子為0判斷勝負(fù)*/

{

playWin();/*輸出最后結(jié)果*/

break;

}

t=t%2+1;/*一方走后,改變棋子顏色即輪對(duì)方走*/

cc=0;/*計(jì)數(shù)值恢復(fù)為0*/

} /*endwhile*/ } void SetPlayColor(int t)/*設(shè)置棋子顏色*/ {

if(t%2==1)

setfillstyle(SOLID_FILL,15);/*白色*/

else

setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢復(fù)原來(lái)格子的狀態(tài)*/ {

if(y<100)/*如果是從起點(diǎn)出發(fā)就恢復(fù)藍(lán)色*/

setfillstyle(SOLID_FILL,BLUE);

else/*其他情況如果是1就恢復(fù)白色棋子,2恢復(fù)黑色棋子,或恢復(fù)藍(lán)色棋盤(pán)*/

switch(a[(x-120)/40][(y-120)/40])

{

case 1:

setfillstyle(SOLID_FILL,15);break;/*白色*/

case 2:

setfillstyle(SOLID_FILL,8);break;/*黑色*/

default:

setfillstyle(SOLID_FILL,BLUE);/*藍(lán)色*/

} } int QpChange(int x,int y,int t)/*判斷棋盤(pán)的變化*/ {

int i,j,k,kk,ii,jj,yes;

yes=0;

i=(x-120)/40;/*計(jì)算數(shù)組元素的行下標(biāo)*/

j=(y-120)/40;/*計(jì)算數(shù)組元素的列下標(biāo)*/

SetPlayColor(t);/*設(shè)置棋子變化的顏色*/

/*開(kāi)始往8個(gè)方向判斷變化*/

if(j<6)/*往右邊*/

{

for(k=j+1;k<8;k++)

if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結(jié)束*/

break;

if(a[i][k]!=0&&k<8)

{

for(kk=j+1;kk

{

a[i][kk]=a[i][j];/*改變棋子顏色*/

fillellipse(120+i*40,120+kk*40,15,15);

}

if(kk!=j+1)/*條件成立則有棋子改變過(guò)顏色*/

yes=1;

}

}

if(j>1)/*判斷左邊*/

{

for(k=j-1;k>=0;k--)

if(a[i][k]==a[i][j]||!a[i][k])

break;

if(a[i][k]!=0&&k>=0)

{

for(kk=j-1;kk>k&&k>=0;kk--)

{

a[i][kk]=a[i][j];

fillellipse(120+i*40,120+kk*40,15,15);

}

if(kk!=j-1)

yes=1;

}

}

if(i<6)/*判斷下邊*/

{

for(k=i+1;k<8;k++)

if(a[k][j]==a[i][j]||!a[k][j])

break;

if(a[k][j]!=0&&k<8)

{

for(kk=i+1;kk

{

a[kk][j]=a[i][j];

fillellipse(120+kk*40,120+j*40,15,15);

}

if(kk!=i+1)

yes=1;

}

}

if(i>1)/*判斷上邊*/

{

for(k=i-1;k>=0;k--)

if(a[k][j]==a[i][j]||!a[k][j])

break;

if(a[k][j]!=0&&k>=0)

{

for(kk=i-1;kk>k&&k>=0;kk--)

{

a[kk][j]=a[i][j];

fillellipse(120+kk*40,120+j*40,15,15);

}

if(kk!=i-1)

yes=1;

}

}

if(i>1&&j<6)/*右上*/

{

for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)

if(a[k][kk]==a[i][j]||!a[k][kk])

break;

if(a[k][kk]&&k>=0&&kk<8)

{

for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)

{

a[ii][jj]=a[i][j];

fillellipse(120+ii*40,120+jj*40,15,15);

}

if(ii!=i-1)

yes=1;

}

}

if(i<6&&j>1)/*左下*/

{

for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)

if(a[k][kk]==a[i][j]||!a[k][kk])

break;

if(a[k][kk]!=0&&k<8&&kk>=0)

{

for(ii=i+1,jj=j-1;ii

{

a[ii][jj]=a[i][j];

fillellipse(120+ii*40,120+jj*40,15,15);

}

if(ii!=i+1)

yes=1;

}

}

if(i>1&&j>1)/*左上*/

{

for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)

if(a[k][kk]==a[i][j]||!a[k][kk])

break;

if(a[k][kk]!=0&&k>=0&&kk>=0)

{

for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)

{

a[ii][jj]=a[i][j];

fillellipse(120+ii*40,120+jj*40,15,15);

}

if(ii!=i-1)

yes=1;

}

}

if(i<6&&j<6)/* 右下*/

{

for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)

if(a[k][kk]==a[i][j]||!a[k][kk])

break;

if(a[k][kk]!=0&&kk<8&&k<8)

{

for(ii=i+1,jj=j+1;ii

{

a[ii][jj]=a[i][j];

fillellipse(120+ii*40,120+jj*40,15,15);

}

if(ii!=i+1)

yes=1;

}

}

return yes;/*返回是否改變過(guò)棋子顏色的標(biāo)記*/ } void DoScore()/*處理分?jǐn)?shù)*/ {

int i,j;

score1=score2=0;/*重新開(kāi)始計(jì)分?jǐn)?shù)*/

for(i=0;i<8;i++)

for(j=0;j<8;j++)

if(a[i][j]==1)/*分別統(tǒng)計(jì)兩個(gè)人的分?jǐn)?shù)*/

score1++;

else

if(a[i][j]==2)

score2++;} void PrintScore(int playnum)/*輸出成績(jī)*/ {

if(playnum==1)/*清除以前的成績(jī)*/

{

setfillstyle(SOLID_FILL,BLUE);

bar(550,100,640,400);

}

setcolor(RED);

settextstyle(0,0,4);/*設(shè)置文本輸出樣式*/

if(playnum==1)/*判斷輸出哪個(gè)棋手的分,在不同的位置輸出*/

{

sprintf(playone,“%d”,score1);

outtextxy(550,200,playone);

}

else

{

sprintf(playtwo,“%d”,score2);

outtextxy(550,300,playtwo);

}

setcolor(0);} void playWin()/*輸出最后的勝利者結(jié)果*/ {

settextstyle(0,0,4);

setcolor(12);

if(score2>score1)/*開(kāi)始判斷最后的結(jié)果*/

outtextxy(100,50,“black win!”);

else

if(score2

outtextxy(100,50,“white win!”);

else

outtextxy(60,50,“you all win!”);

getch();}

第二篇:C語(yǔ)言課程設(shè)計(jì)黑白棋

第一章 緒論

1.1 C語(yǔ)言概述

C語(yǔ)言是國(guó)際上廣泛流行且很有發(fā)展前途的計(jì)算機(jī)高級(jí)語(yǔ)言,不僅用來(lái)編寫(xiě)應(yīng)用軟件,也用來(lái)編寫(xiě)系統(tǒng)軟件。C語(yǔ)言功能豐富,使用靈活,可移植性好,深受廣大用戶(hù)歡迎。C語(yǔ)言的數(shù)據(jù)類(lèi)型豐富,既具有高級(jí)程序設(shè)計(jì)語(yǔ)言的優(yōu)點(diǎn),又具有低級(jí)程序設(shè)計(jì)語(yǔ)言的特點(diǎn);既可以用來(lái)編寫(xiě)系統(tǒng)程序,又可以用來(lái)編寫(xiě)應(yīng)用程序。(例如,著名的UNIX操作系統(tǒng)就是用C語(yǔ)言編寫(xiě)的)因此,C語(yǔ)言正在被迅速地推廣和普及。.2 C語(yǔ)言出現(xiàn)的歷史背景

在C語(yǔ)言誕生以前,操作系統(tǒng)及其他系統(tǒng)軟件主要是用匯編語(yǔ)言實(shí)現(xiàn)的。由于匯編語(yǔ)言程序設(shè)計(jì)依賴(lài)于計(jì)算機(jī)硬件,其可讀性和可移植性都很差,而一般的高級(jí)語(yǔ)言又難以實(shí)現(xiàn)對(duì)計(jì)算機(jī)硬件的直接操作,因此人們需要一種兼有匯編語(yǔ)言和高級(jí)語(yǔ)言特性的語(yǔ)言。C語(yǔ)言就是在這種環(huán)境下產(chǎn)生的。它最早是由Dennis Richie于1973年設(shè)計(jì)并實(shí)現(xiàn)。它的產(chǎn)生同UNIX系統(tǒng)之間具有非常密切的聯(lián)系——C語(yǔ)言是在UNIX系統(tǒng)上開(kāi)發(fā)的。而無(wú)論UNIX系統(tǒng)本身還是其上運(yùn)行的大部分程序,都是用C語(yǔ)言編寫(xiě)實(shí)現(xiàn)。同時(shí),它同樣適合于編寫(xiě)不同領(lǐng)域中的大多數(shù)程序。

C語(yǔ)言已經(jīng)成為全球程序員的公共語(yǔ)言,并且由此產(chǎn)生了當(dāng)前兩個(gè)主流的語(yǔ)言C++和Java——它們都建立在C語(yǔ)言的語(yǔ)法和基本結(jié)構(gòu)的基礎(chǔ)上,而且現(xiàn)在世界上的許多軟件都是在C語(yǔ)言及其衍生的各種語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)而成。

目前,在微機(jī)上廣泛使用的C語(yǔ)言編譯系統(tǒng)有Turbo C、Borland C++、Microsoft Visual C++等。雖然它們的基本部分都是相同的,但還是有一些差異,本程序的設(shè)計(jì)采用Turbo C作為上機(jī)編程調(diào)試環(huán)境。

C語(yǔ)言特點(diǎn)和用途

①語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。共有32個(gè)關(guān)鍵字,1 9種控制語(yǔ)句。

②運(yùn)算符豐富,公有34種運(yùn)算符。

③數(shù)據(jù)結(jié)構(gòu)豐富,數(shù)據(jù)類(lèi)型有:整型、實(shí)型、字符型、數(shù)組、指針、結(jié)構(gòu)體、共用體等。

④具有結(jié)構(gòu)化的控制語(yǔ)句(如if?else、while、do?while、switch、for)

⑤語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。

⑥允許直接訪問(wèn)物理地址,能進(jìn)行位(bit)操作,可以直接對(duì)硬件操作。

⑦生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。⑧可移植性好。C語(yǔ)言的用途

C雖不擅長(zhǎng)科學(xué)計(jì)算和管理領(lǐng)域,但對(duì)操作系統(tǒng)和系統(tǒng)實(shí)用程序以及對(duì)硬件進(jìn)行操作方面,C有明顯的優(yōu)勢(shì)。現(xiàn)在很多大型應(yīng)用軟件也用C編寫(xiě)。

C語(yǔ)言程序一般用小寫(xiě)字母,而僅在一些宏定義中,將常量名用大寫(xiě)字母表示,或?qū)σ恍┯刑厥庖饬x的變量,偶爾也用大寫(xiě)字母表示。C語(yǔ)言中對(duì)大小寫(xiě)字母看作兩個(gè)變量。

在C語(yǔ)言的程序設(shè)計(jì)中,用戶(hù)程序的功能快都是一些函數(shù),而函數(shù)在定義時(shí),可選用省略號(hào)來(lái)表示參數(shù)類(lèi)型和個(gè)數(shù)的不確定性。如function(F1,?)的函數(shù)的第一個(gè)參數(shù)F1表示為某種類(lèi)型的變量,而后的其它參數(shù)無(wú)論是類(lèi)型還是參數(shù)個(gè)數(shù)都不確定。在c函數(shù)調(diào)用時(shí),參數(shù)或參數(shù)的指針都被壓入堆棧,并且最后一個(gè)參數(shù)最先進(jìn)入堆棧,第一個(gè)參數(shù)最后進(jìn)入堆棧。如果小系統(tǒng)模式編譯,變量的指針為2字節(jié),如果用大系統(tǒng)模式編譯,變量的指針為4字節(jié),如果我們求得第一個(gè)參數(shù)指針在堆棧內(nèi)的地址,加上變量指針的字節(jié)數(shù),再取相應(yīng)內(nèi)存的內(nèi)容,即求出其它各參數(shù)指針在堆棧內(nèi)的地址,從而可引用用省略號(hào)說(shuō)明的參數(shù)。第二章 開(kāi)發(fā)環(huán)境及相關(guān)技術(shù)的介紹.1開(kāi)發(fā)環(huán)境介紹

TURBO C是DOS上的一個(gè)C語(yǔ)言系統(tǒng),它也能以全屏幕方式或窗口方式運(yùn)行在各種Windows環(huán)境中。TURBO C符合ANSI C標(biāo)準(zhǔn)。TURBO C的組成部分包括C語(yǔ)言編譯系統(tǒng),連接系統(tǒng),ANSI C的標(biāo)準(zhǔn)函數(shù)庫(kù)和一批擴(kuò)充庫(kù)函數(shù)等。另一重要組成部分是一個(gè)集成化程序開(kāi)發(fā)環(huán)境,用戶(hù)可方便地在其中編輯、編譯、調(diào)試和運(yùn)行自己的程序。

今天微機(jī)上的C語(yǔ)言系統(tǒng)很多,有些新系統(tǒng)的功能更強(qiáng)大。但TURBO C環(huán)境有許多特點(diǎn),在基本的C程序設(shè)計(jì)課程教學(xué)中被廣泛使用。本系統(tǒng)既簡(jiǎn)單且功能完整,開(kāi)始使用需要理解的概念少,容易入門(mén),特別適合初學(xué)者。TURBO C系統(tǒng)對(duì)計(jì)算機(jī)要求低,在任何微機(jī)上都能很好運(yùn)行,編譯加工速度快,對(duì)于做程序練習(xí)和一般的程序開(kāi)發(fā)都很合適。另外,TURBO C的編程和調(diào)試環(huán)境也很完整,反映了集成化開(kāi)發(fā)環(huán)境的特點(diǎn)。掌握了這個(gè)程序開(kāi)發(fā)工具的使用方法,不但掌握了一個(gè)實(shí)用的程序開(kāi)發(fā)工具,也能為進(jìn)一步學(xué)習(xí)使用其他編程工具打下很好的基礎(chǔ)

C語(yǔ)言對(duì)操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用C語(yǔ)言明顯優(yōu)于其它解釋型高級(jí)語(yǔ)言,有一些大型應(yīng)用軟件也是用C語(yǔ)言編寫(xiě)的

在C語(yǔ)言中,函數(shù)是一種構(gòu)件(程序塊),是完成程序功能的基本構(gòu)件。函數(shù)允許一個(gè)程序的諸任務(wù)被分別定義和編碼,使程序模塊化。可以確信,一個(gè)好的函數(shù)不僅能正確工作且不會(huì)對(duì)程序的其它部分產(chǎn)生副作用。C語(yǔ)言的特點(diǎn) 第一部分

1.簡(jiǎn)潔緊湊、靈活方便

C語(yǔ)言一共只有32個(gè)關(guān)鍵字9種控制語(yǔ)句,程序書(shū)寫(xiě)自由,主要用小寫(xiě)字母表示。它把高級(jí)語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。C 語(yǔ)言可以像匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作, 而這三者是計(jì)算機(jī)最基本的工作單元。2.運(yùn)算符豐富

C的運(yùn)算符包含的范圍很廣泛,共有種34個(gè)運(yùn)算符。C語(yǔ)言把括號(hào)、賦值、強(qiáng)制類(lèi)型轉(zhuǎn)換等都作為運(yùn)算符處理。從而使C的運(yùn)算類(lèi)型極其豐富表達(dá)式類(lèi)型多樣化,靈活使用各種運(yùn)算符可以實(shí) 現(xiàn)在其它高級(jí)語(yǔ)言中難以實(shí)現(xiàn)的運(yùn)算。3.數(shù)據(jù)結(jié)構(gòu)豐富

C的數(shù)據(jù)類(lèi)型有:整型、實(shí)型、字符型、數(shù)組類(lèi)型、指針類(lèi)型、結(jié)構(gòu)體類(lèi)型、共用體類(lèi)型等。能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類(lèi)型的運(yùn)算。并引入了指針概念,使程序效率更高。另外C語(yǔ)言具有強(qiáng)大的圖形功能, 支持多種顯示器和驅(qū)動(dòng)器。且計(jì)算功能、邏輯判斷功能強(qiáng)大。

4.C是結(jié)構(gòu)式語(yǔ)言

結(jié)構(gòu)式語(yǔ)言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化,即程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦? 便于使用、維護(hù)以及調(diào)試。C語(yǔ)言是以函數(shù)形式提供給用戶(hù)的,這些函數(shù)可方便的調(diào)用,并具有多種循環(huán)、條件語(yǔ)句控制程序流向,從而使程序完全結(jié)構(gòu)化。

5.C語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大

雖然C語(yǔ)言也是強(qiáng)類(lèi)型語(yǔ)言,但它的語(yǔ)法比較靈活,允許程序編寫(xiě)者有較大的自由度。

6.C語(yǔ)言允許直接訪問(wèn)物理地址,可以直接對(duì)硬件進(jìn)行操作

因此既具有高級(jí)語(yǔ)言的功能,又具有低級(jí)語(yǔ)言的許多功能,能夠像匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元,可以用來(lái)寫(xiě)系統(tǒng)軟件。7.C語(yǔ)言程序生成代碼質(zhì)量高,程序執(zhí)行效率高

一般只比匯編程序生成的目標(biāo)代碼效率低10へ20%。8.C語(yǔ)言適用范圍大,可移植性好

C語(yǔ)言有一個(gè)突出的優(yōu)點(diǎn)就是適合于多種操作系統(tǒng), 如DOS、UNIX,也適用于多種機(jī) C源程序的結(jié)構(gòu)點(diǎn)特

1.一個(gè)C語(yǔ)言源程序可以由一個(gè)或多個(gè)源文件組成。2.每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。

3.一個(gè)源程序不論由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。

4.源程序中可以有預(yù)處理命令(include 命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。

5.每一個(gè)說(shuō)明,每一個(gè)語(yǔ)句都必須以分號(hào)結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號(hào)“}”之后不能加分號(hào)。6.標(biāo)識(shí)符,關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格來(lái)間隔。

本軟件主要應(yīng)用了二維數(shù)組﹑Switch語(yǔ)句﹑do—while語(yǔ)句等。數(shù)組:C語(yǔ)言可以提供構(gòu)造類(lèi)型的數(shù)據(jù),他們有數(shù)組類(lèi)型﹑結(jié)構(gòu)體類(lèi)型和共用體類(lèi)型。數(shù)組是有許多數(shù)據(jù)的集合,數(shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類(lèi)型。用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來(lái)唯一地確定數(shù)組中的元素。第三章 開(kāi)發(fā)環(huán)境的關(guān)鍵技術(shù)

科技的飛速發(fā)展,將人類(lèi)帶入了信息時(shí)代,計(jì)算機(jī)越來(lái)越貼近人的生活,速度成為人們成功的前提條件,以致于人們必須不斷嘗試著使用各種手段來(lái)提高自身的工作效率,其手段之一就是對(duì)鍵盤(pán)的充分利用和相應(yīng)游戲軟件的開(kāi)發(fā).智能型的游戲越來(lái)越深受廣大游戲愛(ài)好者的喜歡.方便而快捷.黑白棋的游戲是要在一個(gè)8*8的網(wǎng)格中進(jìn)行,而數(shù)組屬于構(gòu)造體類(lèi)型,數(shù)組是具有相同數(shù)據(jù)類(lèi)型的變量序列,序列中的每個(gè)變量成為元素,數(shù)組元素由一個(gè)統(tǒng)一標(biāo)識(shí)的數(shù)組名和順序好“下標(biāo)”來(lái)表示。顧需要在游戲中定義一個(gè)二維數(shù)從而實(shí)現(xiàn)游戲的走棋、落棋、判斷棋盤(pán)的變化等。

游戲不同于基于C語(yǔ)言的其他程序(如學(xué)生成績(jī)管理系統(tǒng)、教務(wù)工作管理系統(tǒng)、圖書(shū)管理系統(tǒng)等)由于游戲本身的問(wèn)地就在于緩解壓力,所以基于C語(yǔ)言設(shè)計(jì)的游戲需要一個(gè)良好的游戲界面,給游戲者以輕松和愉快的感覺(jué)。TURBO C提供了70多個(gè)圖形函數(shù),這些函數(shù)包括在圖形庫(kù)文件graphics.LIB中,他們被定義在graphics.h中。有如此強(qiáng)大的圖形處理能力,去設(shè)計(jì)一個(gè)良好的人機(jī)交流界面是可行的。

由于此游戲采用的是“人人對(duì)戰(zhàn)”的模式,所以在游戲時(shí),需要倆個(gè)游戲者輪流下棋,棋手1走棋完畢后,經(jīng)過(guò)判斷棋盤(pán)變化過(guò)程后棋手2走棋,游戲過(guò)程需要在倆棋手間不斷進(jìn)行轉(zhuǎn)化。在C語(yǔ)言中,提供了包括if??else,switch??case等分支語(yǔ)句,綜合運(yùn)用這些分支語(yǔ)句,可以完成上述轉(zhuǎn)化。

黑白棋游戲雙方共需要走棋60手,每次走棋后,都需要根據(jù)相同的標(biāo)準(zhǔn)判斷棋盤(pán)變化,來(lái)判斷旗子顏色的變化情況。顯然需要運(yùn)用循環(huán)語(yǔ)句來(lái)簡(jiǎn)化編程的長(zhǎng)度。C語(yǔ)言中提供了while for等循環(huán)語(yǔ)句可以實(shí)現(xiàn)上述功能。

游戲需要操作和輸出顯示游戲的結(jié)果,游戲的操作要由計(jì)算機(jī)的外部設(shè)備在人的操作下完成。C語(yǔ)言本身并不提供輸入和輸出語(yǔ)句,輸入和輸出的操作都是由函數(shù)來(lái)完成的,在C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù)中提供了一些輸入和輸出的函數(shù),這些函數(shù)的指針都是針對(duì)系統(tǒng)隱含指定的輸入和輸出設(shè)備的。綜合運(yùn)用這些輸入和輸出的函數(shù)可以實(shí)現(xiàn)上述的功能。

第四章 程序的總體設(shè)計(jì)與實(shí)現(xiàn)和使用說(shuō)明

程序的總體設(shè)計(jì)

1黑白棋,又叫反棋(Reversi)、奧賽羅棋(Othello),蘋(píng)果棋,翻轉(zhuǎn)棋。黑白棋的棋子和圍棋類(lèi)似。但它的下法與圍棋的很不相同。它的規(guī)則是當(dāng)所下的子與自己現(xiàn)有的子之間夾有對(duì)方的棋子時(shí),可以將所夾的對(duì)方棋子全部反轉(zhuǎn)成自己的棋子。最后棋盤(pán)上面看自己棋子最多的一方獲勝。所以,在設(shè)計(jì)程序時(shí)要考慮的關(guān)鍵問(wèn)題就是如何實(shí)現(xiàn)計(jì)算機(jī)自動(dòng)選擇落子的最佳位置。概要設(shè)計(jì)由于黑白棋程序需要跟人進(jìn)行對(duì)戰(zhàn),自動(dòng)的選擇最佳的位置。因此,這就要求設(shè)計(jì)的黑白棋程序具有人工智能。實(shí)現(xiàn)人工智能有很多種方法,經(jīng)過(guò)分析后決定采用編寫(xiě)估值函數(shù)的方法讓計(jì)算機(jī)具有人工智能。具體就是當(dāng)輪到計(jì)算機(jī)走棋時(shí),計(jì)算機(jī)對(duì)當(dāng)前棋盤(pán)局面進(jìn)行估值,找出最優(yōu)位置然后落子。程序還應(yīng)該提供人與人對(duì)戰(zhàn)的功能。這部分不設(shè)計(jì)到什么算法問(wèn)題,完全可以通過(guò)對(duì)流程的控制來(lái)實(shí)現(xiàn)。通過(guò)流程控制可以實(shí)現(xiàn)人與人對(duì)戰(zhàn)和人與計(jì)算機(jī)對(duì)戰(zhàn)兩種模式之間的切換。程序還應(yīng)該具有保存用戶(hù)下棋數(shù)據(jù)的功能。這部分功能可以通過(guò)建立并操作數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)。另外為了增加程序的可玩性,所以增加了多媒體部分。準(zhǔn)備調(diào)用WINDOWS的某些相關(guān)API來(lái)實(shí)現(xiàn)。3 棋盤(pán)的表示

黑白棋的棋盤(pán)為一個(gè)8*8的正方格,如左圖所示。最初黑棋和白棋各兩顆子占據(jù)一個(gè)方格的對(duì)角線。

在計(jì)算機(jī)中我用一個(gè)8*8的二維數(shù)組來(lái)表示當(dāng)前棋局的形勢(shì),通過(guò)搜索比較,讓電腦知道當(dāng)前的棋局狀態(tài),尋找合適的落子點(diǎn)。4 運(yùn)行環(huán)境(軟、硬件環(huán)境)

(1)硬件環(huán)境要求:配置相當(dāng)于486或以上處理器;建議128MB內(nèi)存(至少64MB);建議1GB硬盤(pán)空間(至少500MB);真彩色800×600或者更高分辨率的顯示器;

(2)軟件環(huán)境要求:MS Windows 98/2000/XP等中文操作系統(tǒng)。游戲的使用說(shuō)明 1.規(guī)則(1)用上下左右鍵來(lái)分別控制棋子的移動(dòng),移動(dòng)到所定的位置后,按Enter表示下棋。棋子只能出現(xiàn)8*8的棋盤(pán)內(nèi),除了那些已經(jīng)有了棋子的地方不能走以外,不能吃子的地方也不能下子。每個(gè)棋手下棋時(shí),擺子的位置必須是以自己的棋子能包圍住對(duì)方一個(gè) 或多個(gè)棋子,被包圍住的對(duì)方棋子將成為自己的棋子。包圍的方向可以是上下左右以及斜線8個(gè)方向,只要能連成一線即可。(2)當(dāng)輪到某一個(gè)棋手下子,但是他沒(méi)有可以包圍對(duì)方棋子的位置時(shí),他必須停步,讓對(duì)方走棋,直到他可以走為止。

(3)下子要求下在與對(duì)方棋子相鄰的空位上,要求所下的棋子和原有的已方棋子夾住對(duì)方的至少一個(gè)棋子(橫豎斜夾均可),然后把被夾住的子變成己方的顏色。下棋過(guò)程中,任何棋子既不會(huì)從棋盤(pán)上拿走,也不會(huì)從一個(gè)格子移到另一個(gè)格子,吃子時(shí),不會(huì)發(fā)生連鎖反應(yīng),吃進(jìn)的棋子不能再夾吃其他的子。當(dāng)雙方都無(wú)棋可下,或者方格全部占滿(mǎn)后,棋局結(jié)束,棋子少者輸,子多的一方為勝方。

(4)ESC 退出總游戲。

第五章 總結(jié)

課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.隨著科學(xué)技術(shù)發(fā)展的日新日異,當(dāng)今計(jì)算機(jī)應(yīng)用在是生活中可以說(shuō)得是無(wú)處不在。因此作為二十一世紀(jì)的大學(xué)來(lái)說(shuō)掌握計(jì)算機(jī)開(kāi)發(fā)技術(shù)十分重要的。

我的題目是文章處理系統(tǒng)的設(shè)計(jì),對(duì)于我們這些新手來(lái)說(shuō),這是很大的考驗(yàn),我一千次一萬(wàn)次的問(wèn)自己,怎么才能找到課堂所學(xué)與實(shí)際應(yīng)用的最佳結(jié)合點(diǎn)?怎么才能讓自己的程序在篇幅上簡(jiǎn)單,在使用價(jià)值上豐富?怎樣讓自己的業(yè)余更靠近專(zhuān)業(yè)?怎樣讓自己的計(jì)劃更具有序性,而不會(huì)忙無(wú)一用?機(jī)會(huì)是老師,學(xué)校,以及無(wú)數(shù)代教育工作者給的,而能力是自己的,耐性是需要的。經(jīng)過(guò)自己的琢磨,聽(tīng)取了師姐,師兄們的建議,還查閱了很多書(shū)籍,才做到了心中有數(shù),才了解了C語(yǔ)言課程設(shè)計(jì)的真正用意——培養(yǎng)自學(xué)能力,養(yǎng)成程序編輯的好習(xí)慣。我從來(lái)不相信車(chē)到山前必有路的說(shuō)法,認(rèn)為那只是懶惰者自尋懶惰的借口,我要積極,要把握,要努力。

回顧起此次課程設(shè)計(jì),至今我仍感慨頗多,的確,從從拿到題目到完成整個(gè)編程,從理論到實(shí)踐,在整整半個(gè)學(xué)期的日子里,可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,這畢竟第一次做的,難免會(huì)遇到過(guò)各種各樣的問(wèn)題,同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固,比如說(shuō)結(jié)構(gòu)體??通過(guò)這次課程設(shè)計(jì)之后,一定把以前所學(xué)過(guò)的知識(shí)重新溫故。

這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多編程問(wèn)題,最后在郭老師的辛勤指導(dǎo)下,終于游逆而解。同時(shí),在郭老師的身上我學(xué)得到很多實(shí)用的知識(shí),在次我表示感謝!同時(shí),對(duì)給過(guò)我?guī)椭乃型瑢W(xué)和各位指導(dǎo)老師再次表示忠心的感謝

在課程設(shè)計(jì)過(guò)程中,我學(xué)到了很多人生的哲理,懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過(guò)程中怎么樣去克服心理上的不良情緒,黑夜過(guò)去了,我們收獲的是黎明。在本次實(shí)踐中,給我印象最為深刻的是在文件刪除程序的編譯過(guò)程中,先有我的各個(gè)子程序都已經(jīng)編輯成功,那么這最后的程序就將是我成功的關(guān)鍵。老天不會(huì)讓我太過(guò)順利,他在這最后的時(shí)刻設(shè)置的障礙,是要考驗(yàn)我的能力,他要置我于死地?在這個(gè)問(wèn)題的解決上,我打了退堂鼓,我不能忍受長(zhǎng)時(shí)間的無(wú)功而反,時(shí)間正在消磨我的意志。沒(méi)有了柳暗花明的一天,那么我怎么能說(shuō)經(jīng)受住了考驗(yàn)?謝謝老師的那句話,她說(shuō):人力有所不能及,然而,人的精神是不會(huì)敗倒的。我鼓起勇氣,到處問(wèn),到處查資料,黃天不負(fù)有心人,在一篇文章上,終于看到了我所特別要求的函數(shù),我實(shí)現(xiàn)了組合是關(guān)鍵的理論。不得不說(shuō)這是精神的勝利,是永不言敗的精神讓我的程序重見(jiàn)天日。謝謝給我指點(diǎn)迷津的老師。

6月11日,我們的課程設(shè)計(jì)結(jié)束了,但是它留給我的印象是不可磨滅的。無(wú)論我以后會(huì)不會(huì)涉及到C語(yǔ)言程序編譯的研究,我想,我至少掌握了一種系統(tǒng)的研究方法,我們學(xué)習(xí)的目的就在于運(yùn)用,我們運(yùn)用這種研究方法的時(shí)候會(huì)很多,我最后要感謝課程設(shè)計(jì),它的確教會(huì)我很多。

附錄 源代碼

#include “graphics.h” #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define ENTER 0x1c0d int a[8][8]={0},key,score1,score2;char playone[3],playtwo[3];void playtoplay(void);void DrawQp(void);void SetPlayColor(int x);void MoveColor(int x,int y);int QpChange(int x,int y,int z);void DoScore(void);void PrintScore(int n);void playWin(void);void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,“c: c”);DrawQp();playtoplay();getch();closegraph();} void DrawQp(){ int i,j;score1=score2=0;setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);line(i,100,i,420);} setcolor(0);setfillstyle(SOLID_FILL,15);fillellipse(500,200,15,15);setfillstyle(SOLID_FILL,8);fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;a[3][4]=a[4][3]=2;setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;DoScore();} void playtoplay(){ int x,y,t=1,i,j,cc=0;while(1){ x=120,y=80;while(1){ PrintScore(1);PrintScore(2);SetPlayColor(t);fillellipse(x,y,15,15);key=bioskey(0);if(key==ESC)break;else if(key==ENTER){ if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2){ if(t%2==1)a[(x-120)/40][(y-120)/40]=1;else a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t)){ a[(x-120)/40][(y-120)/40]=0;cc++;if(cc>=64-score1-score2){ MoveColor(x,y);fillellipse(x,y,15,15);break;} else continue;} DoScore();break;} else continue;} else if(key==LEFT&&x>120){ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80){ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120){ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400){ MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)break;if((score1+score2)==64||score1==0||score2==0){ playWin();break;} t=t%2+1;cc=0;} } void SetPlayColor(int t){ if(t%2==1)setfillstyle(SOLID_FILL,15);else setfillstyle(SOLID_FILL,8);} void MoveColor(int x,int y){ if(y<100)setfillstyle(SOLID_FILL,BLUE);else switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;case 2: setfillstyle(SOLID_FILL,8);break;default: setfillstyle(SOLID_FILL,BLUE);} } int QpChange(int x,int y,int t){ int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;j=(y-120)/40;SetPlayColor(t);if(j<6){ for(k=j+1;k<8;k++)if(a[i][k]==a[i][j]||a[i][k]==0)break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk1){ for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){ for(kk=j-1;kk>k&&k>=0;kk--){ a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);} if(kk!=j-1)yes=1;} } if(i<6){ for(k=i+1;k<8;k++)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k<8){ for(kk=i+1;kk1){ for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){ for(kk=i-1;kk>k&&k>=0;kk--){ a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);} if(kk!=i-1)yes=1;} } if(i>1&&j<6){ for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){ for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j>1){ for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){ for(ii=i+1,jj=j-1;ii1&&j>1){ for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){ for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j<6){ for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){ for(ii=i+1,jj=j+1;iiscore1)outtextxy(100,50,“black win!”);else if(score2

第三篇:2012數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

數(shù) 據(jù) 結(jié) 構(gòu)

課程設(shè)計(jì)報(bào)告

題 目: 一元多項(xiàng)式計(jì)算 專(zhuān) 業(yè): 信息管理與信息系統(tǒng) 班 級(jí): 2012級(jí)普本班 學(xué) 號(hào): 201201011367 姓 名: 左帥帥 指導(dǎo)老師: 郝慎學(xué) 時(shí) 間:

一、課程設(shè)計(jì)題目分析

本課程設(shè)計(jì)要求利用C語(yǔ)言或C++編寫(xiě),本程序?qū)崿F(xiàn)了一元多項(xiàng)式的加法、減法、乘法、除法運(yùn)算等功能。

二、設(shè)計(jì)思路

本程序采用C語(yǔ)言來(lái)完成課程設(shè)計(jì)。

1、首先,利用順序存儲(chǔ)結(jié)構(gòu)來(lái)構(gòu)造兩個(gè)存儲(chǔ)多項(xiàng)式A(x)和 B(x)的結(jié)構(gòu)。

2、然后把輸入,加,減,乘,除運(yùn)算分成五個(gè)主要的模塊:實(shí)現(xiàn)多項(xiàng)式輸入模塊、實(shí)現(xiàn)加法的模塊、實(shí)現(xiàn)減法的模塊、實(shí)現(xiàn)乘法的模塊、實(shí)現(xiàn)除法的模塊。

3、然后各個(gè)模塊里面還要分成若干種情況來(lái)考慮并通過(guò)函數(shù)的嵌套調(diào)用來(lái)實(shí)現(xiàn)其功能,盡量減少程序運(yùn)行時(shí)錯(cuò)誤的出現(xiàn)。

4、最后編寫(xiě)main()主函數(shù)以實(shí)現(xiàn)對(duì)多項(xiàng)式輸入輸出以及加、減、乘、除,調(diào)試程序并將不足的地方加以修改。

三、設(shè)計(jì)算法分析

1、相關(guān)函數(shù)說(shuō)明:

(1)定義數(shù)據(jù)結(jié)構(gòu)類(lèi)型為線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)類(lèi)型變量

typedef struct Polynomial{}

(2)其他功能函數(shù)

插入函數(shù)void Insert(Polyn p,Polyn h)

比較函數(shù)int compare(Polyn a,Polyn b)

建立一元多項(xiàng)式函數(shù)Polyn Create(Polyn head,int m)

求解并建立多項(xiàng)式a+b,Polyn Add(Polyn pa,Polyn pb)

求解并建立多項(xiàng)式a-b,Polyn Subtract(Polyn pa,Polyn pb)2

求解并建立多項(xiàng)式a*b,Polyn Multiply(Polyn pa,Polyn pb)

求解并建立多項(xiàng)式a/b,void Device(Polyn pa,Polyn pb)

輸出函數(shù)輸出多項(xiàng)式,void Print(Polyn P)

銷(xiāo)毀多項(xiàng)式函數(shù)釋放內(nèi)存,void Destroy(Polyn p)

主函數(shù),void main()

2、主程序的流程基函數(shù)調(diào)用說(shuō)明(1)typedef struct Polynomial {

float coef;

int expn;

struct Polynomial *next;} *Polyn,Polynomial;

在這個(gè)結(jié)構(gòu)體變量中coef表示每一項(xiàng)前的系數(shù),expn表示每一項(xiàng)的指數(shù),polyn為結(jié)點(diǎn)指針類(lèi)型,屬于抽象數(shù)據(jù)類(lèi)型通常由用戶(hù)自行定義,Polynomial表示的是結(jié)構(gòu)體中的數(shù)據(jù)對(duì)象名。

(2)當(dāng)用戶(hù)輸入兩個(gè)一元多項(xiàng)式的系數(shù)和指數(shù)后,建立鏈表,存儲(chǔ)這兩個(gè)多項(xiàng)式,主要說(shuō)明如下:

Polyn CreatePolyn(Polyn head,int m)建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式

p=head=(Polyn)malloc(sizeof(struct Polynomial));為輸入的多項(xiàng)式申請(qǐng)足夠的存儲(chǔ)空間

p=(Polyn)malloc(sizeof(struct Polynomial));建立新結(jié)點(diǎn)以接收數(shù)據(jù)

Insert(p,head);調(diào)用Insert函數(shù)插入結(jié)點(diǎn)

這就建立一元多項(xiàng)式的關(guān)鍵步驟

(3)由于多項(xiàng)式的系數(shù)和指數(shù)都是隨即輸入的,所以根據(jù)要求需要對(duì)多項(xiàng)式按指數(shù)進(jìn)行降冪排序。在這個(gè)程序模塊中,使用鏈表,根據(jù)對(duì)指數(shù)大小的比較,對(duì)各種情況進(jìn)行處理,此處由于反復(fù)使用指針對(duì)各個(gè)結(jié)點(diǎn)進(jìn)行定位,找到合適的位置再利用void Insert(Polyn p,Polyn h)進(jìn)行插入操作。(4)加、減、乘、除、的算法實(shí)現(xiàn):

在該程序中,最關(guān)鍵的一步是實(shí)現(xiàn)四則運(yùn)算和輸出,由于加減算法原則是一樣,減法可通過(guò)系數(shù)為負(fù)的加法實(shí)現(xiàn);對(duì)于乘除算法的大致流程都是:首先建立多項(xiàng)式a*b,a/b,然后使用鏈表存儲(chǔ)所求出的乘積,商和余數(shù)。這就實(shí)現(xiàn)了多項(xiàng)式計(jì)算模塊的主要功能。

(5)另一個(gè)子函數(shù)是輸出函數(shù) PrintPolyn();

輸出最終的結(jié)果,算法是將最后計(jì)算合并的鏈表逐個(gè)結(jié)點(diǎn)依次輸出,便得到整鏈表,也就是最后的計(jì)算式計(jì)算結(jié)果。由于考慮各個(gè)結(jié)點(diǎn)的指數(shù)情況不同,分別進(jìn)行了判斷處理。

四、程序新點(diǎn)

通過(guò)多次寫(xiě)程序,發(fā)現(xiàn)在程序在控制臺(tái)運(yùn)行時(shí)總是黑色的,本次寫(xiě)程序就想著改變一下,于是經(jīng)過(guò)查資料利用system(“Color E0”);可以函數(shù)解決,這里“E0,”E是控制臺(tái)背景顏色,0是控制臺(tái)輸出字體顏色。

五、設(shè)計(jì)中遇到的問(wèn)題及解決辦法

首先是,由于此次課程設(shè)計(jì)里使用指針使用比較多,自己在指針多的時(shí)候易腦子混亂出錯(cuò),對(duì)于此問(wèn)題我是采取比較笨的辦法在稿紙上寫(xiě)明白后開(kāi)始進(jìn)行 4

代碼編寫(xiě)。

其次是,在寫(xiě)除法模塊時(shí)比較復(fù)雜,自己通過(guò)查資料最后成功寫(xiě)出除法模塊功能。

最后是,前期分析不足開(kāi)始急于寫(xiě)代碼,中途出現(xiàn)各種問(wèn)題,算是給自己以后設(shè)計(jì)時(shí)的一個(gè)經(jīng)驗(yàn)吧。

六、測(cè)試(程序截圖)

1.數(shù)據(jù)輸入及主菜單

2.加法和減法模塊

3.乘法和除法模塊

七、總結(jié)

通過(guò)本次應(yīng)用C語(yǔ)言設(shè)計(jì)一元多項(xiàng)式基本計(jì)算程序,使我更加鞏固了C語(yǔ)言程序設(shè)計(jì)的知識(shí),以前對(duì)指針這一點(diǎn)使用是比較模糊,現(xiàn)在通過(guò)此次課程設(shè)計(jì)對(duì)指針理解的比較深刻了。而且對(duì)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)算法和函數(shù)的調(diào)用方面知識(shí)的加深。本次的課程設(shè)計(jì),一方面提高了自己獨(dú)立思考處理問(wèn)題的能力;另一方面使自己再設(shè)計(jì)開(kāi)發(fā)程序方面有了一定的小經(jīng)驗(yàn)和想法,對(duì)自己以后學(xué)習(xí)其他語(yǔ)言程序設(shè)計(jì)奠定了一定的基礎(chǔ)。

八、指導(dǎo)老師評(píng)語(yǔ)及成績(jī)

附錄:(課程設(shè)計(jì)代碼)

#include #include #include typedef struct Polynomial {

float coef;6

int expn;

struct Polynomial *next;} *Polyn,Polynomial;

//Polyn為結(jié)點(diǎn)指針類(lèi)型 void Insert(Polyn p,Polyn h){

if(p->coef==0)free(p);

//系數(shù)為0的話釋放結(jié)點(diǎn)

else

{

Polyn q1,q2;

q1=h;q2=h->next;

while(q2&&p->expnexpn)//查找插入位置

{

q1=q2;q2=q2->next;}

if(q2&&p->expn==q2->expn)//將指數(shù)相同相合并 {

q2->coef+=p->coef;

free(p);

if(!q2->coef)//系數(shù)為0的話釋放結(jié)點(diǎn)

{ q1->next=q2->next;free(q2);}

}

else { p->next=q2;q1->next=p;

}//指數(shù)為新時(shí)將結(jié)點(diǎn)插入

} 7

} //建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式 Polyn Create(Polyn head,int m){

int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial));

head->next=NULL;

for(i=0;i

{

p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結(jié)點(diǎn)以接收數(shù)據(jù)

printf(“請(qǐng)輸入第%d項(xiàng)的系數(shù)與指數(shù):”,i+1);

scanf(“%f %d”,&p->coef,&p->expn);

Insert(p,head);

//調(diào)用Insert函數(shù)插入結(jié)點(diǎn)

}

return head;} //銷(xiāo)毀多項(xiàng)式p void Destroy(Polyn p){

Polyn q1,q2;

q1=p->next;8

q2=q1->next;

while(q1->next)

{

free(q1);

q1=q2;//指針后移

q2=q2->next;

} } //輸出多項(xiàng)式p int Print(Polyn P){

Polyn q=P->next;

int flag=1;//項(xiàng)數(shù)計(jì)數(shù)器

if(!q)//若多項(xiàng)式為空,輸出0

{

putchar('0');

printf(“n”);

return;

}

while(q)

{

if(q->coef>0&&flag!=1)putchar('+');//系數(shù)大于0且不是第一項(xiàng) 9

if(q->coef!=1&&q->coef!=-1)//系數(shù)非1或-1的普通情況

{

printf(“%g”,q->coef);

if(q->expn==1)putchar('X');

else if(q->expn)printf(“X^%d”,q->expn);

}

else

{

if(q->coef==1){

if(!q->expn)putchar('1');

else if(q->expn==1)putchar('X');

else printf(“X^%d”,q->expn);}

if(q->coef==-1){

if(!q->expn)printf(“-1”);

else if(q->expn==1)printf(“-X”);

else printf(“-X^%d”,q->expn);}

}

q=q->next;

flag++;

}

printf(“n”);} int compare(Polyn a,Polyn b){

if(a&&b)

{

if(!b||a->expn>b->expn)return 1;

else if(!a||a->expnexpn)return-1;

else return 0;

}

else if(!a&&b)return-1;//a多項(xiàng)式已空,但b多項(xiàng)式非空

else return 1;//b多項(xiàng)式已空,但a多項(xiàng)式非空 } //求解并建立多項(xiàng)式a+b,返回其頭指針 Polyn Add(Polyn pa,Polyn pb){

Polyn qa=pa->next;

Polyn qb=pb->next;

Polyn headc,hc,qc;

hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點(diǎn) 11

hc->next=NULL;

headc=hc;

while(qa||qb){

qc=(Polyn)malloc(sizeof(struct Polynomial));

switch(compare(qa,qb))

{

case 1:

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break;

case 0:

qc->coef=qa->coef+qb->coef;

qc->expn=qa->expn;

qa=qa->next;

qb=qb->next;

break;

case-1:

qc->coef=qb->coef;

qc->expn=qb->expn;

qb=qb->next;

break;12

}

if(qc->coef!=0)

{

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else free(qc);//當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn)

}

return headc;} //求解并建立多項(xiàng)式a-b,返回其頭指針 Polyn Subtract(Polyn pa,Polyn pb){

Polyn h=pb;

Polyn p=pb->next;

Polyn pd;

while(p)//將pb的系數(shù)取反

{ p->coef*=-1;p=p->next;}

pd=Add(pa,h);

for(p=h->next;p;p=p->next)

//恢復(fù)pb的系數(shù)

p->coef*=-1;13

return pd;} //求解并建立多項(xiàng)式a*b,返回其頭指針 Polyn Multiply(Polyn pa,Polyn pb){

Polyn hf,pf;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點(diǎn)

hf->next=NULL;

for(;qa;qa=qa->next)

{

for(qb=pb->next;qb;qb=qb->next)

{

pf=(Polyn)malloc(sizeof(struct Polynomial));

pf->coef=qa->coef*qb->coef;

pf->expn=qa->expn+qb->expn;

Insert(pf,hf);//調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng)

}

}

return hf;}

//求解并建立多項(xiàng)式a/b,返回其頭指針 void Device(Polyn pa,Polyn pb){

Polyn hf,pf,temp1,temp2;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點(diǎn),存儲(chǔ)商

hf->next=NULL;

pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點(diǎn),存儲(chǔ)余數(shù)

pf->next=NULL;

temp1=(Polyn)malloc(sizeof(struct Polynomial));

temp1->next=NULL;

temp2=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next=NULL;

temp1=Add(temp1,pa);

while(qa!=NULL&&qa->expn>=qb->expn)

{

temp2->next=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next->coef=(qa->coef)/(qb->coef);

temp2->next->expn=(qa->expn)-(qb->expn);

Insert(temp2->next,hf);

pa=Subtract(pa,Multiply(pb,temp2));15

qa=pa->next;

temp2->next=NULL;

}

pf=Subtract(temp1,Multiply(hf,pb));

pb=temp1;

printf(“商是:”);

Print(hf);

printf(“余數(shù)是:”);

Print(pf);} void main(){ int choose=1;int m,n,flag=0;system(“Color E0”);Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL printf(“請(qǐng)輸入A(x)的項(xiàng)數(shù):”);scanf(“%d”,&m);printf(“n”);pa=Create(pa,m);//建立多項(xiàng)式A printf(“n”);printf(“請(qǐng)輸入B(x)的項(xiàng)數(shù):”);16

scanf(“%d”,&n);printf(“n”);pb=Create(pb,n);//建立多項(xiàng)式B printf(“n”);printf(“**********************************************n”);printf(“*

多項(xiàng)式操作菜單

printf(”**********************************************n“);printf(”tt 1.輸出操作n“);printf(”tt 2.加法操作n“);printf(”tt 3.減法操作n“);printf(”tt 4.乘法操作n“);printf(”tt 5.除法操作n“);printf(”tt 6.退出操作n“);printf(”**********************************************n“);while(choose){

printf(”執(zhí)行操作:“);

scanf(”%d“,&flag);

switch(flag)

{

case 1:

printf(”多項(xiàng)式A(x):“);Print(pa);*n”);

printf(“多項(xiàng)式B(x):”);Print(pb);

break;

case 2:

pc=Add(pa,pb);

printf(“多項(xiàng)式A(x)+B(x):”);Print(pc);

Destroy(pc);break;

case 3:

pd=Subtract(pa,pb);

printf(“多項(xiàng)式A(x)-B(x):”);Print(pd);

Destroy(pd);break;

case 4:

pf=Multiply(pa,pb);

printf(“多項(xiàng)式A(x)*B(x):”);

Print(pf);

Destroy(pf);

break;

case 5:

Device(pa,pb);18

break;

case 6:

exit(0);

break;

} }

Destroy(pa);

Destroy(pb);}

第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)

1.赫夫曼編碼器

設(shè)計(jì)一個(gè)利用赫夫曼算法的編碼和譯碼系統(tǒng),重復(fù)地顯示并處理以下項(xiàng)目,直到選擇退出為止。要求:

1)將權(quán)值數(shù)據(jù)存放在數(shù)據(jù)文件(文件名為data.txt,位于執(zhí)行程序的當(dāng)前目錄中)

2)初始化:鍵盤(pán)輸入字符集大小26、26個(gè)字符和26個(gè)權(quán)值(統(tǒng)計(jì)一篇英文文章中26個(gè)字母),建立哈夫曼樹(shù);

3)編碼:利用建好的哈夫曼樹(shù)生成哈夫曼編碼;

4)輸出編碼(首先實(shí)現(xiàn)屏幕輸出,然后實(shí)現(xiàn)文件輸出); 5)界面優(yōu)化設(shè)計(jì)。

代碼如下:

#include #include #include #include #define N 200

typedef struct HTNode

//結(jié)構(gòu)體 { int Weight;

char ch;int Parent,Lchild,Rchild;}HTNode;typedef char * * HCode;

void Save(int n,HTNode *HT)

//把權(quán)值保存到文件 {

FILE * fp;

int i;

if((fp=fopen(“data.txt”,“wb”))==NULL)

{

printf(“cannot open filen”);

return;

}

for(i=0;i

if(fwrite(&HT[i].Weight,sizeof(struct HTNode),1,fp)!=1)

printf(“file write errorn”);

fclose(fp);

system(“cls”);

printf(“保存成功!”);

}

void Create_H(int n,int m,HTNode *HT)

//建立赫夫曼樹(shù),進(jìn)行編碼 {

int w,k,j;char c;for(k=1;k<=m;k++){

if(k<=n)

{

printf(“n請(qǐng)輸入權(quán)值和字符(用空格隔開(kāi)): ”);

scanf(“%d”,&w);

scanf(“ %c”,&c);HT[k].ch=c;

HT[k].Weight=w;

}

else HT[k].Weight=0;

HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0;}

int p1,p2,w1,w2;

for(k=n+1;k<=m;k++){

p1=0;p2=0;

w1=32767;w2=32767;

for(j=1;j<=k-1;j++)

{

if(HT[j].Parent==0)

{

if(HT[j].Weight

{

w2=w1;p2=p1;

w1=HT[j].Weight;

p1=j;

}

else if(HT[j].Weight

{

w2=HT[j].Weight;

p2=j;

}

}

} HT[k].Lchild=p1;HT[k].Rchild=p2;HT[k].Weight=HT[p1].Weight+HT[p2].Weight;

HT[p1].Parent=k;HT[p2].Parent=k;

} printf(“輸入成功!”);}

void Coding_H(int n,HTNode *HT)

//對(duì)結(jié)點(diǎn)進(jìn)行譯碼 { int k,sp,fp,p;char *cd;HCode HC;

HC=(HCode)malloc((n+1)*sizeof(char *));

cd=(char *)malloc(n*sizeof(char));cd[n-1]='

主站蜘蛛池模板: 国产精品无码专区第一页| 久久久老熟女一区二区三区| 久久婷婷五月综合色欧美| 香蕉人妻av久久久久天天| 小12箩利洗澡无码视频网站| 久久大香线蕉国产精品免费| 国产精品久久久久久久久久久不卡| 夜夜揉揉日日人人| 人妻中文无码就熟专区| 久久久久夜夜夜精品国产| 无遮挡18禁啪啪羞羞漫画| 国产精品成人免费一区久久羞羞| 亚洲精品国产精品乱码不卡| 伊人久久大香线蕉av一区二区| 国产美女爽到喷出水来视频| 国产一卡2卡3卡四卡精品国色无边| av大片在线无码永久免费| 青青狠狠噜天天噜日日噜| 337p日本大胆欧美人视频| 亚洲av无码一区东京热| 日本一区二区三区免费播放视频了| 国产成人18黄网站| 伊人久久大香线蕉综合中文字幕| 高清无码一区二区在线观看吞精| 亚洲性人人天天夜夜摸18禁止| 色老99久久精品偷偷鲁| 亚洲国产成人欧美在线观看| 真实的国产乱xxxx在线| 国产精品爽爽v在线观看无码| 久在线观看福利视频| 4438xx亚洲最大五色丁香| 色播久久人人爽人人爽人人片av| 日韩欧美中文字幕在线三区| 日韩精品无码一区二区视频| 国产丝袜视频一区二区三区| 中文无码日韩欧| 久久99久久99精品免视看看| 2020国产精品久久精品| 精品乱人伦一区二区三区| 日本a片大尺度高潮无码| 波多野结无码高清中文|