五子棋设计报告.docx

上传人:b****5 文档编号:7612183 上传时间:2023-01-25 格式:DOCX 页数:46 大小:109.58KB
下载 相关 举报
五子棋设计报告.docx_第1页
第1页 / 共46页
五子棋设计报告.docx_第2页
第2页 / 共46页
五子棋设计报告.docx_第3页
第3页 / 共46页
五子棋设计报告.docx_第4页
第4页 / 共46页
五子棋设计报告.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

五子棋设计报告.docx

《五子棋设计报告.docx》由会员分享,可在线阅读,更多相关《五子棋设计报告.docx(46页珍藏版)》请在冰豆网上搜索。

五子棋设计报告.docx

五子棋设计报告

C语言课程设计报告

五子棋

班级:

控制系测控0401

设计者:

余庚宗:

012004022112

刘鑫:

012004022006

何政:

012004022117

指导老师:

周凯波

 

2005年11月17日

课题:

五子棋

分工:

刘鑫:

主要界面设计

何政:

主要算法即胜利条件和交换次序,移动光标部分

余庚宗:

界面进一步优化以及控制下棋函数的实现和功能的进一步优化完善

程序作用:

可实现人和人对弈,也能实现简单的人机对战。

程序设计思想:

进入程序后可选择人人对弈和与低智商电脑的对战。

A,当进行人人对弈时:

一,游戏在19*19的棋盘下进行,下棋双方一人执白子,一人执黑子,下棋光标为一红色类圆框。

二,先由黑子先手,再自动换成白子,游戏界面上会有语句提示此时由谁下子。

判断标准如下:

1,若此时顺序为黑子时,则令顺序等于白子。

三,当有五颗同色子同向紧连在一起时,则执此色子方胜利。

判断标准如下:

1,定义横,竖,左下,右下四个方向和一个变量count。

2,在每个方向上判断。

3,若此方向上有同色子连在一起,则count++,若count=5时,判断此色方胜利。

四,若有一方胜利,则以声音和图象提示,同时按下任意键离开游戏。

B,当进行简单的人机对战时:

一:

游戏界面不变,玩家执黑子,电脑执白子。

二:

电脑的棋子只会随机出现在玩家最后下的一颗子的附近。

三:

其余情况类于人人对战。

 

特殊情况:

1,若要下子的位置已有其余子先占据了,则判断下子错误,以发出声音来显示错误。

2,若光标移往棋盘的最边缘,再移动光标出界,则光标移往棋盘的另一侧。

3,若此时由黑方下子,而白方却按下操作键,那么程序只响应黑方。

4,若在下完第N步后想悔棋,则可按下backspace,则程序将自动清除第N步下的棋子,返回下第N步前的一步。

实现过程如下:

A,若按下backspace键,程序首先将重新初始化棋盘。

B,再将前N-1步复原,下棋顺序返还下第N步的玩家.

5,若在行棋过程中想弃权重新再来,则可按下F2来实现。

6,在任意时刻按下ESC键,则立刻退出程序。

感想和体会:

1,c语言程序在模板上的编写很容易,然而若想编写出一个合格的程序却很难,编写时会有一大堆或大或小的很难被发觉的问题,这些问题曾一度让我们产生放弃的念头,编程时间的绝大部分是用来对这些问题的调试.

2,了解到c编程语言的强大.原以为编写市面上流行的游戏必须用例如VB,java等功能更强大的语言.然而,通过我们的编程,了解到用c语言可以编出界面友好,功能强大的游戏,不仅仅是大一我们自己编的解方程那一类简单程序.

3,感觉知识不能过于单一.在我们尝试研究五子棋人机对战方面,虽然小组三人想过很多算法,然而,即使如果我们编出来了,那种电脑的智商连三岁小孩也赢不了,如果我们中有人懂数据库的话,这些问题将迎刃而解。

4,深感合作的力量。

不仅分块让我们更专于一个问题的解决,而且在处理那些很难被发现的问题时,几双眼睛大大缩短了枯燥艰苦的调试时间。

 

