电子科技大学成都学院电子工程系
课程设计报告
课 程 名 称: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 { 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语言程序设计综合实验 设计报告 题目:五子棋 班级;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 #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 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 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 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 。
第二篇:C语言五子棋源代码 设计报告