C语言项目设计报告

电子科技大学成都学院电子工程系

课程设计报告

课 程  名 称:    C语言程序设计能力教程           

      设 计  题 目:         万   年  历                 

          指 导 教师组:        杨      剑      

          学 生  学 号:         1140810429           

学 生  姓 名:         王   玲   琳      

电子工程系制

20##年12月

一、题目要求:

用C语言编写一个万年历系统,具有公历和农历的日期显示,能显示年月日,星期几,具有记事本功能,在某个日期上可以输入纪念日,代办事项等。

  1. 功能要求

(1) 基本要求

试设计一个万年历系统,使之能提供以下基本功能:

1) 能够模拟现实中日历的形式现实公历;

2)第一行显示月份(中英文都可以)

3)下一行显示星期,从周日到周六,中英文都可以

4)下一行开始显示日期从1号开始,并按其是星期几实际情况与上面的星期数垂直对齐

6) 输入公历年月日能够显示农历日期;

7) 信息输入功能:对某一天输入代办事项,纪念日等文字;

8) 信息删除功能:能够删除某日期对应的纪念日等文字;

(2) 创新要求

    达到上述基本要求后,可进行创新设计,如对功能扩展等。

2、需求分析

根据题目设计要求及创新,我们设计了7个菜单选项。

用户可以通过键盘输入1~7分别进入1:年历查询,2:月历查询

3:日历查询,4:农历查询,5:记事本,6:定时关机工具,7:退

出系统。

3、设计概要

1.进入系统时显示菜单界面及当前系统时间

2.年历查询:输入年代时,系统输出改年所有月份的日历并以日历的格式输出。

3.月历查询:输入年代,月份时,系统输出该月所有天数的日历并以日历的格式输出。

4.日历查询:当输入年,月,日时,系统输出该天的日历信息,包括星期,农历,节日。

5.农历查询:用户输入年、月、日。系统输出该天对应的农历信息,包括天干地支,农历。

6.记事本:当输入年、月、日时,系统首先查询该时间是否有记事,如果没有提示是否记事,若记事则用户输入记事内容,系统将该记事内容以文本文档的形式保存。若有记事则显示该记事,并提示是否删除,若用户选择删除,则系统将该时间对应的文本删除。若不删除,则退出系统。

7.定时关机工具:进入该功能,系统提示用户选择:1、关机、2:重启、3取消计划、4:退出。其中关机和重启具有定时功能。

8.菱形: 是否有记事退出系统

                  

 


                 

4、详细设计

1.基本函数设计

1.闰年的判断   2.每一个月天数的确定  3.该天是今年的哪一天      

4今天是本周的第几天  5.星期的确定    6.输出一天的日历信息 

7.格式化生成一个月的日历信息   8.输入参数的检查   9.年历查询

10.节日查询  11.农历查询 12.日历显示 13.系统时间获取  14.定时关机工具

2.登录界面

3.菜单功能的设计

1.年历查询:年历查询,需要显示这年每个月的日历信息并以日历的格式显示出来。首先则需要判断是否为闰年来确定本年的每个月的天数,然后算出每个月每一天为星期几并以日历的格式显示。

2.月历查询:月历查询需要显示改年这个月的日历信息,并以日历的格式输出

3.日历查询:用户输入年、月、日,系统根据输入信息调用基本函数,输出该天的基本日历信息。包括星期,天干地支,农历,节日。

4.农历查询:用户输入年、月、日,系统通过输入信息调用农历查询函数,输出该天的农历信息

5.记事本:用户输入年、月、日,系统根据输入信息自动查询该时间是否有记事。

若没有,则提示用户是否进行记事。若记事则用户输入记事信息,系统对输入信息已文本文档的格式进行保存。若不记事则退出系统。若有记事,系统则直接输出该记事,并提示用户是否删除记事,若删除,则系统将该文本文档删除,否则退

6.定时关机工具:用户输入相应的指令,根据指令执行相应的操作。输入1,则系统提示用户输入定时关机时间。输入2,系统提示用户输入定时重启时间。输入3,系统取消定时关机或重启计划,输入4则退出系统

7.系统垃圾清理工具

 用户通过菜单输入系统垃圾清理的指令,系统开始自动清理系统垃圾