函数说明:

voidDrawmap();画棋盘

voidReady()进入游戏后的初始界面

intChangeOrder(void)落子后交换行棋方

voidShowOrderMsg(intgPlayOrder)显示当前行棋方

intGetKey(void)获取按键值

voidDoOK(void)落子正确时的声音处理

voidDoError(void)落子错误时的声音处理

voidDoWin(intgPlayOrder)赢棋时的处理

intChessGo(intgPlayOrder,structpointgCursor)落子的函数

intJudgeWin(intgPlayOrder,structpointgCursor)判断是否胜利

intJudgeWinLine(intgPlayOrder,structpointgCursor,intdirection)

判断指定方向上是否有五颗同色棋子

intarrow()画下棋时的移动光标

voidMoveCursor(intgPlayOrder,intpress)移动光标

intCheckKey(intpress)判断用户的按键类别

voidEndgame()游戏结束退出

voidPlaygame()进行游戏

voiddrawmat(char*mat,intmatsize,intx,inty,intcolor)汉字输出

voidWelcome()运行程序后的初始欢迎界面

voidShowhelp()在下棋界面显示用户按键操作说明

voidAgain()直接重新进行游戏

voidBackSpace(intgChessBoard[19][19],intgPlayOrder,structpointgCursor)实现悔棋的函数

 

参考文献:

<<标准C语言程序设计及应用>>刘正林周纯杰周凯波华中科技大学出版社

<>王士元清华大学出版社

<<大学物理学CCBP>>李元杰陆果高等教育出版社

 

源程序:

/*WIN-TCBGI图形编程模板*/

#include

#include"stdlib.h"

#include

#include

#include

#include

#include"graphics.h"

#include"g:

\hanzi.h"/***取汉字代码***/

#defineclosegrclosegraph

#definePLAY1UP0x1157/*上移--'W'*/

#definePLAY1DOWN0x1f53/*下移--'S'*/

#definePLAY1LEFT0x1e41/*左移--'A'*/

#definePLAY1RIGHT0x2044/*右移--'D'*/

#definePLAY1DO0x3920/*落子--空格键*/

#definePLAY2UP0x4800/*上移--方向键up*/

#definePLAY2DOWN0x5000/*下移--方向键down*/

#definePLAY2LEFT0x4b00/*左移--方向键left*/

#definePLAY2RIGHT0x4d00/*右移--方向键right*/

#definePLAY2DO0x1c0d/*落子--回车键Enter*/

#defineESCAPE0x11b

#defineF20x3c00

#defineBACKSPACE0xe08

#defineNOONE1

#definePlAYER10

#definePlAYER215

#defineKEYEXIT0

#defineKEYFALLCHESS1

#defineKEYMOVECURSOR2

#defineKEYINVALID3

/*定义符号常量:

真,假---真为1,假为0*/

#defineTRUE1

#defineFALSE0

structpoint

{

intx,y;

};

intgPlayOrder;/*指示当前行棋方*/

structpointgCursor;/***用于记录当前光标位置***/

intgChessBoard[19][19];/*用于记录棋盘上各点的状态*/

void*buffer3;

 

voidinitgr(void);

voidReady();

intGetKey();

intCheckKey(intpress);

intChessGo(intgPlayOrder,structpointgCursor);

intChangeOrder(void);

voidDoError(void);

voidDoOK(void);

voidDoWin(intgPlayOrder);

voidMoveCursor(intgPlayOrder,intpress);

voidDrawmap();

intJudgeWin(intgPlayOrder,structpointgCursor);

intJudgeWinLine(intgPlayOrder,structpointgCursor,intdirection);

voidShowOrderMsg(intgPlayOrder);

voidPlaygame();

voidEndgame();

voidWelcome();

voiddrawmat(char*mat,intmatsize,intx,inty,intcolor);

voidShowhelp(void);

voidAgain(void);

voidBackSpace(intgChessBoard[19][19],intgPlayOrder,structpointgCursor);

voidEndshow();

