C语言图形五子棋课程设计报告.docx

上传人:b****5 文档编号:14708114 上传时间:2023-06-26 格式:DOCX 页数:57 大小:411.64KB
下载 相关 举报
C语言图形五子棋课程设计报告.docx_第1页
第1页 / 共57页
C语言图形五子棋课程设计报告.docx_第2页
第2页 / 共57页
C语言图形五子棋课程设计报告.docx_第3页
第3页 / 共57页
C语言图形五子棋课程设计报告.docx_第4页
第4页 / 共57页
C语言图形五子棋课程设计报告.docx_第5页
第5页 / 共57页
C语言图形五子棋课程设计报告.docx_第6页
第6页 / 共57页
C语言图形五子棋课程设计报告.docx_第7页
第7页 / 共57页
C语言图形五子棋课程设计报告.docx_第8页
第8页 / 共57页
C语言图形五子棋课程设计报告.docx_第9页
第9页 / 共57页
C语言图形五子棋课程设计报告.docx_第10页
第10页 / 共57页
C语言图形五子棋课程设计报告.docx_第11页
第11页 / 共57页
C语言图形五子棋课程设计报告.docx_第12页
第12页 / 共57页
C语言图形五子棋课程设计报告.docx_第13页
第13页 / 共57页
C语言图形五子棋课程设计报告.docx_第14页
第14页 / 共57页
C语言图形五子棋课程设计报告.docx_第15页
第15页 / 共57页
C语言图形五子棋课程设计报告.docx_第16页
第16页 / 共57页
C语言图形五子棋课程设计报告.docx_第17页
第17页 / 共57页
C语言图形五子棋课程设计报告.docx_第18页
第18页 / 共57页
C语言图形五子棋课程设计报告.docx_第19页
第19页 / 共57页
C语言图形五子棋课程设计报告.docx_第20页
第20页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C语言图形五子棋课程设计报告.docx

《C语言图形五子棋课程设计报告.docx》由会员分享,可在线阅读,更多相关《C语言图形五子棋课程设计报告.docx(57页珍藏版)》请在冰点文库上搜索。

C语言图形五子棋课程设计报告.docx

C语言图形五子棋课程设计报告

C语言课程设计报告

五子棋

 

院系:

软件学院专业:

软件工程

班级:

102032学号:

指导老师:

王星

摘要

五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。

二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。

程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。

Abstract

Gobangisatraditionalchecker-typegameinwhichtheliningupoffivepiecesinastraightlinescoresvictory.AndClanguagecanaccomplisha2-playergobangoncomputers.This2-playergobangprogramcontains4mainsections,theyare,graphics,movementandselection,victoryjudgmentandhelpingsystem.SeveralelementsandsentencesofCprogramminglanguagesuchasstructuralelement,array,globalvariables,pressprocessingandGraphicsProgrammingarealsoappliedintheprogram.Withtheaccomplishmentofthethreemainsubprograms,namely,checkerboardandpiecesconstruction,players’step-selectionandvictoryjudgment,awholeprogramofgobangisestablishedandgobangisavailableoncomputers.

 

第1章:

需求分析

五子棋背景

传统五子棋的与围棋相同,分为黑白两色,棋盘为15×15,棋子放置于棋盘线上。

两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。

程序设计

本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。

程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。

程序需求分析

根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。

图形显示模块:

程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成19×19的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束画面。

玩家控制模块:

程序开始时,需玩家确定而后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开始新棋局。

胜负判断模块:

实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。

玩家计分模块:

一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。

程序流程设计

根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。

图1

第2章:

概要设计

各类头文件,变量及宏定义

#include""

#include""

#include""

#include<>

#include<>

#defineclosegrclosegraph

/*定义1号玩家的操作键键码*/

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

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

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

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

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

/*定义2号玩家的操作键键码*/

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

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

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

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

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

#defineESC0x011b/*退出*/

#defineY0x1579/*YES*/

#defineN0x316e/*NO*/

#defineBACK0xe08/*悔棋*/

#defineDEL0x5300/*删除比分*/

全局变量

intch,dh,del;/*文件操作计分变量*/

intk,i,j,n,t;/*控制变量*/

inta[20][20];/*棋盘数组*/

图形模块

棋盘的显示由游戏开始与结束部分控制,棋子以及棋子定位框的显示与保留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。

图形模块主要由以下函数组成:

initgr();/*图形界面初始化函数*/

Welcome();/*欢迎界面*/

Help();/*帮助界面*/

board();/*画棋盘*/

white();/*画白棋子*/

black();/*画黑棋子*/

bye();/*结束界面*/

green();/*连珠时着色相应棋子*/

show();drawmat();/*显示中文的点阵图函数,以及产生动态变色效果*/

border();/*棋子定位框函数*/

delborder();/*删除当前位置棋子定位框函数*/

p1turn();/*轮到1p时在左边边框画出白棋以及输出whiteturn以提示1p进行操作*/

p2turn();/*轮到2p时在右边边框画出黑棋以及输出blackturn以提示2p进行操作*/

