C语言课程设计的目的 急需一份完整的C语言课程设计实验报告,请大家帮帮忙?
急需一份完整的C语言课程设计实验报告,请大家帮帮忙?
急需一份完整的C语言课程设计实验报告,请大家帮帮忙????
哥哥你太浪漫了,这么难得题!
使用结构数组...短多啦
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include<stdio.h>
struct stuScore
{
char name[20];
int number;
float math;
float p;
};
void main()
{int i;
float sum[5];
stuScore st[5];
printf("请输入5位学生的学号、姓名、数学成绩、计算机成绩n");
for(i=0;i<5;i++)
scanf("%d%s%f%f",&st[i].number,st[i].name,&st[i].math,&st[i].p);
printf("学号t姓名t数学t计算机t总分n");
for(i=0;i<5;i++)
{sum[i]=st[i].math+st[i].p;
printf("%dt%st%6.2ft%6.2ft%6.2fn",st[i].number,st[i].name,st[i].math,st[i].p,sum[i]);
}
}
使用结构变量,没有使用结构数组...恶长...
#include<stdio.h>
struct stuScore
{
char name[20];
int number;
float math;
float p;
};
void main()
{float sum1,sum2,sum3,sum4,sum5;
stuScore st1,st2,st3,st4,st5;
printf("请输入5位学生的学号、姓名、数学成绩、计算机成绩n");
scanf("%d%s%f%f",&st1.number,st1.name,&st1.math,&st1.p);
scanf("%d%s%f%f",&st2.number,st2.name,&st2.math,&st2.p);
scanf("%d%s%f%f",&st3.number,st3.name,&st3.math,&st3.p);
scanf("%d%s%f%f",&st4.number,st4.name,&st4.math,&st4.p);
scanf("%d%s%f%f",&st5.number,st5.name,&st5.math,&st5.p);
sum1=st1.math+st1.p;
sum2=st2.math+st2.p;
sum3=st3.math+st3.p;
sum4=st4.math+st4.p;
sum5=st5.math+st5.p;
printf("学号t姓名t数学t计算机t总分n");
printf("%4dt %st %6.2ft %6.2ft %6.2fn",st1.number,st1.name,st1.math,st1.p,sum1);
printf("%4dt %st %6.2ft %6.2ft %6.2fn",st2.number,st2.name,st2.math,st2.p,sum2);
printf("%4dt %st %6.2ft %6.2ft %6.2fn",st3.number,st3.name,st3.math,st3.p,sum3);
printf("%4dt %st %6.2ft %6.2ft %6.2fn",st4.number,st4.name,st4.math,st4.p,sum4);
printf("%4dt %st %6.2ft %6.2ft %6.2fn",st5.number,st5.name,st5.math,st5.p,sum5);
C语言课程设计报告 急需
在一项计算机软件的开发过程中,一般地说,应该产生十四 种文件。这十四种文件是:
可行性研究报告;
项目开发计划;
软件需求说明书;
数据要求说明书;
概要设计说明书;
详细设计说明书;
数据库设计说明书;
用户手册;
操作手册;
模块开发卷宗;
测试计划;
测试分析报告;
开发进度月报;
项目开发总结报告。
B 项目开发计划 的编写提示
B.1引言
B.1.1编写目的
说明编写这份项目开发计划的目的,并指出预期的读者。
B.1.2背景
说明:
a.待开发的软件系统的名称;
b.本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
C.该软件系统同其他系统或其他机构的基本的相互来往关系。
B.1.3定义
列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
B.1.4参考资料
列出用得着的参考资料,如:
a.本项目的经核准的计划任务书或合同、上级机关的批文;
b.属于本项目的其他已发表的文件;
C.本文件中各处引用的文件、资料,包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
B.2项目概述
B.2.1 工作内容
简要地说明在本项目的开发中须进行的各项主要工作。
B.2.2主要参加人员
扼要说明参加本项目开发工作的主要人员的情况,包括他们的技术水平。
B.2.3产品
B.2.31程序
列出需移交给用户的程序的名称、所用的编程语言及存储程序的媒体形式,并通过引用有关文件, 逐项说明其功能和能力。
B.2.3.2文件
列出需移交给用户的每种文件的名称及内容要点。
B.2.3.3服务
列出需向用户提供的各项服务,如培训安装、维护和运行支持等,应逐项规定开始日期、所提供支持 的级别和服务的期限。
B.2.3.4非移交的产品
说明开发集体应向本单位交出但不必向用户移交的产品(文件甚至某些程序)。
B.2.4验收标准
对于上述这些应交出的产品和服务,逐项说明或引用资料说明验收标准。
B.2.5完成项目的员迟用限
B.2.6本计划的批准者和批准日期
B.3实施计划
B.3.1工作任务的分门与人员分工
对于项目开发中需完成的各项工作,从需求分析、设计、实现、测试直到维护,包括文件的编制、审批、打印、分发工作,用户培训工作,软件安装工作等,按层次进行分解,指明每项任务的负责人和参加人员。
B.3.2 接口人员
说明负责接口工作的人员及他们的职责,包括:
a .负责本项目同用户的接口人员;
b.负责本项目同本单位各管理机构,如合同计划管理部门、财务部门、质量管理部门等的接口人员;
c.负责本项目同各分合同负责单位的接口人员等。
B.3.3进度
对于需求分析、设计、编码实现、测试、移交、培训和安装等工作,给出每项工作任务的预。定开始日期、完成日期及所需资源,规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件(即所谓“里程碑”)。
B.3.4预算
逐项列出本开发项目所需要的劳务(包括人员的数量和时间)以及经费的预算(包括办公费、差旅费、机时费、资料费、通讯设备和专用设备的租金等)和来源。
B.3.5关键问题
逐项列出能够影响整个项目成败的关键问题、技术难点和风险,指出这些问题对项目的影响。
B.4支持条件
说明为支持本项目的开发所需要的各种条件和设施。
B.4.1计算机系统支持
逐项列出开发中和运行时所需的计算机系统支持,包括计算机、外围设备、通讯设备、模拟器、编译 (或 汇编)程序、操作系统、数据管理程序包、数据存储能力和测试支持能力等,逐项给出有关到货日期、 使用时间的要求。
B.4.2需由用户承担的工作
逐项列出需要用户承担的工作和完成期限。包括需由用户提供的条件及提供时间。
B.4.3由外单位提供的条件
逐项列出需要外单位分合同承包者承担的工作和完成的时间,包括需要由外单位提供的条件和提 供的时间。
B.5专题计划要点
说明本项目开发中需制订的各个专题计划(如分合同计划、开发人员培训计划、测试计划、安全保密 计划、质量保证计划、配置管理计划、用户培训计划、系统安装计划等)的要点。
C 软件需求说明书 的编写提示
C.1引言
C.1.1编写目的
说明编写这份软件需求说明书的目的,指出预期的读者。
C.1.2背景
说明:
a.待开发的软件系统的名称;
b.本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
C.该软件系统同其他系统或其他机构的基本的相互来往关系。
C.1.3定义
列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
C.1.4参考资料
列出用得着的参考资料,如:
a.本项目的经核准的计划任务书或合同、上级机关的批文;
b.属于本项目的其他已发表的文件;
c.本文件中各处引用的文件、资料、包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
C.2任务概述
C.2.1目标
叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。|
C.2.2用户的特点
列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件的预期使甩频度。这些是软件设计工作的重要约束
C.2.3假定和约束
列出进行本软件开发工作的假定和约束,例如经费限制、开发期限等。
C.3需求规定
C.3.1对功能的规定
用列表的方式(例如IPO表即输入、处理、输出表的形式),逐项定量和定性地叙述对软件所提出的功能要求,说明输入什么量、经怎样的处理、得到什么输出,说明软件应支持的终端数和应支持的并行操作的用户数。
C.3.2对性能的规定
C.3.2.1精度
说明对该软件的输入、输出数据精度的要求,可能包括传输过程中的精度。
C.3.2.2时间特性要求
说明对于该软件的时间特性要求,如对:
a.响应时间;
b.更新处理时间;
c.数据的转换和传送时间;
d.解题时间; 等的要求。
C.3.2.3灵活性
说明对该软件的灵活性的要求,即当需求发生某些变化时,该软件对这些变化的适应能力,如:
a.操作方式上的变化;
b.运行环境的变化;
c.同其他软件的接口的变化;
d.精度和有效时限的变化;
e.计划的变化或改进。
对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。
C.3.3输人输出要求
解释各输入输出数据类型,并逐项说明其媒体、格式、数值范围、精度等。对软件的数据输出及必须标明的控制输出量进行解释并举例,包括对硬拷贝报告(正常结果输出、状态输出及异常输出)以及图形或显示报告的描述。
C.3.4数据管理能力要求
说明需要管理的文卷和记录的个数、表和文卷的大小规模,要按可预见的增长对数据及其分量的存储要求作出估算。
C.3.5故障处理要求
列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。
C.3.6其他专门要求
如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。
C.4运行环境规定
C.4.1设备
列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能,包括:
a.处理器型号及内存容量;
b.外存容量、联机或脱机、媒体及其存储格式,设备的型号及数量;
c.输入及输出设备的型号和数量,联机或脱机;
d.数据通信设备的型号和数量;
e.功能键及其他专用硬件
C.4.2支持软件
列出支持软件,包括要用到的操作系统、编译(或汇编)程序、测试支持软件等。
C.4.3 接口
说明该软件同其他软件之间的接口、数据通信协议等。
C.4.4控制
说明控制该软件的运行的方法和控制信号,并说明这些控制信号的来源。
E 概要设计说明书 的编写提示
E.1引言
E.1.1编写目的
说明编写这份概要设计说明书的目的,指出预期的读者。
E.1.2背景
说明:
a.待开发软件系统的名称;
b.列出此项目的任务提出者、开发者、用户以及将运行该软件的计算站(中心)。
E.1.3定义
列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
E.1.4参考资料
列出有关的参考文件,如:
a.本项目的经核准的计划任务书或合同,上级机关的批文;
b.属于本项目的其他已发表文件;
c.本文件中各处引用的文件、资料,包括所要用到的软件开发标准。 列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
E.2总体设计
E.2.1需求规定
说明对本系统的主要的输入输出项目、处理的功能性能要求,详细的说明可参见附录C。
E.2.2运行环境
简要地说明对本系统的运行环境(包括硬件环境和支持环境)的规定,详细说明参见附录C。
E.2.3基本设计概念和处理流程
说明本系统的基本设计概念和处理流程,尽量使用图表的形式。
E.2.4结构
用一览表及框图的形式说明本系统的系统元素(各层模块、子程序、公用程序等)的划分,扼要说明每个系统元素的标识符和功能,分层次地给出各元素之间的控制与被控制关系.
一c语言课程设计题目 急需高手帮帮忙
class linklist{
public:
bool deletelen(int i,int len);
bool insert(int i,int x);
private:
listnode* head;
};
class listnode{
listnode(int x){data=x;};
private:
int data;
listnode* next;
friend class linklist;
};
bool deletelen(int i,int len){
listnode* ptr,temp;
ptr=head;
if(head==NULL)return false;
for(int j=1;j<i;j++){
if(ptr->next!=NULL)ptr=ptr->next;
else return false;
}
for(j=1;j<len;j++){
if(ptr->next==NULL)return false;
temp=ptr->next;
ptr->next=ptr->next->next;
delete temp;
return true;
}
}
bool insert(int i,int x){
listnode* ptr,temp;
ptr=head;
if(head==NULL)return false;
for(int j=1;j<i;j++){
if(ptr->next!=NULL)ptr=ptr->next;
else return false;
tmp=ptr->next;
ptr->next=new listnode(x);
ptr->next->next=tmp;
return true;
}
}
C语言课程设计题目!帮帮忙!
10分不管 大学生现在这个时候真的是忙啊 毕业设计用不用找人代做 便宜收费
C语言课程设计报告!
#define N 200
#include <graphics.h>注意这个是绘图函数,只有TC支持,VC没有这个头文件!所以请在TC下使用!
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;
int gamespeed=50000;
struct Food
{
int x;
int y;
int yes;
}food;
struct Snake
{
int x[N];
int y[N];
int node;
int direction;
int life;
}snake;
void Init(void);
void Close(void);
void DrawK(void);
void GameOver(void);
void GamePlay(void);
void PrScore(void);
void main(void)
{
Init();
DrawK();
GamePlay();
Close();
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
cleardevice();
}
void DrawK(void)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
for(i=50;i<=600;i+=10)
{
rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460);
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10);
rectangle(601,i,610,i+10);
}
}
void GamePlay(void)
{
randomize();
food.yes=1;
snake.life=0;
snake.direction=1;
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100;
snake.node=2;
PrScore();
while(1)
{
while(!kbhit())
{
if(food.yes==1)
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;
}
if(food.yes==0)
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)
{
GameOver();
snake.life=1;
}
if(snake.life==1)
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{
setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
snake.node++;
food.yes=1;
score+=10;
PrScore();
}
setcolor(4);
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}
if(snake.life==1)
break;
key=bioskey(0);
if(key==ESC)
break;
else
if(key==UP&&snake.direction!=4)
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}
}
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
void Close(void)
{
getch();
closegraph();
}程序很麻烦,帮你在网上找的,自己看看哈,我也还没学到这个,需要会使用绘制图形函数才行!呵呵!
c语言课程设计报告
我自己写的
大一的C语言课程设计
想要的话QQ:341109970
一共 程序代码,和WORD文档的课程设计,程序的实体,都有 一起传给你~~
想要200分。。。。
而且程序可以直接运行出来 绝对让你满意!
楼下的那位小姐你该从C语言学期
这个是编程中最基本也是最重要的
自己编的,你修改下就是了,
满意请采纳。
#include"stdio.h"
#define SIZE 5
struct stu
{
char name[10];
int no;
int age;
char add[10];
}stu[SIZE];
void readdat();
void writedat();
void change();
main()
{
char k;
printf(" 欢迎进入学生信息管理系统n");
printf("nn 1.学生信息输入系统 ");
printf(" 2.学生信息查询系统n");
printf(" 3.学生信息修改系统nnn");
began:
printf("nn请输入选项:");
scanf("%d",&k);
switch(k)
{
case 1: writedat(); break;
case 2: readdat(); break;
case 3: change(); break;
default: goto began;
}
goto began;
while(1);
}
void writedat()
{
FILE *fp;
char i;
printf("nn请输入学生的姓名、学号、年龄和地址:n");
for(i=0;i<SIZE;i++)
{
printf("输入%d号学生信息:",i+1);
scanf("%s %d %d %s",stu[i].name,&stu[i].no,&stu[i].age,stu[i].add);
}
if((fp=fopen("E:\a.dat","wb"))==NULL)
{
printf("Open Errorn");
return;
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stu[i],sizeof(struct stu),1,fp)!=1)
printf("write errorn");
}
fclose(fp);
}
void readdat()
{
FILE *fp;
int i,k,kk;
jixu:
printf("查询全部请输入0,查询单个请输入1:");
scanf("%d",&k);
if((fp=fopen("E:\a.dat","rb"))==NULL)
{
printf("Read Errorn");
return;
}
if(k==0)
{
printf("编号 姓名 学号 年龄 地址n");
for(i=0;i<SIZE;i++)
{
if(fread(&stu[i],sizeof(struct stu),1,fp)!=1)
{
if(!feof(fp))
printf("write errorn");
return;
}
printf("%-5d%-8s%-8d%-5d%sn",i+1,stu[i].name,stu[i].no,stu[i].age,stu[i].add);
}
}
else if(k==1)
{
printf("请输入学生的编号:");
scanf("%d",&kk);
printf("编号 姓名 学号 年龄 地址n");
if(fread(&stu[kk-1],sizeof(struct stu),1,fp)!=1)
{
if(!feof(fp))
printf("write errorn");
return;
}
printf("%-5d%-8s%-8d%-5d%sn",kk,stu[kk-1].name,stu[kk-1].no,stu[kk-1].age,stu[kk-1].add);
}
else
{
printf("输入错误!");
goto jixu;
}
fclose(fp);
}
void change()
{
FILE *fp;
char i,kk;
while(1)
{
printf("请输入修改信息学生的编号(0退出):");
scanf("%d",&kk);
if(kk==0)
return;
printf("编号 姓名 学号 年龄 地址n");
if((fp=fopen("E:\a.dat","rb"))==NULL)
{
printf("Read Errorn");
return;
}
for(i=0;i<SIZE;i++)
if(fread(&stu[i],sizeof(struct stu),1,fp)!=1)
{
if(!feof(fp))
printf("write errorn");
return;
}
printf("%-5d%-8s%-8d%-5d%sn",kk,stu[kk-1].name,stu[kk-1].no,stu[kk-1].age,stu[kk-1].add);
printf("请输入学生的姓名、学号、年龄和地址:n");
scanf("%s %d %d %s",stu[kk-1].name,&stu[kk-1].no,&stu[kk-1].age,stu[kk-1].add);
if((fp=fopen("E:\a.dat","wb"))==NULL)
{
printf("Open Errorn");
return;
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stu[i],sizeof(struct stu),1,fp)!=1)
printf("write errorn");
}
fclose(fp);
}
}
都OK啊,参考下书籍就可以搞定的了!
都可以加我啊,我Q:527265719
C语言课程设计,大家帮帮尽快啊!急啊!
只能在TC编译的俄罗斯方块
#include "stdio.h"
#include "bios.h"
#include "dos.h"
#include "graphics.h"
#include "string.h"
#include "stdlib.h"
#define true 1
#define false 0
#define BoardWidth 12
#define BoardHeight 23
#define _INNER_HELPER
enum KEYCODES
{
K_ESC =0x011b,
K_UP =0x4800,
K_LEFT =0x4b00,
K_DOWN =0x5000,
K_RIGHT =0x4d00,
K_SPACE =0x3920,
K_P =0x1970
};
typedef struct tagBlock
{
char c[4][4];
int x;
int y;
char color;
char size;
char name;
} Block;
int FrameTime= 1300;
int CellSize= 18;
int BoardLeft= 30;
int BoardTop= 30;
int NBBoardLeft= 300;
int NBBoardTop= 30;
int NBCellSize= 10;
int ScoreBoardLeft= 300;
int ScoreBoardTop=100;
int ScoreBoardWidth=200;
int ScoreBoardHeight=35;
int ScoreColor=LIGHTCYAN;
int InfoLeft=300;
int InfoTop=200;
int InfoColor=YELLOW;
int BorderColor=DARKGRAY;
int BkGndColor=BLACK;
int GameRunning=true;
int TopLine=BoardHeight-1;
int TotalScore=100;
char info_score[20];
char info_help[255];
char info_mon[255];
unsigned char Board[BoardWidth][BoardHeight][2];
char BufferCells[4][4];
Block curBlock;
Block nextBlock;
int GetKeyCode();
int CanMove(int dx,int dy);
int CanRotate();
int RotateBlock(Block *block);
int MoveBlock(Block *block,int dx,int dy);
void DrawBlock(Block *block,int,int,int);
void EraseBlock(Block *block,int,int,int);
void DisplayScore();
void DisplayInfo(char* text);
void GenerateBlock(Block *block);
void NextBlock();
void InitGame();
int PauseGame();
void QuitGame();
int _INNER_HELPER GetKeyCode()
{
int key=0;
if(bioskey(1))
{
key=bioskey(0);
}
return key;
}
void _INNER_HELPER DisplayInfo(char *text)
{
setcolor(BkGndColor);
outtextxy(InfoLeft,InfoTop,info_mon);
strcpy(info_mon,text);
setcolor(InfoColor);
outtextxy(InfoLeft,InfoTop,info_mon);
}
/* create a new block by key number,
* the block anchor to the -left corner of 4*4 cells
*/
void _INNER_HELPER GenerateBlock(Block *block)
{
int key=(random(13)*random(17)+random(1000)+random(3000))%7;
block->size=3;
memset(block->c,0,16);
switch(key)
{
case 0:
block->name='T';
block->color=RED;
block->c[1][0]=1;
block->c[1][1]=1, block->c[2][1]=1;
block->c[1][2]=1;
break;
case 1:
block->name='L';
block->color=YELLOW;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1, block->c[2][2]=1;
break;
case 2:
block->name='J';
block->color=LIGHTGRAY;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1, block->c[0][2]=1;
break;
case 3:
block->name='z';
block->color=CYAN;
block->c[0][0]=1, block->c[1][0]=1;
block->c[1][1]=1, block->c[2][1]=1;
break;
case 4:
block->name='5';
block->color=LIGHTBLUE;
block->c[1][0]=1, block->c[2][0]=1;
block->c[0][1]=1, block->c[1][1]=1;
break;
case 5:
block->name='o';
block->color=BLUE;
block->size=2;
block->c[0][0]=1, block->c[1][0]=1;
block->c[0][1]=1, block->c[1][1]=1;
break;
case 6:
block->name='I';
block->color=GREEN;
block->size=4;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1;
block->c[1][3]=1;
break;
}
}
void NextBlock()
{
curBlock.size=nextBlock.size;
curBlock.color=nextBlock.color;
curBlock.x=(BoardWidth-4)/2;
curBlock.y=-curBlock.size;
memcpy(curBlock.c,nextBlock.c,16);
EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
GenerateBlock(&nextBlock);
nextBlock.x=1,nextBlock.y=0;
DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
}
int _INNER_HELPER RotateCells(char c[4][4],char blockSize)
{
char temp,i,j;
switch(blockSize)
{
case 3:
temp=c[0][0];
c[0][0]=c[2][0], c[2][0]=c[2][2], c[2][2]=c[0][2], c[0][2]=temp;
temp=c[0][1];
c[0][1]=c[1][0], c[1][0]=c[2][1], c[2][1]=c[1][2], c[1][2]=temp;
break;
case 4:
c[1][0]=1-c[1][0], c[1][2]=1-c[1][2], c[1][3]=1-c[1][3];
c[0][1]=1-c[0][1], c[2][1]=1-c[2][1], c[3][1]=1-c[3][1];
break;
}
}
int CanMove(int dx,int dy)
{
int i,j,tempX,tempY;
for(i=0;i<curBlock.size;i++)
{
for(j=0;j<curBlock.size;j++)
{
if(curBlock.c[i][j])
{
tempX = curBlock.x + i + dx;
if(tempX<0 || tempX>(BoardWidth-1)) return false;
tempY = curBlock.y + j + dy;
if(tempY>(BoardHeight-1)) return false;
if(tempY>=0 && Board[tempX][tempY][0]) return false;
}
}
}
return true;
}
int CanRotate()
{
int i,j,tempX,tempY;
memcpy(BufferCells, curBlock.c, 16);
RotateCells(BufferCells,curBlock.size);
for(i=0;i<curBlock.size;i++)
{
for(j=0;j<curBlock.size;j++)
{
if(BufferCells[i][j])
{
tempX=curBlock.x+i;
tempY=curBlock.y+j;
if(tempX<0 || tempX>(BoardWidth-1))
return false;
if(tempY>(BoardHeight-1))
return false;
if(tempY>=0 && Board[tempX][tempY][0])
return false;
}
}
}
return true;
}
void _INNER_HELPER DrawBlock(Block *block,int bdLeft,int bdTop,int cellSize)
{
int i,j;
setfillstyle(SOLID_FILL,block->color);
for(i=0;i<block->size;i++)
{
for(j=0;j<block->size;j++)
{
if(block->c[i][j] && (block->y+j)>=0)
{
floodfill(
bdLeft+cellSize*(i+block->x)+cellSize/2,
bdTop+cellSize*(j+block->y)+cellSize/2,
BorderColor);
}
}
}
}
int RotateBlock(Block *block)
{
char temp,i,j;
int b_suess;
if(block->size==2)
return true;
if(( b_suess=CanRotate()))
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
memcpy(curBlock.c,BufferCells,16);
DrawBlock(block,BoardLeft,BoardTop,CellSize);
}
return b_suess;
}
void _INNER_HELPER EraseBlock(Block *block,int bdLeft,int bdTop,int cellSize)
{
int i,j;
setfillstyle(SOLID_FILL,BkGndColor);
for(i=0;i<block->size;i++)
{
for(j=0;j<block->size;j++)
{
if(block->c[i][j] && (block->y+j>=0))
{
floodfill(
bdLeft+cellSize*(i+block->x)+cellSize/2,
bdTop+cellSize*(j+block->y)+cellSize/2,
BorderColor);
}
}
}
}
/* move by the direction if can, donothing if cannot
* return value: true - suess, false - cannot move toward this direction
*/
int MoveBlock(Block *block,int dx,int dy)
{
int b_canmove=CanMove(dx,dy);
if(b_canmove)
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
curBlock.x+=dx;
curBlock.y+=dy;
DrawBlock(block,BoardLeft,BoardTop,CellSize);
}
return b_canmove;
}
int DropBlock(Block *block)
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
while(CanMove(0,1))
{
curBlock.y++;
}
DrawBlock(block,BoardLeft,BoardTop,CellSize);
return 0;
}
void InitGame()
{
int i,j,gdriver=DETECT,gmode;
struct time sysTime;
memset(Board,0,BoardWidth*BoardHeight*2);
memset(nextBlock.c,0,16);
strcpy(info_help,"P: Pause Game. --by hoodlum1980");
initgraph(&gdriver,&gmode,"");
setcolor(BorderColor);
for(i=0;i<=BoardWidth;i++)
{
line(BoardLeft+i*CellSize, BoardTop, BoardLeft+i*CellSize, BoardTop+ BoardHeight*CellSize);
}
for(i=0;i<=BoardHeight;i++)
{
line(BoardLeft, BoardTop+i*CellSize, BoardLeft+BoardWidth*CellSize, BoardTop+ i*CellSize);
}
rectangle(BoardLeft-CellSize/4, BoardTop-CellSize/4,
BoardLeft+BoardWidth*CellSize+CellSize/4,
BoardTop+BoardHeight*CellSize+CellSize/4);
for(i=0;i<=4;i++)
{
line(NBBoardLeft+i*NBCellSize, NBBoardTop, NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);
line(NBBoardLeft, NBBoardTop+i*NBCellSize, NBBoardLeft+4*NBCellSize, NBBoardTop+ i*NBCellSize);
}
rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,ScoreBoardTop+ScoreBoardHeight);
DisplayScore();
gettime(&sysTime);
srand(sysTime.ti_hour*3600+sysTime.ti_min*60+sysTime.ti_sec);
GenerateBlock(&nextBlock);
NextBlock();
setcolor(DARKGRAY);
outtextxy(InfoLeft,InfoTop+20,"Up -rotate Space-drop");
outtextxy(InfoLeft,InfoTop+35,"Left-left Right-right");
outtextxy(InfoLeft,InfoTop+50,"Esc -exit");
DisplayInfo(info_help);
}
void _INNER_HELPER FillBoardData()
{
int i,j;
for(i=0;i<curBlock.size;i++)
{
for(j=0;j<curBlock.size;j++)
{
if(curBlock.c[i][j] && (curBlock.y+j)>=0)
{
Board[curBlock.x+i][curBlock.y+j][0]=1;
Board[curBlock.x+i][curBlock.y+j][1]=curBlock.color;
}
}
}
}
void _INNER_HELPER PaintBoard()
{
int i,j,fillcolor;
for(j=max((TopLine-4),0);j<BoardHeight;j++)
{
for(i=0;i<BoardWidth;i++)
{
fillcolor=Board[i][j][0]? Board[i][j][1]:BkGndColor;
setfillstyle(SOLID_FILL,fillcolor);
floodfill(BoardLeft+i*CellSize+CellSize/2,BoardTop+j*CellSize+CellSize/2,BorderColor);
}
}
}
void _INNER_HELPER CheckBoard()
{
int i,j,k,score=10,sum=0,y,lines=0;
j=y=BoardHeight-1;
do
{
sum=0;
for(i=0;i< BoardWidth; i++)
{
sum+=Board[i][y][0];
}
y--;
} while(sum>0 && y>0);
do
{
sum=0;
for(i=0;i< BoardWidth; i++)
sum+=Board[i][j][0];
if(sum==BoardWidth)
{
for(k=j; k > y;k--)
{
for(i=0;i<BoardWidth;i++)
{
Board[i][k][0]=Board[i][k-1][0];
Board[i][k][1]=Board[i][k-1][1];
}
}
for(i=0;i<BoardWidth;i++)
{
Board[i][y][0]=0;
Board[i][y][1]=0;
}
y++;
lines++;
TotalScore+=score;
score*=2;
}
else
j--;
} while(sum>0 && j>y && lines<4);
FrameTime=max(1200-100*(TotalScore/200), 400);
TopLine=y;
if(lines==0)
TotalScore++;
}
void _INNER_HELPER DisplayScore()
{
setcolor(BkGndColor);
outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);
setcolor(ScoreColor);
sprintf(info_score,"Score: %d",TotalScore);
outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);
}
void UpdateBoard()
{
FillBoardData();
CheckBoard();
PaintBoard();
DisplayScore();
}
int PauseGame()
{
int key=0;
DisplayInfo("Press P to Start or Resume!");
while(key!=K_P && key!=K_ESC)
{
while(!(key=GetKeyCode())){}
}
DisplayInfo(info_help);
return key;
}
void QuitGame()
{
closegraph();
}
void main()
{
int i,flag=1,j,key=0,tick=0;
InitGame();
if(PauseGame()==K_ESC)
goto GameOver;
while(key!=K_ESC)
{
while(!(key=GetKeyCode()))
{
tick++;
if(tick>=FrameTime)
{
if(!MoveBlock(&curBlock,0,1))
{
UpdateBoard();
NextBlock();
if(!CanMove(0,1))
goto GameOver;
}
tick=0;
}
delay(100);
}
switch(key)
{
case K_LEFT:
MoveBlock(&curBlock,-1,0);
break;
case K_RIGHT:
MoveBlock(&curBlock,1,0);
break;
case K_DOWN:
MoveBlock(&curBlock,0,1);
break;
case K_UP:
RotateBlock(&curBlock);
break;
case K_SPACE:
DropBlock(&curBlock);
break;
case K_P:
PauseGame();
break;
}
}
GameOver:
DisplayInfo("GAME OVER! Press any key to exit!");
getch();
QuitGame();
}