voidMen_vs_computer();

voidReady2();

voidMoveCursor2(intpress);

intChessGo2(intgPlayOrder,structpointgCursor);

intCheckKey2(intpress);

voidComputerDo(intgChessBoard[19][19],structpointgCursor);

voidAgain2();

voidShowhelp2();

voidWinnershow();

voidPutstar(void);

voidLightbar(intpress);

 

intmain(void)

{

initgr();

Welcome();

closegr();/*恢复TEXT屏幕模式*/

return0;

}

voidinitgr(void)/*BGI初始化*/

{

intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是同样效果*/

registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/

initgraph(&gd,&gm,"");

}

voidWelcome()

{

unsignedsize1,size2,size3;

void*buffer1,*buffer2;

inti,m,press;

initgr();

size3=imagesize(260,150,360,180);

buffer3=malloc(size3);

setcolor(15);

setfillstyle(1,14);

bar3d(260,200,360,230,5,1);

getimage(260,200,360,230,buffer3);

setcolor(15);

setfillstyle(1,1);

bar3d(260,200,360,230,5,1);

bar3d(260,250,360,280,5,1);

bar3d(260,300,360,330,5,1);

/*drawmat(jin24,24,280,153,5);*/

/*drawmat(ru24,24,320,153,5);*/

drawmat(dan24,24,280,203,5);

drawmat(ren24,24,320,203,5);

drawmat(shuang24,24,280,253,5);

drawmat(ren24,24,320,253,5);

drawmat(tui24,24,280,303,5);

drawmat(chu24,24,320,303,5);

putimage(260,200,buffer3,XOR_PUT);

setcolor(BLACK);

setfillstyle(1,GREEN);

fillellipse(240,30,50,20);

drawmat(huan32H,32,200,15,YELLOW);

drawmat(ying32H,32,247,15,YELLOW);

size1=imagesize(190,10,290,50);

buffer1=malloc(size1);

getimage(190,10,290,50,buffer1);

putimage(190,10,buffer1,XOR_PUT);

setcolor(BLACK);

setfillstyle(1,GREEN);

fillellipse(400,30,50,20);

drawmat(shi32H,32,360,15,YELLOW);

drawmat(yong32H,32,407,15,YELLOW);

size2=imagesize(350,10,450,50);

buffer2=malloc(size2);

getimage(350,10,450,50,buffer2);

putimage(350,10,buffer2,XOR_PUT);/***做欢迎动画效果***/

setcolor(WHITE);

drawmat(zuo32K,32,60,380,WHITE);

drawmat(zhe32K,32,100,380,WHITE);

drawmat(biaodian32K,32,130,382,WHITE);

drawmat(liu16S,16,150,380,WHITE);

drawmat(xin16S,16,210,380,WHITE);

outtextxy(150,410,"012004022006");

drawmat(he16S,16,280,380,WHITE);

drawmat(zheng16S,16,340,380,WHITE);

outtextxy(280,410,"012004022117");

drawmat(yu16S,16,410,380,WHITE);

drawmat(geng16S,16,440,380,WHITE);

drawmat(zong16S,16,470,380,WHITE);

outtextxy(410,410,"012004022112");

outtextxy(320,440,"PressEntertoNext");

drawmat(wu64L,64,150,15,1);

drawmat(zi64L,64,280,15,1);

drawmat(qi64L,64,410,15,1);

while

(1)

{

if(kbhit())

{

break;

}

else

{

putimage(0,80,buffer1,XOR_PUT);

putimage(540,80,buffer2,XOR_PUT);

for(m=1;(m<221)&&(!

kbhit());m++)

{

putimage(0+m,80,buffer1,XOR_PUT);

putimage(540-m,80,buffer2,XOR_PUT);

putimage(0+(m-1),80,buffer1,XOR_PUT);

putimage(540-(m-1),80,buffer2,XOR_PUT);

drawmat(wu64L,64,150,15,i%16);

drawmat(zi64L,64,280,15,i%16);

drawmat(qi64L,64,410,15,i%16);

i+=1;

delay(100);

}

putimage(220,80,buffer1,XOR_PUT);

putimage(320,80,buffer2,XOR_PUT);

}

}

for(;1;)

{

press=GetKey();

Lightbar(press);

if(press==PLAY2DO)

{

Lightbar(press);

break;

}

else

continue;

}

getch();

}