p1del();/*轮到2p时去除p1turn();函数的效果*/

p2del();/*轮到1p时去除p2turn();函数的效果*/

玩家操作模块

棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。

在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。

1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。

玩家操作模块主要由以下函数构成:

P1move();/*玩家1移动函数*/

P2move();/*玩家2移动函数*/

Back();/*悔棋函数*/

胜负判断模块

胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。

本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。

以下简析本程序流程:

由获胜条件可以知,通过判断上、下、左、右、斜上、斜下八个方向上是否有连续的5个子即可得出是否获胜结果。

在游戏开始时,将棋盘初始化,即将棋盘抽象为一个19*19的数组,数组中每个元素数值设为6。

1P落子时,将数组内相应坐标处元素赋值为0;2P落子时,将数组内相应坐标处元素赋值为1。

通过循环扫描棋盘数组,如果上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于5时,1P获胜;当上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于0时,2P获胜。

胜负判断模块主要由以下几个函数构成:

Win();/*主要函数,判断胜负*/

P1win();/*p1胜利时调用,用于告知p1玩家胜利及询问是否继续*/

P1win();/*p2胜利时调用,用于告知p2玩家胜利及询问是否继续*/

restart();/*询问是否重新开始新的一局比赛的函数*/

initialization();/*初始化棋盘对应数组所有值为6*/

玩家计分模块

为了能使1p和2p更直观更便捷地看到双方对战的比分,所以做了此计分模块,因为分数不能因为重新调用main()函数就丢失了,所以采用对文件的操作,通过文件来记录双方的比分,这里对和文件进行操作,用来计1p和2p的分数。

玩家计分模块主要由以下几个函数构成:

Point();/*整合所有文件操作的模块*/

p1_point_input();/*1p计分文件读取*/

p1_point_input2();/*1p计分文件写入*/

p1_point_output();/*1p计分文件输出*/

p2_point_input();/*2p计分文件读取*/

p2_point_input2();/*2p计分文件写入*/

p2_point_output();/*2p计分文件输出*/

delscore1();/*删除当前1p分数*/

delscore2();/*删除当前2p分数*/

各模块之间调用关系如下

第3章:

详细设计

图形模块

initgr()/*BGI初始化*/

{

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

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

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

}

welcome()/*欢迎界面*/

{initgr();/*初始化*/

clearviewport();/*清屏*/

setcolor

(2);/*设置颜色*/

settextstyle(0,0,6);/*样式*/

outtextxy(180,180,"Welcome");/*位置以及内容*/

settextstyle(0,0,2);/*文本样式*/

outtextxy(240,420,"pressanykeytocontinue");/*位置以及内容*/

getch();/*pressanykeytocontinue*/

}

help()/*帮助界面,基本操作同welcome();函数*/

