C语言五子棋源代码 - 课程设计报告

时间:2024.4.7

 

                 

          Beijing Institute of Petrochemical Technology

计算机程序设计基础(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

更多相关推荐:
五子棋-课程设计报告

五子棋-课程设计报告单位分院(系)专业学号学生姓名指导教师完成日期20xx年05月日摘要五子棋的历史:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手…

五子棋游戏 课程设计报告(含源代码可以运行)

五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩家下子.11.5盘面分析填写棋型表.21.6对方下子.21.7胜负判断.2第二章…

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

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

20xx年C语言五子棋课程设计报告

本科控制软件设计课程设计题目五子棋学院计信院专业自动化年级学号姓名谯平同组人张健李益指导教师黄仁杰20xx年9月6日1目录1设计简介32设计模块3小组分工4流程图5设计过程6调试过程7分析与总结8源程序4445...

c++五子棋课程设计报告

福建农林大学计算机与信息学院课程设计报告课程名称课程设计题目姓名系专业年级学号指导教师职称面向对象程序设计课程设计五子棋计算机软件工程年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定2目录1设计目...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

基于java程序的五子棋游戏设计 开题报告

陕西科技大学镐京学院毕业设计论文任务书系专业班级学生题目基于JAVA程序的五子棋游戏设计毕业设计论文从20xx年3月20日起到20xx年6月25日课题的意义及培养目标课题意义随着社会经济的迅速发展人们生活水平有...

C语言课程设计五子棋源代码_+设计报告

C语言程序设计综合实验设计报告题目班级人数小组成员时间目录1课程设计报告11课题描述12需求分析13概要设计2源程序代码3详细设计1课题设计报告11课题分析游戏介绍在一个1818的方格中下棋两个玩家根据键盘上的...

格式参考--算法设计与分析课程设计报告

课程设计报告课题名称专业班学号20xx0010姓名指导教师20xx年1月10日算法导论课程设计任务书一课题五子棋问题连珠五子棋是有两个人在一盘棋上进行对抗的竞技运动在对局开始时先由用户选择哪方先开局先开局一方将...

20xx级C++课程设计任务书及报告格式_modify

C面向对象课程设计任务书一课程设计目的与要求1课程设计目的面向对象程序设计作为一门软件设计的课程具有极强的实践性必须使学生具备灵活应用理论知识的能力及面向对象程序设计技能所以在C面向对象程序设计课程学习完成后安...

java课程设计报告五子棋

计算机网络技术专业专业代码590102动态网站基础程序设计课程设计班级网站1101班学号20xx274920xx317020xx039420xx483920xx264620xx264720xx361920xx2...

五子棋课程设计报告(33篇)