voidDrawmap()/***画棋盘***/

{

inti=20;

initgr();

cleardevice();

setbkcolor(BLACK);

setcolor(RED);

rectangle(120,40,520,440);

rectangle(123,43,517,437);

setfillstyle(1,YELLOW);

floodfill(124,44,RED);

setcolor

(1);

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

{

line(140,60+20*i,500,60+20*i);

line(140+20*i,60,140+20*i,420);

}

}

/***进入游戏后初始界面***/

voidReady()

{

inti,j;

unsignedsize;

char*pointer;

gPlayOrder=PlAYER1;

setlinestyle(0,0,1);

setcolor(GREEN);

circle(20,27,10);

size=imagesize(11,18,29,36);

pointer=malloc(size);

getimage(11,18,29,36,pointer);

free(pointer);

setcolor(BLACK);

setfillstyle(1,BLACK);

bar(10,17,30,37);

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

{

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

{

gChessBoard[i][j]=NOONE;

}

}

gCursor.x=140;

gCursor.y=60;

Drawmap();

Showhelp();

ShowOrderMsg(gPlayOrder);

putimage(gCursor.x-9,gCursor.y-9,pointer,XOR_PUT);

}

voidReady2()

{

inti,j;

unsignedsize;

char*pointer;

gPlayOrder=PlAYER1;

setlinestyle(0,0,1);

setcolor(GREEN);

circle(20,27,10);

size=imagesize(11,18,29,36);

pointer=malloc(size);

getimage(11,18,29,36,pointer);

free(pointer);

setcolor(BLACK);

setfillstyle(1,BLACK);

bar(10,17,30,37);

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

{

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

{

gChessBoard[i][j]=NOONE;

}

}

gCursor.x=140;

gCursor.y=60;

Drawmap();

Showhelp2();

putimage(gCursor.x-9,gCursor.y-9,pointer,XOR_PUT);

}

 

/***落子后交换行棋方***/

intChangeOrder(void)

{

if(gPlayOrder==PlAYER1)

{

gPlayOrder=PlAYER2;

}

else

{

gPlayOrder=PlAYER1;

}

return(gPlayOrder);

}

/*显示当前行棋方*/

voidShowOrderMsg(intgPlayOrder)

{

setcolor(RED);

settextstyle(3,0,4);

outtextxy(8,160,"Order:

");

if(gPlayOrder==PlAYER1)

{

setcolor(BLACK);

setfillstyle(1,BLACK);

bar(8,200,117,230);

setcolor(WHITE);

settextstyle(0,0,1);

outtextxy(8,202,"Player1go!

");

}

else

{

setcolor(BLACK);

setfillstyle(1,BLACK);

bar(8,200,117,230);

setcolor(WHITE);

settextstyle(0,0,1);

outtextxy(8,202,"Player2go!

");

}

}

/*获取按键值*/

intGetKey(void)

{

charlowbyte;

intpress;

while(bioskey

(1)==0);

/*如果用户没有按键,空循环*/

press=bioskey(0);

lowbyte=press&0xff;

press=press&0xff00+toupper(lowbyte);

return(press);

}

/*落子正确处理*/

voidDoOK(void)

{

sound(500);

delay(1000);

sound(600);

delay(1000);

sound(1000);

delay(1000);

nosound();

}

/*落子错误处理*/

voidDoError(void)

{

inti;

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

{

sound(1200);

delay(10000);

sound(800);

delay(10000);

sound(1200);

delay(10000);

sound(800);

delay(10000);

}

nosound();

}

/*赢棋处理*/

voidDoWin(intgPlayOrder)

{

inti;

for(i=0;i<8;)

{

sound(1500);

delay(10000);

s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1