电子科技大学成都学院电子工程系
课程设计报告
课 程 名 称: 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语言程序设计综合实验
设计报告
题目: 五子棋
班级; 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
。
江阴职业技术学院项目设计报告项目:数字钟的设计与实现专业应用电子技术专业学生姓名**班级09应用电子(2)班学号**指导教师**完…
分类号密级学号Java项目报告学生信息管理系统作者姓名所在系部专业指导教师20xx年06月27日摘要现代社会随着科技的发展如果依然…
电子科技大学成都学院课程设计报告电子科技大学成都学院电子工程系课程设计报告课程名称C语言程序设计能力教程设计题目万年历指导教师组杨…
1装修项目集成管理设计房屋装修所涉及的主要人员包括项目经理和客户分别是负责管理项目的人和会使用项目产品的组织或个人项目主要的干系人…
来宾市兴宾区五山乡止马村等2个村土地整治项目设计工作总结报告编制单位北京国泰天平行土地规划设计有限公司南宁分公司日期二O一二年七月…
XX大学课程设计报告课程设计名称C语言课程设计课程设计题目排班系统院系XX学院专业XX班级XX学号XXXXXXXXXXXXX姓名X…
C语言课程设计报告姓名张林班级计算111班学号11060101241A类基本题1围绕着山顶有10个圆形排列的洞狐狸要吃兔子兔子说可…
C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体…
C语言课程设计报告题目院系组别成员指导老师20xx年月日114目录一课程设计题目3二课程设计要求3三数据结构设计描述31问题描述3…
西安郵電大學C语言课程设计报告书学院名称:计算机学院学生姓名:专业名称:班级:学号:指导教师:时间:20XX年06月03日至20X…
项目管理课程学习和项目设计总结报告一、项目设计个人总结通过一段时间的努力,终于完成了我们小组的创业项目的报告。在这项项目中,我主要…