实训报告

三子棋游戏设计

综合实训技术报告

2010 年12月28日

概要

刚开始设计三子棋这个游戏前,我们先上网玩三子棋游戏,然后交流心得,小组讨论出大概方案,再罗列出我们需要解决的问题,比如界面之间怎么转换,棋子和光标怎么移动,怎么设置移动范围,怎么落子,怎么判断输赢,后期美工方面又要怎么加入声音,动画等等,因此分配好个人任务之后我们选择去图图书馆或者上网搜查相关资料,此后编写对应的相关程序。最后,在我们团结合作之后我们的三子棋游戏就新鲜出炉了。

                                                 

目录

前言

第一章   概述 ………………………………………………………….4

1.1  实训要求 …………………………………………………………4

1.2  实训任务 …………………………………………………………4

1.3  程序功能介绍 ……………………………………………………4

第二章  概要设计 ………………………………………………………5

第三章     详细设计 ………………………………………………….6

3.1欢迎界面设计  …………………………………………………….6

3.2 棋盘设计  ………………………………………………………….6

3.3下子设计…………………………………………………………….7

3.4结束设计…………………………………………………………….8

第四章结论   …………………………………………………………….10

致谢…………………………………………………………………………11

参考文献      ……………………………………………………………11

附录       ……………………………………………………………….12

                  

前言

   三子棋是一种益智小游戏,玩起来非常简单,但是要我们自己设计制作成一个很独具特色的游戏,这的确是一项很有挑战性的任务。短短两周内我们团队完成了这款游戏,不过从美观度来讲,它和上市的游戏相差甚远,还有许多值得改进和补充的地方。不过我们相信,在以后的学习以及我们团队的不断努力之后,我们可以将这款游戏完善的更加完美。

这份技术报告主要介绍了我们团队的设计项目,方案,设计细节,希望你们会满意。

三子棋游戏主要由我们梦想团队彭猛,尉瑞强,韩永福,邵琦凯,赵妹五个人一起制作完成。-

由于编者能力有限,报告中疏漏错误之处在所难免,敬请体谅。

第一章  概述

1.1 实训要求

三子棋游戏就是在一个棋盘上通过两人对弈的形式,依次在棋盘上放置两种着色的棋子,哪一个先让三个棋子形成一条直线(包括横向、纵向、主、辅对角线4个方向)即为获胜。

完成实训要求,进一步加深、巩固学生所学专业课程的基本理论知识,理联系实际进一步培养学生综合分析问题和解决问题的能力。掌握运用编程语言独立地编写,充分发挥广大同学的潜力,使他们通过本次软件专题训练得到全面的锻炼。熟悉和了解TC开发的环境,掌握结构化程序设计的方法。

1.2实训任务

(1)、分析题目,构造出程序的基本思路(算法设计)。画出程序设计结构框图。

(2)、根据程序结构框图和题目分析结果(采用算法),构造程序所用各项数据,各种信息及他们之间的联系。

(3)、在程序框架确定之后,根据算法设计出所用各个模块之间的调用关系。

(4)、程序设计。

(5)、将程序编译成可执行文件。

1.3程序功能介绍

1、 白、黑双方进行的对弈;

2、白方(黑方)落子后在屏幕上会有光标显示;

3、通过方向键控制位置,按几下棋子方向相就方向移几个位置,如果该位置已有棋子则该位置不能落子,继续选择位置,确定后按空格键落子;

4、每落一子判断胜负,有一方胜则程序结束;

5、中途可通过按esc键提前退出程序。

第二章   概要设计

程序框架

         

第三章  详细设计

3.1  界面设计

      设计欢迎界面我们主要运用了画图函数,画图函数调用的子函数代码如下:

void  welcome ( )

{

         int  i,j;

         initgr ( );

         setbkcolor (0);

         ……

       }

3.2  界面的设计

      设计棋盘界面我们也是主要运用了画图函数,下面是我们画棋盘的代码:

      setviewport(50,50,700, 550,1);  /*设置窗口函数*/

      for(i=220;i<460;i=i+60)

      {

        for(j=100;j<340;j=j+60)

          rectangle(i,j,i+60,j+60);

}

       

 3.3下子设计 

   设计下子我们也是主要运用调用子函数,采用不断用黑白绿覆来实现的,下面是我们十字覆盖代码:

if(zuobiao[xi][yi]==1)

            { temp=WHITE;}

                    if(zuobiao[xi][yi]==2)

             {temp=BLACK; }

              

                   setcolor(temp);

           line(x,y-3,x,y+3);

           line(x-3,y,x+3,y);

           y=y+60;

                   yi=yi+1;

           setcolor(GREEN);

           line(x,y-3,x,y+3);

           line(x-3,y,x+3,y);

                 }

3.4 结束设计

设计结束是我们分别用了两个子函数,一个判断胜负,

