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

五子棋網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā) 課程設(shè)計(jì)

時(shí)間:2019-05-15 06:16:13下載本文作者:會(huì)員上傳
簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《五子棋網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā) 課程設(shè)計(jì)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《五子棋網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā) 課程設(shè)計(jì)》。

第一篇:五子棋網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā) 課程設(shè)計(jì)

網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)報(bào)告 概述

游戲說(shuō)明

五子棋在我國(guó)的歷史可謂是源遠(yuǎn)流長(zhǎng),喜愛(ài)它的玩家也是大有人在,是很多人的娛樂(lè)首選,也是一種競(jìng)技項(xiàng)目。但很多的五子棋軟件一般都是單機(jī)版的,游戲無(wú)法在兩個(gè)玩家之間進(jìn)行。基于上述原因,五子棋作為一個(gè)古老而又有廣泛群眾基礎(chǔ)的游戲,他的完善性無(wú)疑是家玩家有很大的影響在互聯(lián)網(wǎng)迅速發(fā)展的今天,五子棋的流行已經(jīng)不僅僅只是在現(xiàn)實(shí)生活中的面對(duì)面的娛樂(lè)競(jìng)技,在網(wǎng)上也已經(jīng)是廣大玩家的首選娛樂(lè)游戲。為適應(yīng)當(dāng)今社會(huì)五子棋軟件化的需求,通過(guò)對(duì)一般的五子棋軟件進(jìn)行設(shè)計(jì),通過(guò)本設(shè)計(jì)希望能在五子棋的軟件發(fā)展上起點(diǎn)微不足道的推動(dòng)作用。實(shí)現(xiàn)當(dāng)今社會(huì)五子棋軟件化的需求。軟件設(shè)計(jì)采用visual studio2008版作為開(kāi)發(fā)平臺(tái),運(yùn)用軟件工程的分析和編寫方法,收集主要相關(guān)文獻(xiàn)資料,對(duì)系統(tǒng)作詳細(xì)的分析和設(shè)計(jì),實(shí)現(xiàn)五子棋的基本功能需求,達(dá)到一般五子棋的游戲功能和規(guī)則設(shè)置。在設(shè)計(jì)上,主要解決的問(wèn)題有五子棋的各個(gè)方向判斷勝負(fù)算法的分析,以及五子棋中“聊天,重新開(kāi)始”等基本功能的實(shí)現(xiàn)。

需求分析

一款游戲項(xiàng)目的確立是建立在各種各樣的需求上面的,這種需求往往來(lái)自于玩家的實(shí)際需求或者是出于公司自身發(fā)展和實(shí)力的情況,其中玩家的實(shí)際需求也就是說(shuō)市場(chǎng)需求最為重要.面對(duì)游戲擁有不同知識(shí)和理解層面的玩家,項(xiàng)目的負(fù)責(zé)人(或者游戲制作人)對(duì)玩家需求的理解程度,在很大程度上決定了此類游戲開(kāi)發(fā)項(xiàng)目的成敗.因此如何更好地的了解,分析,明確玩家需求,并且能夠準(zhǔn)確,清晰以文檔的形式表達(dá)給參與項(xiàng)目開(kāi)發(fā)的每個(gè)成員,保證開(kāi)發(fā)過(guò)程按照滿足玩家需求為目的正確項(xiàng)目開(kāi)發(fā)方向進(jìn)行,是每游戲開(kāi)發(fā)項(xiàng)目管理者需要面對(duì)的問(wèn)題...而作為五子棋的設(shè)計(jì)需要考慮到的最基本的需求莫過(guò)于人機(jī)對(duì)戰(zhàn)與人人對(duì)戰(zhàn)功能的實(shí)現(xiàn),當(dāng)然還有下棋過(guò)程中的下棋悔棋功能以及判斷游戲的勝負(fù)等方面的要求。當(dāng)然最好是要考慮到界面的友好性,作為一個(gè)娛樂(lè)軟件,還應(yīng)該考

慮到玩家在游戲時(shí)的舒適 實(shí)現(xiàn)

2.1 設(shè)計(jì)思路

2.2 具體實(shí)現(xiàn) 2.2.1 界面設(shè)計(jì)