{

initgr();

clearviewport();

setcolor

(2);

settextstyle(0,0,2);

outtextxy(60,100,"P1move;WSAD");

outtextxy(60,120,"set:

space");

outtextxy(60,180,"P2move:

updownleftright");

outtextxy(60,200,"set:

Enter");

outtextxy(60,240,"YoucanpressBackspacetopullback!

");

outtextxy(60,280,"Whenyouwanttoquitthegame,");

outtextxy(60,300,"pressEsc.");

outtextxy(220,440,"pressanykeytocontinue");

getch();

}

bye()/*saybye~@!

实现功能同上*/

{

initgr();

clearviewport();

setcolor(4);

settextstyle(0,0,6);

outtextxy(130,180,"Thankyou!

");

settextstyle(0,0,2);

outtextxy(240,420,"pressanykeytoquit");

getch();

}

board()/*画棋盘*/

{

setcolor(14);/*线色*/

setfillstyle(1,6);/*样式*/

bar(120,50,520,450);/*棋盘底*/

for(k=0;k<21;k++)

{

line(120+20*k,50,120+20*k,450);/*竖线*/

line(120,50+20*k,520,50+20*k);/*横线*/

}

setfillstyle(1,9);

bar(540,200,620,300);/*1p2p两边框*/

bar(20,200,100,300);

setcolor

(2);

settextstyle(3,0,4);

outtextxy(50,210,"1p");

outtextxy(570,210,"2p");

delay(50000);

show();/*显示动态变色效果的标题*/

moveto(320,250);/*初始化中心位置*/

border();/*画定位框*/

p1turn();/*p1开始落子,游戏开始*/

}

white()/*画白棋*/

{

setcolor(15);

setfillstyle(1,15);

circle(getx(),gety(),9);

floodfill(getx(),gety(),15);

}

black()/*画黑棋*/

{

setcolor(0);

setfillstyle(1,0);

circle(getx(),gety(),9);

floodfill(getx(),gety(),0);

}

green()/*用粉色着色连珠时的棋子*/

{

setcolor(13);

setfillstyle(1,13);

circle(getx(),gety(),9);

floodfill(getx(),gety(),13);

}

p1turn()/*画左边边框内白棋子*/

{

setcolor(15);

setfillstyle(1,15);

circle(60,250,9);

floodfill(60,250,15);

settextstyle(3,0,4);

outtextxy(20,280,"whiteturn");

}

p2turn()/*右边边框内黑色棋子*/

{

setcolor(0);

setfillstyle(1,0);

circle(580,250,9);

floodfill(580,250,0);

settextstyle(3,0,4);

outtextxy(540,280,"blackturn");

}

p1del()/*不是1turn时候抹去左边边框内棋子*/

{setfillstyle(1,9);

floodfill(60,250,9);

setcolor(9);

settextstyle(3,0,4);

outtextxy(20,280,"whiteturn");

}

p2del()/*不是2turn时候抹去右边边框内棋子*/

{

setfillstyle(1,9);

floodfill(580,250,9);

setcolor(9);

settextstyle(3,0,4);

outtextxy(540,280,"blackturn");

}

border()/*画定位框*/

{

setcolor(14);

line(getx()-8,gety()-9,getx()-3,gety()-9);/*通过画线函数画出定位框*/

line(getx()+8,gety()-9,getx()+3,gety()-9);

line(getx()-8,gety()-9,getx()-8,gety()-4);

line(getx()+8,gety()-9,getx()+8,gety()-4);

line(getx()-8,gety()+9,getx()-3,gety()+9);

line(getx()+8,gety()+9,getx()+3,gety()+9);

line(getx()-8,gety()+9,getx()-8,gety()+4);

line(getx()+8,gety()+9,getx()+8,gety()+4);

}

delborder()/*除去定位框*/

{

setcolor(6);/*本质在于颜色覆盖*/

line(getx()-8,gety()-9,getx()-3,gety()-9);line(getx()+8,gety()-9,getx()+3,gety()-9);

line(getx()-8,gety()-9,getx()-8,gety()-4);

line(getx()+8,gety()-9,getx()+8,gety()-4);

line(getx()-8,gety()+9,getx()-3,gety()+9);

line(getx()+8,gety()+9,getx()+3,gety()+9);

line(getx()-8,gety()+9,getx()-8,gety()+4);

line(getx()+8,gety()+9,getx()+8,gety()+4);

}

drawmat(char*mat,intmatsize,intx,inty,intcolor)/*点阵图所用标准输出方式*/

{

inti,j,k,m;

m=(matsize-1)/8+1;

for(j=0;j

for(i=0;i

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

if(mat[j*m+i]&(0x80>>k))

putpixel(x+i*8+k,y+j,color);

}

show()/*动态点阵图中文闪烁效果*/

{

for(n=0;n<3;n++)

{delay(10000);

drawmat(wu32K,32,240,0,3);/*输出点阵图的“五”字*/

delay(10000);

drawmat(zi32K,32,290,0,3);

delay(10000);

drawmat(qi32K,32,340,0,3);

delay(10000);

drawmat(wu32K,32,240,0,2);

delay(10000);

drawmat(zi32K,32,290,0,2);

delay(10000);

drawmat(qi32K,32,340,0,2);

}

玩家操作模块

p1move()/*玩家1操作*/

{

switch(bioskey(0))/*bioskey函数对键盘操作*/

{

caseW:

/*上移*/

{if(gety()<90)

所有if语句作用在于如果落子即将溢出边框,让其改变位置到另一端,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置

{delborder();moveto(getx(),430);}

delborder();moverel(0,-20);border();p1move();}

caseA:

/*左移*/

{if(getx()<160)

{delborder();moveto(500,gety());}

delborder();moverel(-20,0);border();p1move();}

caseS:

/*下移*/

{if(gety()>410)

{delborder();moveto(getx(),70);}

delborder();moverel(0,20);border();p1move();}

caseD:

/*右移*/

{if(getx()>480)

{delborder();moveto(140,gety());}

delborder();moverel(20,0);border();p1move();}

caseSP:

/*落子*/

{if(a[getx()][gety()]!

=6)

/*判定如果棋盘此处无子才能下,否则重新调用p1move函数*/

{p1move();}

delborder();/*去除定位框*/

white();/*画棋子*/

a[getx()][gety()]=1;/*将所在位置对应的数组点赋值为1*/

win();/*判断胜负*/

border();/*在新的位置画出定位框*/

对左右两边提示框操作,提示轮到2p进行操作,并调用p2move()函数

p1del();

p2turn();

p2move();}

caseESC:

/*结束游戏*/

{bye();closegraph();exit(0);}

caseBACK:

/*悔棋操作*/

{back();p1del();p2turn();p2move();}

default:

p1move();

 

}

}

p2move()/*玩家2操作*/

{

switch(bioskey(0))

{

caseUP:

{if(gety()<90)

{delborder();moveto(getx(),430);}

delborder();moverel(0,-20);border();p2move();}

caseLEFT:

{if(getx()<160)

{delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();}

caseDOWN:

{if(gety()>410)

{delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();}

caseRIGHT:

{if(getx()>480)

{delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();}

caseENTER:

{if(a[getx()][gety()]!

=6)

{p2move();}delborder();black();a[getx()][gety()]=0;win();border();p2del();p1turn();p1move()

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

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2