5.源代码

int Leap_year(int year);

int Month_Day(int year,int month);

int Year_Day(int year,int month,int day);

int Week_Day1(int year,int month,int day);

char *Week_Day2(int number);

void Menu1(int year,int month,int day);

void Menu2(int year,int month);

int Menu3(int year,int month,int day);

void Month_Display(int year,int month);

void Lunar_Calendar(int year ,int month,int day);

char *Festival(int month,int day);

//char  *Solar_terms(char Month,char Day);

void Day_Display(int year,int month,int day);

void Shutdown(void );

void RTC(void);

void Rubbish(void);

/******************************************************************************

*   函数名:闰年判断

*   入口参数:year

*   返回参数:闰年返回1 否则返回0

int Leap_year(int year)/*定义变量*/

{

if(year%4==0&&year%100!=0||year%400==0) /*利用函数判断输入年份是闰年还是平年*/

return 1;

else

return 0;

}

/******************************************************************************

*  函数名:月份天数确定

*  入口参数:year,month

*  返回参数:今年该月的天数

*  调用函数:int Leap_year(int year)

int Month_Day(int year,int month)

{

int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*定义数组确定12个月每个月的天数*/

if(Leap_year(year)) /*如果输入年份是闰年*/

a[1]=29;/*二月29天*/

return a[month-1];

}

/******************************************************************************

*  函数名:天数查询->查询该天是今年的第几天

*  入口参数:year,month,day

*  返回参数:该天是今年的第几天

*  调用函数:day1(int year,int month)

int Year_Day(int year,int month,int day)

{

int i,sum=0;

for(i=1;i<month;i++)

{

sum+=Month_Day(year,i);

}

sum+=day;

return sum;

}

/******************************************************************************

*   函数名:天数查询->查询该天是本周的第几天

*   入口参数:year,month,day

*   返回参数:返回该天是本周的第几天

*   调用函数:day2(int year,int month,int day)

int Week_Day1(int year,int month,int day)

{

int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+Year_Day(year,month,day);

number%=7;

return number;

}

/******************************************************************************

*  函数名:星期查询

*  入口参数:number

*  返回参数:星期

char *Week_Day2(int number)

{

switch(number)/*分类一周七天*/

{

case 0:

return "星期日";

case 1:

return "星期一";

case 2:

return "星期二";

case 3:

return "星期三";

case 4:

return "星期四";

case 5:

return "星期五";

case 6:

return "星期六";

default:

return "错误!请您重新输入。";/*不符和上面七种情况的报错提示*/

}

6、实验中所遇到的问题及解决方法

   在本次实验操作过程中,遇到一些语法的错误,结构上的错误,还有算法错误,但是根据读程序时的提醒,做了相应的修改,使得程序能够正常运行。

7.感谢

  非常感谢老师在这学期C语言上机中给予我们的指导和帮助,让我们从实践中更好地,更深刻的理解了这门学科,也掌握到了更多的知识和解决一些实际问题的方法。在一些很困难的问题上通过老师的帮助,避免了不少弯路。再次向老师的帮助表示衷心的感谢!

电子科技大学成都学院

20  届课程设计成绩评定表

 

第二篇:C语言五子棋源代码 设计报告

C语言程序设计综合实验

设计报告

题目:   五子棋

班级;   07电气(1)班

人数:   4

小组成员:

时间: 08.9.19

目录

1 课程设计报告

1.1课题描述

1.2需求分析

1.3概要设计

2源程序代码

3详细设计

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)功能模块

2. 主流程图

 

遇到的一个问题:

图形一闪而过解决方法

因为Win-TC的图形驱动程序EGAVGA.BGI文件安装路径为c:\\Win-TC\\projects

int gdriver=DETECT, gmode;

initgraph(&gdriver, &gmode, "c:\\tc")改为initgraph(&gdriver, &gmode, "c:\\Win-TC\\projects")

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:\\Win-TC\\projects") ;

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:\\Win-TC\\projects");

    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:\\Win-TC\\projects") ;

    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:\\Win-TC\\projects") ;  /*清屏*/

   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,180,"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 默认方式), 并释放

用于保存图形驱动程序和字体的系统内存。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ayanyan/archive/2006/05/26/756508.aspx

相关推荐