界面主要分四大部分:棋盤、ip地址、棋子選擇和聊天窗口,程序運(yùn)行開(kāi)始,先要輸入要連接的主機(jī)ip地址,然后選定棋子顏色,就可以下棋了。輸入文本的控件我選擇了comboBox空間,在其下拉表中預(yù)先輸入一些常用的語(yǔ)句,如:你好,嗨等,這樣方便聊天。聊天記錄窗口我用了listBox,當(dāng)聊天內(nèi)容比較多時(shí),會(huì)自動(dòng)添加滾動(dòng)條,便于用戶閱讀聊天信息

2.2.2按鈕功能實(shí)現(xiàn)

(1)重新開(kāi)始按鈕 public void Restart()

{

radBlack.Enabled = true;

radWhite.Enabled = true;

for(int i=0;i

for(int j = 0;j < Level;j++)

{ pic[i, j].Image = Image.FromFile(“Board.jpg”);

flag[i, j] = false;

doubleFlag[i, j] = false;

}

this.AllowClick = true;

} private void button2_Click(object sender, EventArgs e)

{this.Restart();}(2)發(fā)送按鈕

private void btnSend_Click(object sender, EventArgs e)

{ String ForeStr = “rn” + txtSelfIP + “【” + DateTime.Now.ToShortDateString()+ “ ” + DateTime.Now.ToShortTimeString()+ “】:rn”;

this.Sender.send(txtIP.Text.Trim(),txtSend.Text.Trim(), 12001);

txtShow.Text += ForeStr;

int BeforeIndex = txtShow.Text.Length;

txtShow.Text += txtSend.Text;

txtShow.Select(BeforeIndex, txtShow.Text.Length);

txtShow.SelectionBackColor = Color.White;

txtShow.SelectionColor = SelfFontColor;

//滾動(dòng)

txtShow.Select(txtShow.Text.Length, 0);

txtShow.ScrollToCaret();

txtSend.Text = “";

} 2.2.3棋子位置判斷

獲得所下的棋子位置的下標(biāo):

RowIndex =(p.Location.Y30)/(p.Width);判斷是否有棋子添加到棋盤上,是通過(guò)Button1是否產(chǎn)生單擊事件來(lái)判定的,在Button按鈕單擊事件中,編入了輸贏的判斷代碼,結(jié)果用messagebox的形式顯示出來(lái),還有一些對(duì)不合規(guī)則下棋方法的判斷及給出相應(yīng)的提示

private void button1_Click(object sender, EventArgs e)

{

if(this.AllowClick)

{

this.radBlack.Enabled = false;

this.radWhite.Enabled = false;

PictureBox p =(PictureBox)sender;

p.Image = Image.FromFile(PictureFileName);

//獲得所下的棋子位置的下標(biāo)

RowIndex =(p.Location.Y30)/(p.Width);

String Message;Message = ”Pos“ + Splitor + RowIndex.ToString()+ Splitor + ColIndex.ToString();//發(fā)送的信息字符串

Flag[RowIndex, ColIndex] = true;

//記錄

if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4())Message += Splitor + this.WinStr;

try {

int Port = Convert.ToInt32(txtPort.Text.Trim());

if(doubleFlag[RowIndex, ColIndex])

{ pic[RowIndex, ColIndex].Image = Image.FromFile(OtherPictureFileName);MessageBox.Show(”不能在有棋子的地方下棋“, ”消息“);AllowClick = true;}

else {

Sender.send(txtIP.Text.Trim(), Message, Port);

Sender.send(txtIP.Text.Trim(), Message, Port);

Sender.send(txtIP.Text.Trim(), Message, Port);

Sender.send(txtIP.Text.Trim(), Message, Port);

Sender.send(txtIP.Text.Trim(), Message, Port);

AllowClick =false;

}

}

catch(Exception ex)

{ MessageBox.Show(ex.Message, ”錯(cuò)誤!“);this.Restart();}

doubleFlag[RowIndex, ColIndex] = true;//雙方記錄

if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4())

{ this.WinCount += 1;MessageBox.Show(”勝利!勝負(fù)情況: 勝“+ WinCount.ToString()+”負(fù)“+ LoseCount.ToString(), ”對(duì)戰(zhàn)結(jié)束“);this.Restart();

} }

else

MessageBox.Show(”不能搶下棋子“); }

public Form1()

{ InitializeComponent();

for(int i = 0;i < Level;i++)

{

for(int j = 0;j < Level;j++)

{ pic[i, j] = new PictureBox();

pic[i, j].Click += new EventHandler(this.button1_Click);

} }

} public void StartListen()

