计算机程序设计基础(C语言)课程设计
20##年 7 月 5 日·北京
目录
1 课程设计报告…………………………………………………………………………3
1.1课题描述……………………………………………………………………3
1.2需求分析……………………………………………………………………3
1.3概要设计……………………………………………………………………4
1.3.1功能模块………………………………………………………………4
1.3.2主流程图………………………………………………………………4
2源程序代码……………………………………………………………………6
3详细设计………………………………………………………………………13
1部分……………………………………………………………………………13
(1)画白棋棋子…………………………………………………………………13
(2)画黑棋棋子…………………………………………………………………13
(3)补棋盘颜色…………………………………………………………………13
(4)画棋盘……………………………………………………………………14
2部分……………………………………………………………………………15
3部分……………………………………………………………………………18
4部分……………………………………………………………………………20
课设总结…………………………………………………………………………23
参考文献…………………………………………………………………………26
1.课题设计报告
1.1课题描述:
游戏介绍:在一个18*18的方格中下棋,两个玩家,根据键盘上的上、下、左、右键及W、S、A、D来控制棋的走向,空格键及回车键表示确定棋子的落下位置,两个玩家为交替下棋,如果于其中任何一家下的五个棋子能够练成一线那么为胜者,游戏结束。
1 、五子棋是两个人之间进行的竞技活动,开始是由P1先下,把棋落在方框内,然后P2下,如此下棋直到一方在棋盘的横,竖 ,斜将同色的五个棋子连成一条线,则此方获胜。游戏由玩家决定继续或结束。
1.2需求分析
(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;
(2)画出棋盘的大小;
(3)画棋子并确定棋子的大小;
(4)判断键盘输入哪个键执行操作;
(5)玩家P1先落棋;
(6)玩家轮流下棋;
(7)判断赢家。
(8)由玩家决定是否继续新游戏。
1.3 概要设计
1.3.1功能模块
1.3.2 主流程图
遇到的一个问题:
图形一闪而过解决方法
因为Win-TC的图形驱动程序EGAVGA.BGI文件安装路径为c:\\TC20
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc")改为initgraph(&gdriver, &gmode, "c:\\TC20")
2.源程序代码
#include <bios.h>
#include "stdio.h"
#include "graphics.h"
/*定义1号玩家的操作键键码*/
#define W 0x1177/*上移--'W'*/
#define S 0x1f73/*下移--'S'*/
#define A 0x1e61/*左移--'A'*/
#define D 0x2064/*右移--'D'*/
#define SP 0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#define UP 0x4800/*上移--方向键up*/
#define DOWN 0x5000/*下移--方向键down*/
#define LEFT 0x4b00/*左移--方向键left*/
#define RIGHT 0x4d00/*右移--方向键right*/
#define ENTER 0x1c0d/*落子--回车键Enter*/
#define ESC 0x011b
#define X (getx()-140)/20 /*将棋盘上光标所在点的横坐标X转化为0-18的数*/
#define Y (gety()-70)/20 /*将棋盘上光标所在点的纵坐标Y转化为0-18的数*/
int k,w=DETECT,gmode,j,i;
int a[20][20];
void p1move(); /*定义函数*/
void p2move();
void win();
p1win();
p2win();
yellow();
white();
black();
heqi();
welcome();
help();
csz();
qipang();
p1turn();
p2turn();
p1del();
p1turn()/*画左上角的白棋*/
{
setcolor(7);
setfillstyle(1,7);
circle(60,110,9);
floodfill(60,110,7);
}
p1del() /*将左上角白棋檫去*/
{
setfillstyle(1,14);
floodfill(60,110,14);
}
p2turn() /*画右上角的黑棋*/
{
setcolor(0);
setfillstyle(1,0);
circle(578,115,9);
floodfill(578,115,0);
}
p2del() /*将右上角黑棋檫去*/
{
setfillstyle(1,14);
floodfill(578,115,14);
}
white() /*在当前位置画白棋*/
{
setcolor(7);
setfillstyle(1,7);
circle(getx(),gety(),9);
floodfill(getx(),gety(),7);
}
black() /*在当前位置画黑棋*/
{
setcolor(0);
setfillstyle(1,0);
circle(getx(),gety(),9);
floodfill(getx(),gety(),0);
}
yellow() /*补棋盘的颜色*/
{
setcolor(6);
setfillstyle(1,6);
circle(getx(),gety(),9);
floodfill(getx(),gety(),6);
setcolor(15);
line(getx()-9,gety(),getx()+9,gety());
line(getx(),gety()+9,getx(),gety()-9);
}
qipang() /*画棋盘*/
{ setfillstyle(1,6);
bar(120,50,520,450);
setfillstyle(1,14);
bar(540,50,620,150);
bar(20,50,100,150);
for(k=0;k<19;k++)
{moveto(140+20*k,70);linerel(0,360);
moveto(140,70+20*k);linerel(360,0);
}
moveto(240,170);
setcolor(5);
settextstyle(3,0,4);
outtextxy(50,60,"P1");
outtextxy(560,60,"P2");
}
welcome() /*欢迎界面*/
{ initgraph(&w ,&gmode,"c:\\TC20 ") ;
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"Welcome");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
delay(1000) ; /*delay(1000000000) ; delay(1000000000) ; */
}
help() /*帮助界面*/
{
initgraph(&w ,&gmode,"c:\\TC20");
clearviewport();
setcolor(4);
settextstyle(0,0,2);
outtextxy(80,100,"P1 move; 'W S A D' ");
outtextxy(80,120," set : space ");
outtextxy(80,180,"P2 move: up down left right ");
outtextxy(80,200," set: Enter");
outtextxy(80,280,"Whoever is first to gather five ");/*same color pieces in a line without any different color piece among them,then he win */
outtextxy(80,300,"same color pieces in a line without");
outtextxy(80,320,"any different color piece among ");
outtextxy(80,340,"them, then he win.");
outtextxy(80,360,"When you want to quit the game,");
outtextxy(80,380,"press Esc.");
outtextxy(220,440,"press any key to continue");
while(bioskey(1)==0);
}
p1win() /*玩家1获胜界面*/
{
initgraph(&w ,&gmode,"c:\\TC20") ;
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"P1 WIN");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(1)==0);
main();
}
p2win() /*玩家2获胜界面*/
{
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"P2 WIN");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(0)!=0) main();
}
heqi() /*和棋界面*/
{
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"tie");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(0)!=0) main();
}
csz() /*将所在位置的A[X][Y]赋初值6*/
{
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{a[i][j]=6;}
}
void win() /*判断输赢*/
{int sum1,sum2,sum3,sum4,sum=0,n,i,j;
for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2)
{sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];
sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4][j+4];
sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];
sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n];
if(sum1==5||sum2==5||sum3==5||sum4==5)
p2win();
if (sum1==0||sum2==0||sum3==0||sum4==0)
p1win(); }
for(i=0;i<18;i++)
for(j=0;j<18;j++)
sum=sum+a[i][j];
if(sum<181)
heqi();
}
void p1move() /*玩家1的移动*/
{
switch(bioskey(0))
{
case ESC: {closegraph(); exit(0);}/*如果按键为ESC就退出游戏*/
case SP:/*落子*/
if(a[X][Y]==6) {p1del();p2turn();a[X][Y]=0;white();win(); p2move();}
else p1move();
case A: /*向左移*/
if(a[X][Y]==0)
{if(getx()==140) moveto(520,gety());moverel(-20,0);white();}
else if(a[X][Y]==1)
{if(getx()==140) moveto(520,gety());black();moverel(-20,0);white();}
else
{ yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);white();} p1move();
case D: /*向右移*/
if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());moverel(20,0);white();}
else if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());black();moverel(20,0);white();}
else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);white();}p1move();
case W: /*向上移*/
if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}
else if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);black();moverel(0,-20);white();}
else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}p1move();
case S: /*向下移*/
if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);moverel(0,20);white();}
else if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);black();moverel(0,20);white();}
else { yellow();if(gety()==430) moveto(getx(),50);moverel(0,20);white(); } p1move();
default: p1move();
}}
void p2move() /*玩家2的移动*/
{
switch(bioskey(0)) /*如果按键为ESC就退出游戏*/
{
case ESC: {closegraph(); exit(0);}
case ENTER: /*落子*/
if(a[X][Y]==6) {p2del();p1turn();a[X][Y]=1;black();win();p1move();}
else p2move();
case LEFT: /*向左移*/
if(a[X][Y]==1) {if(getx()==140) moveto(520,gety());moverel(-20,0);black();}
else if(a[X][Y]==0) {if(getx()==140) moveto(520,gety());if(getx()==140) moveto(500,gety());white();moverel(-20,0);black();}
else { yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);black();} p2move();
case RIGHT: /*向右移*/
if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());moverel(20,0);black();}
else if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());white();moverel(20,0);black();}
else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);black();}p2move();
case UP: /*向上移*/
if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}
else if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);white();moverel(0,-20);black();}
else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}p2move();
case DOWN: /*向下移*/
if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);moverel(0,20);black();}
else if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);white();moverel(0,20);black();}
else {if(gety()==430) moveto(getx(),50); yellow();moverel(0,20);black();}p2move();
default: p2move();
}
}
main() /*主函数*/
{ welcome(); /*调用欢迎界面*/
help(); /*调用帮助界面*/
initgraph(&w ,&gmode,"c:\\TC20") ; /*清屏*/
clearviewport();
csz();
qipang(); /*调用棋盘*/
p1move(); /*调用玩家1的移动*/
p2move();
getch();
}
3.详细设计
1部分
(1)画白棋棋子
(white()
{
setcolor(7);
setfillstyle(1,7);
circle(getx(),gety(),9);
floodfill(getx(),gety(),7);
}
(2)画黑棋棋子
black()
{
setcolor(0);
setfillstyle(1,0);
circle(getx(),gety(),9);
floodfill(getx(),gety(),0);
}
(3)补棋盘颜色
由于我们实现棋子在棋盘上移动的功能是用:某一色棋子覆盖棋盘上的点,当光标移动后,用白色圆圈将原本的棋子覆盖,再填上与棋盘相同的颜色,最后用十字线条覆盖原本棋子所在的位置,然后再用棋子覆盖棋盘上新的点实现移动棋子和下棋的功能的,所以需要我编此函数。
yellow()
{
setcolor(6);
setfillstyle(1,6);
circle(getx(),gety(),9);
floodfill(getx(),gety(),6);
setcolor(15);
line(getx()-9,gety(),getx()+9,gety());
line(getx(),gety()+9,getx(),gety()-9);
}
(4)画棋盘
这段函数的功能是画出棋盘及棋盘边左右上方的p1,p2字样。首先先画一块18*18的有色方块,然后利用循环及相对坐标在方块上画出棋盘的竖线和横线,接着移出棋盘设置背景色,再设置字体颜色,最后再在棋盘的左右上方写上p1、p1。
qipang()
{ setfillstyle(1,6);bar(120,50,520,450);
for(k=0;k<19;k++)
{moveto(140+20*k,70);linerel(0,360);
moveto(140,70+20*k);linerel(360,0);
}
moveto(240,170);
setbkcolor(14);
setcolor(5);
settextstyle(3,0,4);
outtextxy(50,60,"P1");
outtextxy(560,60,"P2");
}
课设总结
经过这次的选课,我最大的感觉就是遗憾,验证了一句话:书到用时方恨少啊!!!!!!由于水平问题,我在这次的程序设计中承担的任务是画图。。。。令人郁闷的任务。。。让我很后悔上学期没有把C学透,学好。虽然我考了99,但我自己知道,那是突击出来的结果,实际上我肚子里的东西没多少。还好,我的队友们水平都很不错,我们组才可以完成。其实我是有尝试负责判断胜负的部分,可是程序写出来了,却怎么改都不行。。时间紧迫,其他3名组员毅然决定派给我另一个光荣而又神圣的任务——画棋盘。至于画棋盘嘛,我的水平还够,完成得很快。但是我并没有因此而闲着,我还帮助其他组员出谋划策,检测程序的完整性,以及排错,我还是有发挥自己的余光余热的,希望老师不要让我不过啊
2部分
void p1move() /*玩家1的移动*/
{
switch(bioskey(0))
{
case ESC: {closegraph(); exit(0);}/*如果按键为ESC就退出游戏*/
case SP:/*落子*/
if(a[X][Y]==6) {p1del();p2turn();a[X][Y]=0;white();win(); p2move();}
else p1move();
case A: /*向左移*/
if(a[X][Y]==0)
{if(getx()==140) moveto(520,gety());moverel(-20,0);white();}
else if(a[X][Y]==1)
{if(getx()==140) moveto(520,gety());black();moverel(-20,0);white();}
else
{ yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);white();} p1move();
case D: /*向右移*/
if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());moverel(20,0);white();}
else if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());black();moverel(20,0);white();}
else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);white();}p1move();
case W: /*向上移*/
if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}
else if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);black();moverel(0,-20);white();}
else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}p1move();
case S: /*向下移*/
if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);moverel(0,20);white();}
else if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);black();moverel(0,20);white();}
else { yellow();if(gety()==430) moveto(getx(),50);moverel(0,20);white(); } p1move();
default: p1move();
}}
void p2move() /*玩家2的移动*/
{
switch(bioskey(0)) /*如果按键为ESC就退出游戏*/
{
case ESC: {closegraph(); exit(0);}
case ENTER: /*落子*/
if(a[X][Y]==6) {p2del();p1turn();a[X][Y]=1;black();win();p1move();}
else p2move();
case LEFT: /*向左移*/
if(a[X][Y]==1) {if(getx()==140) moveto(520,gety());moverel(-20,0);black();}
else if(a[X][Y]==0) {if(getx()==140) moveto(520,gety());if(getx()==140) moveto(500,gety());white();moverel(-20,0);black();}
else { yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);black();} p2move();
case RIGHT: /*向右移*/
if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());moverel(20,0);black();}
else if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());white();moverel(20,0);black();}
else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);black();}p2move();
case UP: /*向上移*/
if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}
else if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);white();moverel(0,-20);black();}
else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}p2move();
case DOWN: /*向下移*/
if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);moverel(0,20);black();}
else if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);white();moverel(0,20);black();}
else {if(gety()==430) moveto(getx(),50); yellow();moverel(0,20);black();}p2move();
default: p2move();
}
程序解释:
P1move()和p2move()基本相同,所以只解释p1move.
case SP: /*空格键落子*/
if(a[X][Y]==6) /*如果键盘上没有棋子*/
{p1del(); /*将右上角的黑棋删除*/
p2turn(); /*将左上角的白棋画上*/
a[X][Y]=0; /* a[X][Y]是标注,0代表白棋*/
white();/*在所在点画白棋*/
win(); /*判断输赢*/
p2move();/*跳到玩家2的控制*/}
else /*如果有棋子*/p1move();/*回到玩家1的控制*/
/*向右、向上、向下都跟向左一样,所以只解释向左*/
case A: /*向左移*/
if(a[X][Y]==0) /*如果这点是白棋*/
{if(getx()==140) /*如果在棋盘的最左端*/
moveto(520,gety());/*移到最右端*/moverel(-20,0); /*所在点向左移一格*/
white();/*画白棋*/}
是黑棋的情况和白棋差不多,不在解释。
课设总结
写这个程序,我觉得开头最困难,不知从何入手,要想移动棋子,先得把原来画上,再移动光标,在把要下的棋子画上,要画原来得就要分析原来是黑或者是白还是无三种情况讨论,要费一番脑筋。写的过程中常不知错在哪里。但又必须改对,常令人头疼,而错得原因常常是细节问题,比如:P1移动棋子的按键‘A、S、D、W’大小写键值不同,我没按大小写锁定键,导致白棋不能动,还好在同学的帮助下我终于找出错误;有一些想要实现的功能没有实现,比如想要用DELAY();让棋子不闪动;又比如棋子走过边界会产生一段直线,想用malloc();getimage();putimage()实现,但有困难,也没能实现。
3部分
1. 判断胜负
csz() /*将所在位置的A[X][Y]赋初值6*/
{
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{a[i][j]=6;}
}
void win()
{int sum1,sum2,sum3,sum4,sum=0,n,i,j;
for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2)
{sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];
sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4][j+4];
sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];
sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n];
if(sum1==5||sum2==5||sum3==5||sum4==5)/*任一方向有5个黑色棋子*/
p2win();/*P2获胜*/
if (sum1==0||sum2==0||sum3==0||sum4==0) /*任一方向有5个白色棋子*/
p1win(); }/*P1获胜*/
for(i=0;i<18;i++)
for(j=0;j<18;j++)
sum=sum+a[i][j];
if(sum<181) /*棋盘全部下满*/
heqi();/*和棋*/
a[X][Y]的值0,1,6分别表示所在坐标为白棋,黑棋,无棋。
判断胜负 N-S 流程图
2.
p1turn() /*当白棋下时,在棋盘的左上侧出现白子调用的函数*/
{
setcolor(7);
setfillstyle(1,7);
circle(60,110,9);
floodfill(60,110,7);
}
p1del() /*当黑棋下时,在棋盘的左上侧白子消失调用的函数*/
{
setfillstyle(1,14);
floodfill(60,110,14);
}
p2turn() /*当黑棋下时,在棋盘的左上侧出现黑子调用的函数*/
{
setcolor(0);
setfillstyle(1,0);
circle(578,115,9);
floodfill(578,115,0);
}
p2del() /*当白棋下时,在棋盘的左上侧黑子消失调用的函数*/
{
setfillstyle(1,14);
floodfill(578,115,14);
}
课程总结
经过C语言程序设计的学习,我觉得与大一的有很大的不同,难度不在一个级别上。开始一头雾水,不知道从哪入手。但经过老师的讲解和我们的讨论、研究,大家分工合作终于完成了我们的五子棋C语言程序设计。从中我学到了不少C语言的知识,和它的应用,更重要的是认识到了团队合作的力量。我想在其他的科目上我们也能应用学习C语言程序设计的方法,使我们更好,更快,更容易的学习其他科目.
4 部分
1.Welcome() /*游戏刚开始的欢迎文字*/
2.Help() /*介绍游戏的玩法,还有用哪些键下棋*/
3.P1win() /* 当P1赢时,输出“P1 WIN”字幕,当按下一个键时返回开始界面*/
4.P2win() /*当P2赢时,输出“P2 WIN”字幕,当按下一个键时返回开始界面*/
5..Heqi() /*当和局时,输出“Drawn game(和局)”字幕,当按下一个键时返回开始界面*/ welcome()
{ initgraph(&w ,&gmode,"c:\\tc") ;
clearviewport();
setcolor(4);/*设置前景颜色*/
settextstyle(0,0,6); /*设计文本类型(第一个0表示字体,第二个0表示字体横向排列,6是字体大小)*/
outtextxy(180,180,"Welcome");/*输出文本*/
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
}
help()
{
initgraph(&w ,&gmode,"c:\\tc");
clearviewport();
setcolor(4);
settextstyle(0,0,2);
outtextxy(80,100,"P1 move: 'W S A D' "); help()流程图:
outtextxy(80,120," set : space ");
outtextxy(80,1+80,"P2 move: up down left right ");
outtextxy(80,200," set: Enter");
outtextxy(80,280,"Whoever is first to gather five ");
outtextxy(80,300,"same color pieces in a line without");
outtextxy(80,320,"any different color piece among ");
outtextxy(80,340,"them, then he win.");
outtextxy(80,360,"When you want to quit the game,");
outtextxy(80,380,"press Esc.");
outtextxy(220,440,"press any key to continue");
while(bioskey(1)==0);/*直到按下一个键*/
}
P1 WIN()流程图:
p1win()
{
initgraph(&w ,&gmode,"c:\\tc") ;
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"P1 WIN");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(1)==0);
main();
}
P2 WIN()流程图:
p2win()
{
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"P2 WIN");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(1)==0);main();
}
heqi()
{
clearviewport(); heqi()流程图和上相同
setcolor(4);
settextstyle(0,0,6);
outtextxy(180,180,"tie");
settextstyle(0,0,2);
outtextxy(280,440,"press any key to begin");
while(bioskey(1)==0); main();
}
课设总结
编辑游戏这在一前我都以为是要遥不可及,但现在通过这次五子棋的设计我明白了,并不是如此,只要团队合作也可以搞定,我多学了许多的以前课上没有的知识,比如怎么用c程序画图,写出文本等。更了解到了要做好一件事,团队是很重要的,经过我们的讨论,研究,最终把分工定下,虽然我这次只是写了短短的六十几行程序,输出一些基本的文字,没分到设计主要程序的任务,但也减少了大家的负担。最终通过我们的共同努力终于完成了游戏的设计……
initgraph:初始化图形系统
initgraph
【功能】初始化图形系统。
【原型】void far initgraph ( int far *graphdriver, int far *graphmode, char far *pathtodriver)
【位置】graphics.h
★图形模式的初始化★
不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器, 在不同
模式下也有不同分辨率。因此, 在屏幕作图之前, 必须根据显示器适配器种类将
显示器设置成为某种图形模式, 在未设置图形模式之前, 微机系统默认屏幕为文
本模式(80列, 25行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形
模式, 可用下列图形初始化函数:
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所
在的目录路径。(path路径名中不能有空格)有关图形驱动器、图形模式的符号常数及对应的分辨率见表2。
图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形
适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序
EGAVGA.BGI。
表2. 图形驱动器、模式的符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(gdriver) 图形模式(gmode)
─────────── ─────────── 色调 分辨率
符号常数 数值 符号常数 数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA 1 CGAC0 0 C0 320*200
CGAC1 1 C1 320*200
CGAC2 2 C2 320*200
CGAC3 3 C3 320*200
CGAHI 4 2色 640*200
───────────────────────────────────
MCGA 2 MCGAC0 0 C0 320*200
MCGAC1 1 C1 320*200
MCGAC2 2 C2 320*200
MCGAC3 3 C3 320*200
MCGAMED 4 2色 640*200
MCGAHI 5 2色 640*480
───────────────────────────────────
EGA 3 EGALO 0 16色 640*200
EGAHI 1 16色 640*350
───────────────────────────────────
EGA64 4 EGA64LO 0 16色 640*200
EGA64HI 1 4色 640*350
───────────────────────────────────
EGAMON 5 EGAMONHI 0 2色 640*350
───────────────────────────────────
IBM8514 6 IBM8514LO 0 256色 640*480
IBM8514HI 1 256色 1024*768
───────────────────────────────────
HERC 7 HERCMONOHI 0 2色 720*348
───────────────────────────────────
ATT400 8 ATT400C0 0 C0 320*200
ATT400C1 1 C1 320*200
ATT400C2 2 C2 320*200
ATT400C3 3 C3 320*200
ATT400MED 4 2色 320*200
ATT400HI 5 2色 320*200
───────────────────────────────────
VGA 9 VGALO 0 16色 640*200
VGAMED 1 16色 640*350
VGAHI 2 16色 640*480
───────────────────────────────────
PC3270 10 PC3270HI 0 2色 720*350
───────────────────────────────────
DETECT 0 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例4. 使用图形初始化函数设置VGA高分辨率图形模式
#include <graphics.h>
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/
getch();
closegraph();
return 0;
}
有时编程者并不知道所用的图形显示器适配器种类, 或者需要将编写的程序
用于不同图形驱动器, Turbo C提供了一个自动检测显示器硬件的函数, 其调用
格式为:
void far detectgraph(int *gdriver, *gmode);
其中gdriver和gmode的意义与上面相同。
例5. 自动进行硬件测试后进行图形初始化
#include <graphics.h>
int main()
{
int gdriver, gmode;
detectgraph(&gdriver, &gmode); /*自动测试硬件*/
printf("the graphics driver is %d, mode is %d\n", gdriver,
gmode); /*输出测试结果*/
getch();
initgraph(&gdriver, &gmode, "c:\\tc");
/* 根据测试结果初始化图形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上例程序中先对图形显示器自动检测, 然后再用图形初始化函数进行初始化
设置, 但Turbo C提供了一种更简单的方法, 即用gdriver= DETECT 语句后再跟
initgraph()函数就行了。采用这种方法后, 上例可改为:
例6.
#include <graphics.h>
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(50, 50, 150, 30, 1);
getch();
closegraph();
return 0;
}
另外, Turbo C提供了退出图形状态的函数closegraph(), 其调用格式为:
void far closegraph(void);
调用该函数后可退出图形状态而进入文本方式(Turbo C 默认方式), 并释放
用于保存图形驱动程序和字体的系统内存。
参考文献:http://blog.csdn.net/ayanyan/archive/2006/05/26/756508.asp