一个是结束界面。

  判断胜负的子函数的程序代码:

int ifwin()/*判断输赢*/

{

 int i=0;

 int num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10||yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi+i])

 num=num+1;

 }

 if(xi-i>=1||yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi-i])

 num=num+1;

 }

 }

 if(num==3){

 over();

 ifover=0;

 return;

 }

 num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi])

 num=num+1;

 }

 if(xi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0;return;

 }

 num=1;

 for(i=1;i<10;i++){

 if(yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi][yi+i])

 num=num+1;

 }

 if(yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi][yi-i])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0; return;

 }

 num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10||yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi-i])

 num=num+1;

 }

 if(xi-i>=1||yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi+i])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0; return;

 }

}

void main(){

 int i,j;

 welcome();

 while(1){

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

 for(j=0;j<10;j++){

 zuobiao[i][j]=0;

 }

 }

结束界面主要用的是输出文本函数,下面是子函数的主要代码:

setcolor(RED);

 if(who==1)

 {

 outtextxy( 100,100 ," Black is the best player!");

      }

 else

{ outtextxy(100,100  , " White is the best player!"); }

第四章  结论

实验体会

这次实训不仅锻炼了我们C语言编程能力,而且还让我们体会到了团队意识,这就是所谓的“没有完美的个人,只有完美的团队”。在编程过程中,我们遇到很多问题,但通过上网查询资料,团队成员讨论,最终问题一一解决。通过这次实训让我感触最深的就是团队,进取和更加完美。

       

致谢:

我们小组能完成三子棋设计,特别感谢XXX,XXX老师在实训课上精心指导,感谢李虹老师平时的谆谆教诲。

             

       

参考文献

1.任志宏,程超 《C语言经典范例50讲》 北京希望电子出版社 2004

2.李虹《C语言程序设计》南京大学出版社 2010

3.百度搜索(游戏精英者编的程序)。

附录

#include  <graphics.h>    /*画图函数*/

#include  <conio.h>      /*屏幕绘图操作函数*/

#include  <stdio.h>     /*输入输出函数*/

#define   KEY_UP 0x48    /*定义上*/

#define   KEY_LEFT 0x4B    /*定义左*/

#define   KEY_RIGHT 0x4D   /*定义右*/

#define   KEY_DOWN 0x50   /*定义下*/

#define   XIAZI  32      /*定义空格键下子*/

int  x=310,y=250;     /*棋子初始位置*/

int  who=2;

int  zuobiao[10][10];

int  xi=5,yi=5;

int  ifover=1;

char player1[20],player2[20];

void initgr(void)

{

   int gd=DETECT, gm=0;

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

}

void welcome()    /*初始界面*/

{

 int i,j;

  initgr ( );

  setbkcolor(0);

  circle(310,180,15);

  circle(340,210,15);

  circle(370,240,15);

  circle(310,210,15);

  circle(340,240,15);

  circle(370,270,15);

  setfillstyle(1,WHITE);

  floodfill(310,210,15);

 setfillstyle(SOLID_FILL,WHITE);

 floodfill(340,240,15);

  setfillstyle(SOLID_FILL,WHITE);

 floodfill(370,270,15);

  circle(310,240,15);

  circle(340,270,15);

  circle(370,300,15);

 circle(20,460,15);

  setfillstyle(SOLID_FILL,WHITE);

 floodfill(20,460,15);

  circle(50,420,15);

  circle(100,360,15);

  setfillstyle(SOLID_FILL,WHITE);

  floodfill(100,360,15);

  circle(160,300,15);

  circle(200,350,15);

  setfillstyle(SOLID_FILL,WHITE);

  floodfill(200,350,15);

  circle(230,380,15);

  circle(280,420,15);

  setfillstyle(SOLID_FILL,WHITE);

  floodfill(280,420,15);

  circle(340,460,15);

  circle(400,430,15);

  setfillstyle(SOLID_FILL,WHITE);

  floodfill(400,430,15);

  circle(480,410,15);

  circle(550,445,15);

  setfillstyle(SOLID_FILL,WHITE);

  floodfill(550,445,15);

  circle(610,463,15);

  settextstyle(4,0,6);

  outtextxy(150,55," Dream Exor");

  line (150,110,470,110);

  line(150,111,470,111);

  line(150,112,470,112);

  settextstyle(1,0,2);

  outtextxy(20,20,"Welcome To Exor World");

 getch();

}

void qipan()/*棋盘界面*/

{

  int i,j;

 cleardevice();

  setcolor(LIGHTGRAY);

  setbkcolor(0);

  setviewport(50,50,700, 550,1);/*设置窗口函数*/

  for(i=220;i<460;i=i+60)

  {

     for(j=100;j<340;j=j+60)

         rectangle(i,j,i+60,j+60);

 rectangle(199,76,480,363);

  rectangle(198,77,481,362);

  rectangle(197,78,482,361);

  rectangle(196,79,483,360);

  circle(251,64,10);

  circle(428,376,10);

  ellipse(215,55,0,360,10,5);

  arc(212,63,135,225,10);

  arc(219,63,-45,45,10);

  arc(215,60,228,313,15);

  ellipse(463,372,0,360,10,5);

  arc(460,380,135,225,10);

  arc(467,380,-45,45,10);

  arc(463,376,230,313,15);

}

}

void xiazi()

{

int temp=BLACK;

switch(getch())

      {

          case  27:/*ESC代码*/

        exit(0);

             break;

          case   KEY_DOWN:

           if(y!=310){

                    if(zuobiao[xi][yi]==1)

            { temp=WHITE;}

                    if(zuobiao[xi][yi]==2)

             {temp=BLACK; }

                   setcolor(temp);

           line(x,y-3,x,y+3);

           line(x-3,y,x+3,y);

           y=y+60;

                   yi=yi+1;

           setcolor(GREEN);

           line(x,y-3,x,y+3);

           line(x-3,y,x+3,y);

                 }

  break;

          case   KEY_UP:

           if(y!=130){

                 if(zuobiao[xi][yi]==1)

            { temp=WHITE;}

                    if(zuobiao[xi][yi]==2)

             {temp=BLACK; }

setcolor(temp);

        line(x,y-3,x,y+3);

        line(x-3,y,x+3,y);

        y=y-60;

                yi=yi-1;

        setcolor(GREEN);

        line(x,y-3,x,y+3);

        line(x-3,y,x+3,y);

                }

 break;

          case   KEY_LEFT:

        if(x!=250){

                  if(zuobiao[xi][yi]==1)

            { temp=WHITE;}

                    if(zuobiao[xi][yi]==2)

             {temp=BLACK; }

                setcolor(temp);

        line(x,y-3,x,y+3);

        line(x-3,y,x+3,y);

        x=x-60;

                xi=xi-1;

                setcolor(GREEN);

        line(x,y-3,x,y+3);

        line(x-3,y,x+3,y);

                }

break;

 case KEY_RIGHT:

 if(x!=430){

 if(zuobiao[xi][yi]==1)

 { temp=WHITE;}

 if(zuobiao[xi][yi]==2)

 {temp=BLACK; }

 setcolor(temp);

 line(x,y-3,x,y+3);

 line(x-3,y,x+3,y);

 x=x+60;

 xi=xi+1;

 setcolor(GREEN);

 line(x,y-3,x,y+3);

 line(x-3,y,x+3,y);

 }

break;

 case XIAZI:

 if(zuobiao[xi][yi]==0)

 {

 if(who==1)

 {

 who=who+1;

 setcolor(WHITE);

 circle(x,y,15);

 setfillstyle(1,WHITE);

 floodfill(x,y,WHITE);

 zuobiao[xi][yi]=1;

 ifwin();

 break;

 }

 if(who==2){

 who=who-1;

 setcolor(15);

 circle(x,y,15);

 setfillstyle(1,0);

 floodfill(x,y,WHITE);

 zuobiao[xi][yi]=2;

 ifwin();

 break;

 }

 }

 else

 break;

}

}

void over()

{

 cleardevice();

 setcolor(RED);

 if(who==1)

 {

 outtextxy( 100,100 ," Black is the best player!");

      }

 else

{ outtextxy(100,100  , " White is the best player!"); }

 moveto(150,200);

 settextstyle(0,0,6);

 outtext("gameover");

getch();

}

int ifwin(){

 int i=0;

 int num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10||yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi+i])

 num=num+1;

 }

 if(xi-i>=1||yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi-i])

 num=num+1;

 }

 }

 if(num==3){

 over();

 ifover=0;

 return;

 }

 num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi])

 num=num+1;

 }

 if(xi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0;return;

 }

num=1;

 for(i=1;i<10;i++){

 if(yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi][yi+i])

 num=num+1;

 }

 if(yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi][yi-i])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0; return;

 }

 num=1;

 for(i=1;i<10;i++){

 if(xi+i<=10||yi-i>=1){

 if(zuobiao[xi][yi]==zuobiao[xi+i][yi-i])

 num=num+1;

 }

 if(xi-i>=1||yi+i<=10){

 if(zuobiao[xi][yi]==zuobiao[xi-i][yi+i])

 num=num+1;

 }

 }

 if(num==3){

 over();ifover=0; return;

 }

}

void main(){

 int i,j;

welcome();

 while(1){

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

 for(j=0;j<10;j++){

 zuobiao[i][j]=0;

 }

 }

 ifover=1;

 clrscr();

 qipan();

moveto(x,y);

 do{

if(who==2);

 else;

xiazi();

}while(ifover);

 }

}

_

相关推荐