{

while(true)

{ int Port = Convert.ToInt32(txtPort.Text.Trim());

udpclient = new UdpClient(Port);

IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, Port);

try

{

byte[] bytes = udpclient.Receive(ref ipendpoint);

String StrReceive = ”“;StrReceive = Encoding.GetEncoding(”gb2312“).GetString(bytes, 0, bytes.Length);

String[] parts = StrReceive.Split(Splitor);

if(parts[0].Equals(”Pos“))

{ ReceivedRow = Convert.ToInt32(parts[1]);

ReceivedCol = Convert.ToInt32(parts[2]);

pic[ReceivedRow,ReceivedCol].Invoke(new MyDelegate(this.InvokeFun));

doubleFlag[ReceivedRow, ReceivedCol] = true;try {if(parts[parts.Length3;h++)

{ j=h;

for(int i=0;i

{ if(flag[i,j])

{ count++;

if(count >= 5)

return true;

}

else count = 0;

}

count = 0;

}

//下三角

for(int row = 1;row < Level-3;row++)

{

j = row;

for(int col = 0;col < Level && j < Level;j++, col++)

{ if(flag[j, col])

{ count++;

if(count >= 5)return true;

}

else

count = 0;

}

count = 0;

}

return false;

}

public bool Judge4()

//左下——右上

{

int count = 0;

int h;

//上下三角

for(int c=0;c

for(int j = Level-1;j >=0;j--)

{ h = j;

for(int i = c;i < Level && h >=0;i++)

{ if(flag[i,h])

{

count++;

if(count >= 5)return true;

}

else

count = 0;h--;

}

count = 0;

}

return false;

}

2.27、聊天監(jiān)聽(tīng)

public void ListenChat()

{

while(true)

{ try

{ int Port = 12001;

udpclient2 = new UdpClient(Port);

IPEndPoint ipendpoint2 = new IPEndPoint(IPAddress.Any, Port);

byte[] bytes = udpclient2.Receive(ref ipendpoint2);this.ChatMessage = Encoding.GetEncoding(”gb2312“).GetString(bytes, 0, bytes.Length);

udpclient2.Close();

txtShow.Invoke(new ChatDelegate(this.ChatInvoke));

}

catch(Exception){ udpclient2.Close();break;}

this.ChatMessage = ”“;

}

} public void ChatInvoke(){ String ForeStr = ”rn“ + this.txtIP + ”【“ + DateTime.Now.ToShortDateString()+ ” “ + DateTime.Now.ToShortTimeString()+ ”】:rn";

txtShow.Text += ForeStr;//添加到聊天窗口

int Start = this.txtShow.Text.Length;

txtShow.Text += this.ChatMessage;

} 3 總結(jié) //字體變色

txtShow.Select(Start, this.ChatMessage.Length);txtShow.SelectionColor = OtherFontColor;txtShow.SelectionBackColor = Color.White;//滾動(dòng)

txtShow.Select(txtShow.Text.Length, 0);txtShow.ScrollToCaret();

第二篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-五子棋

姓 名: 劉旭

學(xué) 院: 計(jì)算機(jī)與通信學(xué)院

班 級(jí): 通信工程101班

指導(dǎo)老師: 文志誠(chéng)

目錄

一、需求分析..................................................................................................................................3 1.1 開(kāi)發(fā)背景....................................................................................................................................3 2.2 功能簡(jiǎn)介....................................................................................................................................3

二、系統(tǒng)設(shè)計(jì)..................................................................................................................................4 2.1 函數(shù)一覽....................................................................................................................................4 2.2 “封面”的設(shè)計(jì)........................................................................................................................4 2.3 二維數(shù)組與控制臺(tái)....................................................................................................................5 2.4 鍵盤操作....................................................................................................................................6 2.5判定.............................................................................................................................................7 2.6 悔棋的實(shí)現(xiàn)................................................................................................................................8

三、調(diào)試運(yùn)行..................................................................................................................................9 3.1 進(jìn)入界面....................................................................................................................................9 3.2 棋盤的初始狀態(tài)......................................................................................................................10 3.3 激戰(zhàn)中……..............................................................................................................................10 3.4 游戲結(jié)束..................................................................................................................................11

四、解決問(wèn)題的關(guān)鍵....................................................................................................................11

五、課設(shè)總結(jié)................................................................................................................................11

六、附錄........................................................................................................................................12 6.1 畫圖代碼..................................................................................................錯(cuò)誤!未定義書簽。6.2 初始化......................................................................................................錯(cuò)誤!未定義書簽。6.3 Play函數(shù)..................................................................................................錯(cuò)誤!未定義書簽。

一、需求分析

1.1 開(kāi)發(fā)背景

學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)該門課程,對(duì)于枯燥無(wú)味的理論知識(shí),我們是否能夠通過(guò)所學(xué)的知識(shí)在課程設(shè)計(jì)中做出有趣味東西,然后讓我們對(duì)于數(shù)據(jù)結(jié)構(gòu)更加的感興趣呢?于是我和我的室友陳明建開(kāi)始醞釀著寫些什么東西。上個(gè)學(xué)期就已經(jīng)寫了通訊錄那之類的鏈?zhǔn)浇Y(jié)構(gòu),這次我們決心有所改變,我們學(xué)習(xí)了棧、隊(duì)列、樹(shù)、圖,字典樹(shù)有人選了,我們就來(lái)寫一個(gè)基于圖的小程序,五子棋,對(duì),圖的簡(jiǎn)單應(yīng)用,于是我們開(kāi)始著手來(lái)寫這個(gè)小小的程序,祝我們好運(yùn)!

2.2 功能簡(jiǎn)介

既然是五子棋,我們要做的是時(shí)時(shí)刻刻的將整個(gè)圖(以下稱為棋局)的狀態(tài)呈現(xiàn)出來(lái),那么界面就是必不可少的。MFC不會(huì)?沒(méi)關(guān)系,我們就用基于控制臺(tái)的字符輸出來(lái)構(gòu)建這個(gè)棋局吧,當(dāng)然這只是第一步,詳細(xì)如下: 1擁有一個(gè)良好的進(jìn)入界面,以及必要的選項(xiàng); ○2擁有一個(gè)二維的數(shù)組來(lái)記錄和更新實(shí)時(shí)的狀態(tài),并且能夠有一種方法在DOS界面下繪制○出整個(gè)棋局的實(shí)時(shí)狀態(tài)(包括棋盤和棋子);

3能夠通過(guò)鍵盤上的按鍵完成所選位置的移動(dòng)和選定操作; ○4能夠在每一次的走棋后判定是否游戲結(jié)束(棋盤走滿或者是一方勝出); ○5能夠完成悔棋的功能,并保證這之間的棋局繪圖能夠與二維數(shù)組數(shù)據(jù)同步,做到真正意○義上的悔棋。

二、詳細(xì)設(shè)計(jì)

2.1 函數(shù)一覽

2.2 “封面”的設(shè)計(jì)

首先還是講些題外話,該程序由于與控制臺(tái)有密切的關(guān)系,于是在代碼中使用了不少 conio.h 中的函數(shù),當(dāng)然在顯示時(shí)又使用了windows.h 中的 Sleep()函數(shù),正是有了這些函數(shù)的使用,程序才得以順利完成,尤其是后面頻繁使用的gotoxy()函數(shù)。

進(jìn)入正題,由于是一個(gè)小的程序,因此將每一個(gè)功能分成一個(gè)一個(gè)的函數(shù),這樣將在以后的修改和完成進(jìn)度上都有很大的幫助。由上面的函數(shù)一覽可以知道這個(gè)“封面”就是在Logo()函數(shù)里面實(shí)現(xiàn)的,函數(shù)實(shí)現(xiàn)過(guò)程中使用了Sleep()函數(shù),使之有動(dòng)態(tài)效果:

void Logo(){

char Wel[30]= { “Made By Lyush&& Mirs Chen” };

printf(“ttt

歡迎試用五子棋系統(tǒng)n”);

printf(“tt

”);

for(int i= 0;i< strlen(Wel);++i)

{

putchar(Wel[i]);

Sleep(200);// 可使字符一個(gè)一個(gè)的輸出

}

putchar(10);// 換行對(duì)應(yīng)的 ASCII 碼值為十進(jìn)制的 10 }

2.3 二維數(shù)組與控制臺(tái)

二維數(shù)組是用來(lái)使得整個(gè)棋盤的信息全部記錄下來(lái),因此在結(jié)構(gòu)體中二維數(shù)組的聲明是最關(guān)鍵的。

struct {

int Status[MAX/2+2][MAX/2+2];

int MINBOX;

int Step;

char Graph[3][3];

char *FillGraph[9];

Sta Stack;} ChessBoard;

聲明全局變量是為了使得各函數(shù)能夠更方便地使用到這個(gè)結(jié)構(gòu)體,現(xiàn)假設(shè)某點(diǎn)的坐標(biāo)為(1, 1),那么如何在屏幕上打印這個(gè)點(diǎn)呢?這就利用到了ChangeCoordinates()與gotoxy()函數(shù),前者使坐標(biāo)進(jìn)行轉(zhuǎn)換,后者讓光標(biāo)走到所指的那個(gè)點(diǎn),其實(shí)主要還是因?yàn)轭愃啤癌恰ⅸ铩ⅰ瘛ⅰ稹痹跈M向上所占都是兩個(gè)英文字母的距離,因此在控制臺(tái)上反映的就是和數(shù)組下標(biāo)倍數(shù)關(guān)系了。部分代碼如下:

HANDLE hConsole= GetStdHandle(STD_OUTPUT_HANDLE);

void ChangeCoordinates(int _X, int _Y, int *X, int *Y){

*X=(_X-1)* 2;

*Y=(_Y-1)* 4;}

void gotoxy(int x, int y)//這是光標(biāo)的函數(shù) {

COORD coord;

coord.Y= x;

// 在實(shí)際的應(yīng)用過(guò)程中發(fā)現(xiàn)交換x與y的賦值

coord.X= y;

// 更好理解,即橫行位x,縱行為y。

SetConsoleCursorPosition(hConsole, coord);

}

2.4 鍵盤操作

在剛開(kāi)始寫這個(gè)五子棋的時(shí)候是以坐標(biāo)來(lái)確定玩家的每一步棋,但后來(lái)發(fā)現(xiàn)這樣操作性實(shí)在是差,鍵盤操作是更好的選擇。這里又要用到一個(gè)函數(shù) getch(),其作用是無(wú)回顯的接受從鍵盤輸入的字符,讓屏幕不會(huì)出現(xiàn)你輸入的字符且等待著按回車確定…… 有了這個(gè)寶貝函數(shù),馬上得到 “↑” 對(duì)應(yīng)的ASCII碼為-32和72 兩個(gè)連著的數(shù)值,依次可得其他對(duì)應(yīng)的ASCII碼。后面在使玩家一和玩家二分離操作,玩家一則是利用 W、S、A、D + space來(lái)操作,玩家二則是 上下左右+ enter。配合ChangeCoordinates()與gotoxy()函數(shù),完成對(duì)走棋的控制。部分代碼如下:

if(Opreat[0]== 13&& Ply== 2|| Opreat[0]== 32&& Ply== 1){ if(ChessBoard.Status[Move_X][Move_Y]== 0)

{

int TTop= ++ChessBoard.Stack.Top;ChessBoard.Status[Move_X][Move_Y]= Ply;ChessBoard.Stack.Record[TTop][0]= Move_X;ChessBoard.Stack.Record[TTop][1]= Move_Y;printf(“%s”, Graph);return true;// 該次走棋操作有效

} else { … } } if(Opreat[0]==-32&& Opreat[1]== 72|| Opreat[0]== 'w'|| Opreat[0]== 'W'){// 凡是接受了“上操作”,則Move_X的值減一,if(Currect(Move_X-1, Move_Y))

{

Move_X-= 1;

} } else if(…){ … }

// 這是接下來(lái)的轉(zhuǎn)換操作

ChangeCoordinates(Move_X, Move_Y, &Temp_X, &Temp_Y);Gotoxy(Temp_X, Temp_Y);

2.5判定

對(duì)于每次走棋后,首先應(yīng)該做的就是判定一否有五個(gè)棋子已經(jīng)連成一線,也是一個(gè)簡(jiǎn)單的搜索過(guò)程,由于每次走的點(diǎn)不一定是最外部的點(diǎn),因此從每次走的點(diǎn)的兩頭同時(shí)搜索,當(dāng)遇到兩端同時(shí)結(jié)束時(shí),搜索結(jié)束。當(dāng)滿足五子時(shí)游戲結(jié)束。當(dāng)然,當(dāng)棋盤被走滿時(shí),游戲亦結(jié)束。代碼如下: bool Legal(int Point){

if(Point< 1|| Point> MAX/ 2+ 1)

return false;

else

return true;}

//搜索45度角是否為滿足ChessBoard.MINBOX 以X正軸為參考軸

if(!Flag){ Count= 1;for(int i1= X-1, j1= Y+ 1, i2= X+ 1, j2= Y-1;Legal(i1)&& Legal(j1)|| Legal(i2)&& Legal(j2);i1--, j1++, i2++, j2--){

int LastCount= Count;

if(Legal(i1)&& Legal(j1)&& ChessBoard.Status[i1][j1]== Ply)

{

Count++;

}

if(Legal(i2)&& Legal(j2)&& ChessBoard.Status[i2][j2]== Ply)

{

Count++;

}

if(LastCount== Count)

break;

if(Count== ChessBoard.MINBOX){

Flag= 1;

return true;

} } }

2.6 悔棋的實(shí)現(xiàn)

雖說(shuō)下棋悔棋是一種不道義的行為,但是如果雙方約定好了,未嘗不可。在沒(méi)寫悔棋之前,只是記錄了“上一次”的位置,聲明了Last_X,Last_Y;當(dāng)然既然要求悔棋,那么直接調(diào)用棧頂元素,即可定位上次走棋的位置。那么悔棋呢,取出“上一次”的位置,判定位置(不同的位置對(duì)應(yīng)不同的填充圖形類型)在二維數(shù)組中撤銷走棋時(shí)所賦予的 Ply 值(玩家一走時(shí),其值為1,玩家二走時(shí),其值為2),重新將 ChessBoard.Status[ Last_X ][ Last_Y ] 賦為0。代碼如下:

int GetFillType(int X, int Y){

if(X== 1)

{

if(Y== 1)

return 0;

else if(Y== 16)

return 2;

else

return 1;

}

else if(X== 16)

{

if(Y== 1)

return 6;

else if(Y== 16)

return 8;

else

return 7;

}

else

{

if(Y== 1)

return 3;

else if(Y== 16)

return 5;

else

return 4;

} }

bool Retract(int *X, int *Y){

int Temp_X, Temp_Y, TTop, FillType;

if(!StackEmpty())

{

TTop= ChessBoard.Stack.Top--;

*X= ChessBoard.Stack.Record[TTop][0];

*Y= ChessBoard.Stack.Record[TTop][1];

ChessBoard.Status[*X][*Y]= 0;// 將該點(diǎn)置為真正意義上的空點(diǎn)

FillType= GetFillType(*X, *Y);

ChangeCoordinates(*X, *Y, &Temp_X, &Temp_Y);

Gotoxy(Temp_X, Temp_Y);

printf(“%s”, ChessBoard.FillGraph[FillType]);

return true;

}

else

{

Gotoxy(9, 65);

printf(“您已不能悔棋”);

Sleep(300);

Gotoxy(9, 65);

printf(“

”);

return false;

} }

三、調(diào)試運(yùn)行

3.1 進(jìn)入界面

3.2 棋盤的初始狀態(tài)

3.3 激戰(zhàn)中……

3.4 游戲結(jié)束

四、解決問(wèn)題的關(guān)鍵

這個(gè)五子棋的程序并沒(méi)有什么復(fù)雜的算法,只是利用了簡(jiǎn)單的圖知識(shí)和一個(gè)棧的應(yīng)用,在這里主要的關(guān)鍵問(wèn)題就是如何將程序有條理的寫下來(lái),有一個(gè)好的邏輯思維。將程序分成了多個(gè)功能函數(shù),盡量的讓一個(gè)函數(shù)的功能單一,只是在內(nèi)部調(diào)用了其他的函數(shù)以輔助改函數(shù)功能的實(shí)現(xiàn),比如判定坐標(biāo)是否越界,坐標(biāo)是否合法,悔棋的點(diǎn)的位置狀態(tài)…… 這樣便能做到各個(gè)擊破,程序的形成也就變得暢通許多了。

五、課設(shè)總結(jié)

剛開(kāi)始寫這個(gè)程序,認(rèn)為一定要用到 graphics.h, 無(wú)奈電腦TC不兼容,因此只好強(qiáng)行來(lái)畫這個(gè)界面了,使用輸入法里面的制表符,效果還不錯(cuò),通過(guò)一長(zhǎng)串的if … else … 最好還是畫出來(lái)了,這個(gè)時(shí)候覺(jué)得控制臺(tái)的簡(jiǎn)單圖形還是能夠畫出來(lái)的,并且可以盡量去美化它的界面。后面的附錄中將給出畫棋盤和棋子的源代碼。在程序設(shè)計(jì)的過(guò)程中,尤其是為源程序加上悔棋的功能,這期間總是有許多意想不到的錯(cuò)誤,比如加上后,有時(shí)走了5個(gè)連子棋,但是程序并沒(méi)有判定輸贏,而是可以繼續(xù)走、有時(shí)沒(méi)有五個(gè)卻已經(jīng)結(jié)束了,光標(biāo)沒(méi)有復(fù)位,悔棋后,玩家的走棋順序沒(méi)有跟著改變……通過(guò)后來(lái)的一步步修改終于使得這些問(wèn)題都一一解決了,比如說(shuō)對(duì) Prompt(提示)函數(shù)引進(jìn)了返回值,判斷該次操作是否成功,如果下了棋則為 true,如果是悔棋就是 false 了,這樣便使得后面的操作更規(guī)范了和統(tǒng)一了。

六、附錄

#include #include #include #include #include #include #include #define MAX 31 #define STA_1 1 #define STA_2 2 #define STA_0 0

HANDLE hConsole= GetStdHandle(STD_OUTPUT_HANDLE);

void HideCursor(){ CONSOLE_CURSOR_INFO cursor_info = {1, 0};

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}

typedef struct {

int Record[260][2];

int Base;

int Top;} Sta;

struct {

int Status[MAX/2+2][MAX/2+2];

int MINBOX;

int Step;

char Graph[3][3];

char *FillGraph[9];

Sta Stack;

} ChessBoard;

void Gotoxy(int x, int y)//這是光標(biāo)的函數(shù) {

COORD coord;

coord.Y= x;

coord.X= y;

SetConsoleCursorPosition(hConsole, coord);

}

void Logo(){

char Wel[30]= { “Made By Lyush&& Mirs Chen” };

printf(“ttt

歡迎試用五子棋系統(tǒng)n”);

printf(“tt

”);

for(int i= 0;i< strlen(Wel);++i)

{

putchar(Wel[i]);

Sleep(200);

}

putchar(10);}

int Login(){

int Mode, Skip= 0;

char Request;

if(!Skip)

{

printf(“nn在這兒你能DIY(Do it youself!)你的棋子,每個(gè)棋子接受一個(gè)漢字”);

printf(“ Y Orz Nn”);

scanf(“%c”, &Request);

if(Request== 'Y'|| Request== 'y')

{

printf(“玩家一的 DIY 棋子-->”);

scanf(“%s”, ChessBoard.Graph[1]);

ChessBoard.Graph[1][2]= '

主站蜘蛛池模板: 中文在线а天堂中文在线新版| 精品偷自拍另类在线观看| 香蕉精品亚洲二区在线观看| 永久中文字幕免费视频网站| 久久99精品久久久久免费| 日韩欧美tⅴ一中文字暮| 中文字幕av无码不卡免费| 国产边打电话边被躁视频| 蜜桃视频无码区在线观看| 亚洲乱码1卡2卡3乱码在线芒果| 国产乱子影视频上线免费观看| 国产在线精品二区| 日韩精品欧美在线成人| 无码专区—va亚洲v天堂麻豆| 亚洲v欧美v国产v在线观看| 亚洲尺码电影av久久| 国产高清在线精品一区不卡| 国产精品天堂avav在线| 精品亚洲国产成人av在线时间短的| 欧美肥妇毛多水多bbxx| 男女猛烈拍拍拍无挡视频| 午夜亚洲国产理论片中文飘花| 99精品久久久久中文字幕| 国产三级在线观看免费| 午夜性刺激在线观看| 人人妻人人澡人人爽人人精品| 综合三区后入内射国产馆| 成 人影片 免费观看| 四虎影库久免费视频| 午夜爽爽爽男女污污污网站| 国产a三级久久精品| 国产精品无码翘臀在线观看| 久久www免费人成精品| 午夜射精日本三级| av无码精品一区二区三区四区| 亚洲va成无码人在线观看天堂| 国产成人片无码免费视频| 性色av闺蜜一区二区三区| 亚洲精品乱码日本按摩久久久久| 97超级碰碰碰久久久久| 成人欧美一区二区三区的电影|