第一篇:王爽语言课程设计一代码
assume cs:code data segment;0-83H db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991' ,'1992' db '1993','1994','1995'
;84H-0a7h dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dd 11542,14430,15257,17800 data ends
b segment db 32 dup(0)b ends
stack segment dw 32 dup(0)stack ends
code segment start:
mov ax,data
;init ds,ss
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
;bx--第几组 si--年份,人数,雇员
di--显示位置
mov bx,0
mov si,0
mov di,0
mov cx,21 lp:
push cx
;-------------------------
;年份
mov cx,4;内循环次数
mov si,bx
call show_str
;-------------------------
;-------------------------
;收入
mov si,bx
add si,84
;si指向下一个段
call dtoc
push ax
;
push ds
push si
push di
mov ax,b
mov ds,ax
mov si,0
add di,40
call show_str
pop di
pop si
pop ds
pop ax
;-------------------------
;-------------------------
;收入
mov si,bx
add si,84
add si,84
;pointer to employee 当employee定义为dd时,才能如此寻址,dw时,寻址不正确
call dtoc2
push ax
;pointer to data src
push dx
push si
push di
mov ax,b
mov ds,ax
mov si,0
add di,80
call show_str
pop di
pop si
pop ds
pop ax
jmp mcon
;-------------------------
help:
jmp lp
;-------------------------
;平均
mcon:
mov ax,data
mov ds,ax
mov si,bx
;初始化 num1
add si,84
mov ax,ds:[si]
add si,2
mov dx,ds:[si]
mov si,bx
;初始化 num2
add si,84
add si,84
;当employee定义为dd时,才能如此寻址,dw时,寻址不正确
mov cx,ds:[si]
call divdw
push ds
;存放结果
push si
push di
push cx
push ax
mov ax,b
mov ds,ax
mov si,0
pop ax
mov ds:[si],ax
add si,2
;inc si ?
mov ds:[si],dx
mov si,0
call dtoc
add di,120
;显示结果
call show_str
pop cx
pop di
pop si
pop ds
;-------------------------
add di,160
;inc bx
add bx,4
pop cx
loop help
mov ax,4c00H
int 21H
;主函数结束
;---------------;-dtoc2
-;-params ds,si--src num(num1 16 bit)
-;-return B Segment save num cx--num Length
-;---------------dtoc2:
push ds
push si
push ax
push bx
dc2:
mov bx,0
;save length
mov ax,ds:[si]
;初始化 num1
mov dx,0 dccon2:
mov cx,10
;初始化 num2
call divdw
add cx,30H
push cx
;save extra
inc bx
push ax
or ax,dx
mov cx,ax
pop ax
jcxz dcok2
jmp dccon2
dcok2:
mov cx,bx
mov ax,b
mov ds,ax
mov si,0 dcsav2:
pop ds:[si]
inc si
loop dcsav2
mov cx,bx
;result cx--length
pop bx
pop ax
pop si
pop ds
ret
;---------------;-dtoc
-;-params ds,si--src num(num1 32 bit)
;-params cx--length of str ds,si--src di--destination pos
-;---------------show_str: push es
push ax
push si
push di
push bx
push cx
mov ax,0b800H;显存地址
mov es,ax
mov bl,7
;颜色
sstr:
mov al,ds:[si]
mov es:[di],al
inc di
mov es:[di],bl
inc di
inc si
loop sstr
pop cx
pop bx
pop di
pop si
pop ax
pop es
ret
;---------------;-除法函数
;-余数--cx
-;---------------divdw: push bx
ddw:
push ax
mov ax,dx
mov dx,0
div cx;商在ax中、余数在dx中
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
code ends end start
第二篇:C语言课程设计代码
#include “stdio.h” #include
void main(){ int n=0;struct course *head=NULL;void insert(struct course **head,struct course *cou);void Print(struct course **head,int *n);void Modify(struct course **head,int *n);void Require(struct course **head);void Creat(struct course **head,int *n);void Delete(struct course **head,int *n);void Fun(struct course **head,int *n);
Fun(&head,&n);}
void insert(struct course **head,struct course *cou){ struct course *p0,*p1,*p2;p2=p1=*head;p0=cou;if(*head){
while((p0->semester>p1->semester)&&(p1->next))
{
p2=p1;
p1=p1->next;
}
if(p0->semester
semester)
{
if(*head==p1)*head=p0;
else p2->next=p0;
p0->next=p1;}
else
{
if(p0->semester==p1->semester){ while((p0->cID>p1->cID)&&(p1->next)&&(p0->semester==p1->semester))
{
} if(p0->semester!=p1->semester){
} else {
if(p0->cID<=p1->cID){
if(*head==p1)*head=p0;else p2->next=p0;p2=p1;p1=p1->next;p2->next=p0;p0->next=p1;
p0->next=p1;
}
else
{p1->next=p0;p0->next=NULL;}
}
}
else
{p1->next=p0;p0->next=NULL;}
} } else
{
*head=p0;
p0->next=NULL;} }
void Print(struct course **head,int *n){ struct course *p;p=*head;if(*head){
if(*n==1)printf(“nThis %d record is:n”,*n);
else printf(“nThese %d records are:n”,*n);
printf(“semester cID
name
creditn”);
do
{ printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
p=p->next;
}while(p!=NULL);} else printf(“nList null!n”);}
void Modify(struct course **head,int *n){ struct course *p,*p2;int cID;if(*head){
Print(head,n);while(1){ printf(“nPlease input the cID which you want to modify:”);
scanf(“%d”,&cID);p2=p=*head;while(p->next&&(cID!=p->cID)){
p2=p;
p=p->next;} if(cID==p->cID){
printf(“Please input the new cID(1~60):”);
scanf(“%d”,&p->cID);
while(p->cID<0||p->cID>60)
{
printf(“nError!”);
printf(“nPlease input the new cID(1~60):”);
scanf(“%d”,&p->cID);
}
printf(“Please input the new semester(1~8):”);
scanf(“%d”,&p->semester);while(p->semester<0||p->semester>8)
{
printf(“nError!”);
printf(“nPlease input the new semester(1~8):”);
scanf(“%d”,&p->semester);
}
printf(“Please input the new credit:”);
scanf(“%f”,&p->credit);
printf(“Please input the new name:”);
scanf(“%s”,p->name);
if(p==*head)*head=p->next;
else p2->next=p->next;
insert(head,p);
break;
}
else printf(“%d not been found!n”,cID);
} } else {printf(“nList null!n”);} }
void Require(struct course **head){ struct course *p;float sum=0;int sem,i=0;printf(“nPlease input the semester which is required:”);
scanf(“%d”,&sem);p=*head;while(p){
if(sem==p->semester)
{
i++;if(i==1)printf(“nsemester cID
name
creditn”);printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
sum=sum+p->credit;
}
p=p->next;} printf(“The sum of credit in this term is:%.1fn”,sum);}
void Creat(struct course **head,int *n){ struct course *p1;while(1){
p1=(struct course *)malloc(LEN);
printf(“Please input the cID(1~60):”);
scanf(“%d”,&p1->cID);
while(p1->cID<0||p1->cID>60)
{
printf(“nError!”);
printf(“nPlease input the cID(1~60):”);
scanf(“%d”,&p1->cID);
}
if(p1->cID==0)break;
printf(“Please input the semester(1~8):”);
scanf(“%d”,&p1->semester);
while(p1->semester<0||p1->semester>8)
{
printf(“nError!”);
printf(“nPlease input the semester(1~8):”);scanf(“%d”,&p1->semester);
}
} } printf(“Please input the credit:”);scanf(“%f”,&p1->credit);printf(“Please input the name:”);scanf(“%s”,p1->name);insert(head,p1);*n=*n+1;printf(“nYou can continue until the cID is ”0“!n”);Print(head,n);void Delete(struct course **head,int *n){
struct course *p1,*p2;int cID;Print(head,n);if(*head){ printf(“Please input the cID of the course which you want to delete:”);scanf(“%d”,&cID);p1=*head;
while(cID!=p1->cID&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(cID==p1->cID)
{
if(p1==*head)*head=p1->next;
else p2->next=p1->next;
printf(“Have delete cID:%dn”,cID);
*n=*n-1;
}
else printf(“%d not been found!n”,cID);} }
void Fun(struct course **head,int *n){ char num;
while(1)
{
system(“cls”);
puts(“**************** Main Menu ******************”);
puts(“* 1.Add Records
2.Print Records
*”);
puts(“* 3.Delete Records
4.Modify Records *”);
puts(“* 5.Require Records 6.Exit
*”);
printf(“Please input your choice: ”);
scanf(“%d”,&num);
switch(num)
{
case 1:Creat(head,n);break;
case 2:Print(head,n);break;
case 3:Delete(head,n);break;
case 4:Modify(head,n);break;
case 5:Require(head);break;case 6:exit(0);break;
default: break;
}
printf(“nPress ”Enter“ to continue!”);getchar();getchar();
} }
第三篇:C语言课程设计《高速公路联网收费系统》代码
作者:吴侠志
就读院校:东莞理工学院
#include “stdafx.h” #define NUM 4 #define max_len 8 #include
char *mytime(struct tm *timeptr);
//获取系统时间的函数 void Delay(int n);//延时函数 char *filename(int startkey);void initialize(struct car *cars,int num,FILE *fp);///初始化函数 int refer(struct car *cars,int startkey);//查询
int km[10]={0,0,82,162,288,368,391,514,800,867};
/* 记录各站与首站的里程,单位:km */ double price[6]={0.0,0.6,1.2,1.8,2.4,3.0};
/* 记录各类车的里程价位,单位:元/辆公里 */ char *address[10]={“0”,“湛江”,“茂名”,“阳江”,“开平”,“佛山”,“广州”,“深圳”,“汕头”,“汾水”};char *kind[6]={“特殊车”,“一类车”,“二类车”,“三类车”,“四类车”,“五类车”};
struct car { int card_num;
/* 卡号 */ int car_type;int station_in;char time_in[26];int station_out;char time_out[26];char is_in;double money;int flag;}cars[9*NUM+1];
int num=0;int pass=0;int main(int argc, char* argv[]){ int i,key,choice,j,k,m,size;double pay,money;char enter,pwd[max_len+1],password[max_len+1],ch;FILE *fp;fp=fopen(“标记.txt”,“a+”);fclose(fp);
fp=fopen(“记录.txt”,“a+”);
fclose(fp);
printf(“t欢迎登录广东同三高速公路联网收费系统n”);printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃
1.湛江
2.茂名
3.阳江
┃n”);printf(“┃
4.开平
5.佛山
6.广州
┃n”);printf(“┃
7.深圳
8.汕头
9.汾水关
┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择所在站点,并输入该序号:”);int startkey;while(1){
fflush(stdin);
while(scanf(“%d%c”,&startkey,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(startkey==1 || startkey==2 || startkey==3 || startkey==4 || startkey==5 || startkey==6 || startkey==7 || startkey==8 || startkey==9)
{
break;
}
else
{
printf(“terror!!input again:”);
continue;
} } printf(“初始化中……”);
fp=fopen(“标记.txt”,“a+”);fscanf(fp,“%d”,&num);fclose(fp);
fp=fopen(“password.txt”,“a+”);fscanf(fp,“%d”,&pass);fclose(fp);if(pass==0)
{
} fp=fopen(“password.txt”,“w+”);fprintf(fp,“%d”,88888888);fclose(fp);
fp=fopen(“记录.txt”,“a+”);rewind(fp);initialize(cars,num,fp);
fclose(fp);Delay(5);time_t timer;struct tm *tblock,*a;timer=time(NULL);a=localtime(&timer);while(1){ system(“cls”);fflush(stdin);printf(“所在地:%s站n登录时间:%sn”,address[startkey],mytime(a));printf(“┏━━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃
1.发卡
┃n”);printf(“┃
2.检卡并收费
┃n”);printf(“┃
3.查询
┃n”);printf(“┃
4.注销并退出系统
┃n”);printf(“┃
5.退出系统
┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择,并输入序号:”);while(1){
while(scanf(“%d%c”,&key,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
fp=fopen(“标记.txt”,“r+”);
fscanf(fp,“%d”,&num);
fclose(fp);
fp=fopen(“记录.txt”,“r+”);
rewind(fp);
initialize(cars,num,fp);
fclose(fp);
j=0;
for(i=1;i<=9*NUM;i++){
if(cars[i].is_in=='y' && cars[i].station_in!=startkey && cars[i].station_out==0)
{
j++;
break;
} } k=0;for(m=1;m<=9*NUM;m++){
if(cars[m].is_in=='n' && cars[m].station_in==0 && cars[m].station_out==startkey)
{
k++;
cars[m].flag=k;
} } if((key==1 && k>0)||(key==2 && j>0)|| key==3 || key==4 || key==5)break;else if(key==2 && j==0){
printf(“t目前尚无车辆要离站!!input again:”);
fflush(stdin);
continue;} else if(key==1 && k==0){
printf(“t目前卡片不足!!input again:”);
fflush(stdin);
continue;} else {
printf(“terror!!input again:”);
fflush(stdin);
continue;} } if(key==1){ system(“cls”);timer=time(NULL);tblock=localtime(&timer);srand((unsigned)time(NULL));//用即时的系统时间来做随机数种子.生成随机数
choice=(rand()%k)+1;//随机生成choice,格式rand()%k即要求产生k以内的
for(m=1;m<=9*NUM;m++)
{
if(cars[m].is_in=='n' && cars[m].station_in==0 && cars[m].station_out==startkey && cars[m].flag==choice)
{
break;
}
}
printf(“卡号是:%dn现在时间是:%sn”,m,mytime(tblock));
cars[m].station_in=startkey;
cars[m].station_out=0;
strcpy(cars[m].time_in,mytime(tblock));
strcpy(cars[m].time_out,“无”);
num=1;
fp=fopen(“标记.txt”,“w+”);
fprintf(fp,“%d”,num);
fclose(fp);
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
printf(“┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓n”);
printf(“┃0.特殊车:军警车、紧急车
┃n”);
printf(“┃1.一类车:小轿车、吉普车、的士头人货车、摩托车
┃n”);
printf(“┃2.二类车:面包车、小型人货车、轻型货车、小型客车
┃n”);
printf(“┃3.三类车:中型客车、大型普通客车、中型货车、大型豪华客车┃n”);
printf(“┃4.四类车: 大型货车、大型拖(挂)车、20英尺集装箱车
┃n”);
printf(“┃5.五类车: 重型货车、重型拖(挂)车、40英尺集装箱车
┃n”);
printf(“┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛n”);
printf(“请选择车型,并输入序号:”);
while(1)
{
fflush(stdin);
while(scanf(“%d%c”,&size,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(size==0 || size==1 || size==2 || size==3 || size==4 || size==5)break;
else
{
printf(“terror!!input again:”);
continue;
}
}
cars[m].is_in='y';
cars[m].car_type=size;
fp=fopen(filename(startkey),“a+”);
fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),m,kind[cars[m].car_type],“发卡,放行”);
fclose(fp);
fp=fopen(“标记.txt”,“w+”);
fprintf(fp,“%d”,num);
fclose(fp);
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
printf(“登记完毕,请发卡放行,并按任意键回到主菜单a”);
getche();
}
else if(key==2)
{
system(“cls”);
printf(“请输入卡号(按0返回):”);
while(1)
{
ch='y';
fflush(stdin);
while(scanf(“%d%c”,&choice,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
fp=fopen(“标记.txt”,“r+”);
fscanf(fp,“%d”,&num);
fclose(fp);
fp=fopen(“记录.txt”,“r+”);
rewind(fp);
initialize(cars,num,fp);
fclose(fp);
if(choice<0 || choice>9*NUM)
{
printf(“无此卡号...ntinput again:”);
continue;
}
else if(choice==0)
{
ch='n';
break;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='n')
{
printf(“该卡号尚未发布...ntinput again:”);
continue;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='y' && cars[choice].station_in!=startkey && cars[choice].station_out==0)
{
break;
}
else if(choice>0 && choice<=9*NUM && cars[choice].is_in=='y' && cars[choice].station_in==startkey && cars[choice].station_out==0)
{
printf(“该卡号车于%s从本站进入高速,尚在行...ntinput again:”,cars[choice].time_in);
continue;
}
else
{
printf(“terror!!input again:”);
continue;
}
}
if(ch=='n')continue;
cars[choice].station_out=startkey;
fp=fopen(“记录.txt”,“w+”);
for(i=1;i<=9*NUM;i++)
{
fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out);
}
fclose(fp);
if(cars[choice].car_type==0)
{
printf(“该车于%s在%s进入高速,为特殊车,无需收费n”,cars[choice].time_in,address[cars[choice].station_in]);
}
else
{
i=abs(km[cars[choice].station_in]-km[cars[choice].station_out]);
money=cars[choice].money=i*price[cars[choice].car_type];
printf(“该车于%s在%s进入高速,需缴费%.1lf款:”,cars[choice].time_in,address[cars[choice].station_in],cars[choice].money);
fflush(stdin);
while(1)
{
while(scanf(“%lf%c”,&pay,&enter)==0 || enter!='n')
{
printf(“terror!!input again:”);
fflush(stdin);
}
if(pay>money)
{
printf(“缴付%.1lf元,找零%.1lf元...n”,pay,pay-money);
money=0;
break;
}
else if(pay { money=money-pay; printf(“缴付%.1lf元,需再缴付%.1lf元:”,pay,money); continue; } else { printf(“已缴费完毕,共收取人民币%.1lf元...n”,cars[choice].money); break; } } } timer=time(NULL); tblock=localtime(&timer); printf(“现在时间是:%sn”,mytime(tblock)); strcpy(cars[choice].time_out,mytime(tblock)); 元,请付 fp=fopen(“档案.txt”,“a+”); fprintf(fp,“%5d%12s%15s%30s%10.1lf元n”,choice,kind[cars[choice].car_type],address[cars[choice].station_in],cars[choice].time_in,cars[choice].money); fprintf(fp,“%32s%30snn”,address[cars[choice].station_out],cars[choice].time_out); fclose(fp); cars[choice].money=0; cars[choice].is_in='n'; cars[choice].station_in=0; cars[choice].station_out=startkey; strcpy(cars[choice].time_in,“无”); strcpy(cars[choice].time_out,“无”); fp=fopen(filename(startkey),“a+”); if(cars[choice].car_type==0)fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),choice,kind[cars[choice].car_type],“收卡,放行”); else fprintf(fp,“%30s%8d%12s%20snn”,mytime(tblock),choice,kind[cars[choice].car_type],“缴费,收卡,放行”); fclose(fp); cars[choice].car_type=0; fp=fopen(“记录.txt”,“w+”); for(i=1;i<=9*NUM;i++) { fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out); } fclose(fp); printf(“请收卡放行,并按任意键回到主菜单a”); getche(); } else if(key==3) { system(“cls”); refer(cars,startkey); } else if(key==4) { while(1) { system(“cls”); printf(“input password: ”); for(i=0;;) { fflush(stdin); ch=getch();if(ch=='r' || ch=='n') { break;} else if(ch=='b'){ if(i-->0) { pwd[i]=' '; printf(“b b”); //删除前个字符,光标退一个 } continue;} else if(i==max_len) { continue;} else { pwd[i++]=ch; //接收字符到密码中 printf(“*”);} } pwd[i]=' ';fp=fopen(“password.txt”,“a+”);rewind(fp);fscanf(fp,“%8s”,password);fclose(fp);if(strcmp(pwd,password)==0){ break;} else { printf(“n密码错误或空密码!!(空密码时系统规定为不能注销)n”);printf(“想再输一遍密码吗?(y or n):”);while(1){ fflush(stdin); ch=getche(); if(ch=='y' || ch=='Y') { system(“cls”); break; } else if(ch=='n' || ch=='N') { break; } else { printf(“b b”); continue; } } if(ch=='y' || ch=='Y')continue; else if(ch=='n' || ch=='N')break; } } if(ch=='n' || ch=='N')continue; i=0; for(j=1;j<=9;j++) { fp=fopen(filename(j),“w+”); fclose(fp); } fp=fopen(“记录.txt”,“w+”); fclose(fp); fp=fopen(“标记.txt”,“w+”); fprintf(fp,“%dn”,i); fclose(fp); fp=fopen(“档案.txt”,“w+”); fclose(fp); printf(“n注销成功!!n”); break; } else { fp=fopen(“记录.txt”,“w+”); for(i=1;i { fprintf(fp,“%d %d %c %lf %d %d %st%stn”,cars[i].card_num,cars[i].car_type,cars[i].is_in,cars[i].money,cars[i].station_in,cars[i].station_out,cars[i].time_in,cars[i].time_out); } fclose(fp); fp=fopen(“标记.txt”,“w+”); fprintf(fp,“%dn”,num); fclose(fp); break; } } return 0;} char *mytime(struct tm *timeptr) //获取系统时间的函数 { char wday_name[7][4]={“Sun”,“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat”};static char result[29];sprintf(result,“%d年%d月%d日(%3s)%d:%d:%d ”,1900+timeptr->tm_year,1+timeptr->tm_mon,timeptr->tm_mday,wday_name[timeptr->tm_wday],timeptr->tm_hour,timeptr->tm_min, timeptr->tm_sec);return result;} char *filename(int startkey){ static char name[22];sprintf(name,“车辆处理与记录%d.txt”,startkey);return name;} void Delay(int n)//延时函数 { int i,j,k;for(i=1;i<=n;i++){ for(j=1;j<500;j++) { for(k=1;k<500;k++) { } } } } void initialize(struct car *cars,int num,FILE *fp)///初始化函数 { int i,j;if(num==0){ for(j=1;j<=9;j++) { for(i=NUM*(j-1)+1;i { cars[i].money=0; cars[i].card_num=i; cars[i].is_in='n'; cars[i].car_type=0; cars[i].station_in=0; cars[i].station_out=j; strcpy(cars[i].time_in,“无”); strcpy(cars[i].time_out,“无”); } } } else { for(i=1;i<=9*NUM;i++) { fscanf(fp,“%d %d %c %lf %d %d %st%stn”,&cars[i].card_num,&cars[i].car_type,&cars[i].is_in,&cars[i].money,&cars[i].station_in,&cars[i].station_out,cars[i].time_in,cars[i].time_out); } } } int refer(struct car *cars,int startkey)//查询 { FILE *fp;int i,j,key,num,k;char ch,enter;time_t timer;struct tm *tblock; while(1){ system(“cls”); printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”); printf(“┃ ****资料查询**** ┃n”); printf(“┃ 1.里程价 ┃n”); printf(“┃ 2.汽车类型 ┃n”); printf(“┃ 3.沿线站点间里程 ┃n”); printf(“┃ 4.高速通车情况 ┃n”); printf(“┃ 5.道路交通安全法实施条例 ┃n”);printf(“┃ 6.车辆处理与记录 ┃n”);printf(“┃ 0.回到主菜单 ┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择,并输入序号:”);while(1){ fflush(stdin);while(scanf(“%d%c”,&key,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(key==1 || key==2 || key==3 || key==4 || key==5 || key==6 || key==0){ system(“cls”); switch(key) { case 1: { printf(“t里程价n”); for(i=1;i<6;i++) { printf(“%s:%.1lf元/公里n”,kind[i],price[i]); } printf(“nt按任意键回到查询菜单”); fflush(stdin); getche(); break; } case 2: { printf(“t汽车类型n”); printf(“一类车:小轿车、吉普车、的士头人货车、摩托车n”); printf(“二类车:面包车、小型人货车、轻型货车、小型客车n”); printf(“三类车:中型客车、大型普通客车、中型货车、大型豪华客车n”); printf(“四类车: 大型货车、大型拖(挂)车、20英尺集装箱车n”); printf(“五类车: 重型货车、重型拖(挂)车、40英尺集装箱车n”); printf(“nt按任意键回到查询菜单”); fflush(stdin); getche(); break; } case 3: { printf(“t沿线站点间里程n”);printf(“┏━━━━━━━━━━━━━━━━━━━━┓n”);printf(“┃ 1.湛江 2.茂名 3.阳江 ┃n”);printf(“┃ 4.开平 5.佛山 6.广州 ┃n”);printf(“┃ 7.深圳 8.汕头 9.汾水关 ┃n”);printf(“┗━━━━━━━━━━━━━━━━━━━━┛n”);printf(“请选择起始站,并输入序号:”);fflush(stdin);while(1){ while(scanf(“%d%c”,&i,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(i==1 || i==2 || i==3 || i==4 || i==5 || i==6 || i==7 || i==8 || i==9)break;else { printf(“terror!!input again:”); continue;} } printf(“请选择终点站,并输入序号:”);fflush(stdin);while(1){ while(scanf(“%d%c”,&j,&enter)==0 || enter!='n'){ printf(“terror!!input again:”); fflush(stdin);} if(j==1 || j==2 || j==3 || j==4 || j==5 || j==6 || j==7 || j==8 || j==9)break;else { printf(“terror!!input again:”); continue;} } printf(“tt里程为:%d公里.n”,abs(km[i]-km[j]));printf(“nt按任意键回到查询菜单”);fflush(stdin);getche();break; “); } case 4: { fp=fopen(”标记.txt“,”r+“); fscanf(fp,”%d“,&num); fclose(fp); fp=fopen(”记录.txt“,”r+“); rewind(fp); initialize(cars,num,fp); fclose(fp); j=0; k=0; for(i=1;i<=9*NUM;i++) { if(cars[i].station_in!=0 && cars[i].station_out==0)j++; if(cars[i].station_in!=0 && cars[i].station_out!=0)k++; } timer=time(NULL); tblock=localtime(&timer); printf(”现在时间是:%sn“,mytime(tblock)); printf(”在行车辆:共%d辆.n“,j); if(k>0)printf(”t且有%d辆车正在缴费处缴费,尚未离开.nn“,k); printf(”t以下为此高速公路通车情况.nnnn“); printf(”%5s%12s%15s%30s%10sn“,”卡号“,”车型“,”进/出站点“,”进/出时间“,”金额 fp=fopen(“档案.txt”,“a+”); rewind(fp); fflush(stdin); while(feof(fp)==0) { fflush(stdin); ch=fgetc(fp); putch(ch); } fclose(fp); printf(“t按任意键回到查询菜单”); fflush(stdin); getche(); break;} case 5: { fp=fopen(“广东省道路交通安全法实施条例.txt”,“a+”);printf(“t广东省道路交通安全法实施条例n”); } case 6: { } case 0: rewind(fp);fflush(stdin);while(1){ for(i=0;(i<4000 && feof(fp)==0)||(i>=4000 && ch!='n' && feof(fp)==0);i++){ fflush(stdin); ch=fgetc(fp); putch(ch);} if(feof(fp)==0){ printf(“nnt按任意键翻到下一页”); getche(); system(“cls”); continue;} else break;} fclose(fp);printf(“t按任意键回到查询菜单”);fflush(stdin);getche();break; printf(“%30s%8s%12s%20sn”,“时间”,“卡号”,“车型”,“处理情况”);fp=fopen(filename(startkey),“a+”);rewind(fp);fflush(stdin);while(feof(fp)==0){ fflush(stdin);ch=fgetc(fp);putch(ch);} fclose(fp);printf(“t按任意键回到查询菜单”);fflush(stdin);getche();break; } } } { return 0; break; } } } else { printf(“terror!!input again:”);continue;} if(key==1 || key==2 || key==3 || key==4 || key==5 || key==6)break; C++语言课程设计一迷你高尔夫 一、实验内容 玩家通过按下键盘上的上下左右方向键控制球的移动,使其最终到达出口则游戏通关。 要求如下: 1、游戏分成3关,第一关、第二关、第三关界面图如下: 第一关 第二关 第三关 2、启动游戏进入第一关,胜利后进入第二关,如果第三关通关,则游戏重新回到第一关。 3、游戏玩法是通关控制键盘上的上下左右方向键控制球的运动,单击方向键,则球获得一个向该方向直线运动的速度。如果球遇到方块,则球停止运动,如果遇到黑洞,则游戏结束,重新开始该游戏,遇到出口则通关。 4、球静止状态下会有箭头指示球可以运动的方向,运动状态下则箭头消失。如果球运动出世界边界,则游戏结束,重新回到该游戏。 二、实验指南 实验一 开始实验 【实验任务】 步骤一、打开FunCode,创建一个的C++语言项目; 步骤二、导入GolfGame场景。 【实验思路】 按实验指导完成。 【实验指导】 1、打开FunCode,点击“项目”菜单,选择“创建C++工程” 注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。 2、点击菜单“项目”中的“导入地图模块”,如图一。跳出一个对话框,选中“GolfGame”模板,点击“导入到工程”按钮,如图二。 图 一 图 二 3、导入成功后的,界面如下图所示: 地图不仅包括界面设计,还包括该游戏可能要用到的其他精灵。添加到“场景”中的精灵,都已经取好名称,并根据程序要求设置好中心点、链接点等,学生只需要直接编程就可以。 实验二 游戏关卡初始化 【实验内容】 步骤一、关卡地图初始化 步骤二、清除上一关卡数据 步骤三、根据当前关卡,选择关卡数据 【实验思路】 游戏开始的时候首先要清除上一关的游戏数据,即将上一关创建的精灵从地图中删掉。 将游戏地图分成12*12的方格界面,游戏总共分成三关,因此我们需要用三个二维数组m_iLevelData1[GRID_COUNT][GRID_COUNT] m_iLevelData2[GRID_COUNT][GRID_COUNT] m_iLevelData3[GRID_COUNT][GRID_COUNT] (其中GRID_COUNT的值为12) 来存放这三关的数据即可。二维数组中0表示该位置不创建精灵,否则根据不同的值创建不同精灵,RIGID_BLOCK(值为1)表示创建一个方块精灵,BLACK_HOLE(值为2)表示创建一个黑洞精灵,GOLF_EXIT(值为3)表示创建一个出口精灵。每次把代表该关卡的二维数组的数据拷贝到存储当前关卡m_iGridData的二维数组中。 【实验指导】 1、进入LessonX.h的CGameMain类中,添加以下成员变量的声明: static const float m_fGridStartX ; // 第一块方块的起始坐标 = -(GRID_COUNT * g_fGridSize * 0.5 g_fGridSize / 2) static const float m_fGridStartY ; static const float m_fGridSize; // 每块的大小,包括球、出口等都是此大小 int m_iRigidBlockCount; // 本关卡创建的阻挡物方块数量 int m_iBlackHoleCount ; // 本关卡创建的黑洞数量 int m_iGolfExitCount; // 本关卡创建的出口的数量 int m_iCurLevel; // 当前关卡 int m_iMoveState ; // 控制球的移动状态:0当前静止,可以移动,1、2、3、4:代表上下左右4个方向移动中,按键无响应 int m_iGridData[GRID_COUNT][GRID_COUNT]; // 二维数组,存储当 前关卡N*N的矩阵方块信息 static const int m_iLevelData1[GRID_COUNT][GRID_COUNT] ; static const int m_iLevelData2[GRID_COUNT][GRID_COUNT] ; static const int m_iLevelData3[GRID_COUNT][GRID_COUNT] ; vector m_vRigidBlock; //阻挡物精灵向量数组 vector m_vBlackHole; //黑洞精灵向量数组 vector m_vGolfExit; //出口精灵向量数组 int m_iControlStartX; //控制球的初始X坐标,根据关卡数据自行指定 int m_iControlStartY; //球的初始Y坐标 2、进入LessonX.h中在头文件声明的后面添加下面的宏定义代码: #define GRID_COUNT // N * N的矩阵方块,一个N的大小 #define MAX_LEVEL // 最大关卡数量。如果要增加关卡,请先修改此值 #define RIGID_BLOCK // 以下3个分别为方块阻挡物、黑洞、出口的值 #define BLACK_HOLE #define GOLF_EXIT33、进入LessonX.cpp中添加上面的成员变量的初始化: 1) 在构造函数中把m_iGameState的值由0改为1: m_iGameState = 1; 2) 在构造函数中添加下面代码: m_iRigidBlockCount = 0; // 本关卡创建的阻挡物方块数量 m_iBlackHoleCount = 0; // 本关卡创建的黑洞数量 m_iGolfExitCount = 0; m_iCurLevel = 1; m_iControlStartX = 0; //球的初始X坐标 m_iControlStartY = 0; //球的初始Y坐标 3) 对于const类型的成员变量,我们需要在函数外面单独进行初始化,在文件最后面添加如下代码: const float CGameMain::m_fGridStartX =-27.5f; const float CGameMain::m_fGridStartY =-27.5f; const float CGameMain::m_fGridSize =5.f; const int CGameMain::m_iLevelData1[GRID_COUNT][GRID_COUNT] = { {0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0,0,0},{0,0,0,RIGID_BLOCK,0,0,0,0,RIGID_BLOCK,0,0,0},{0,0,0,RIGID_BLOCK,0,0,0,0,RIGID_BLOCK,0,0,0},{0,0,0,RIGID_BLOCK,0,0,0,0,BLACK_HOLE,0,0,0},{0,0,0,0,0,0,0,GOLF_EXIT,RIGID_BLOCK,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0} }; const int CGameMain::m_iLevelData2[GRID_COUNT][GRID_COUNT]={ {0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,RIGID_BLOCK,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,GOLF_EXIT,RIGID_BLOCK,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,0,0},{0,RIGID_BLOCK,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,RIGID_BLOCK,0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0,RIGID_BLOCK,0} }; const int CGameMain::m_iLevelData3[GRID_COUNT][GRID_COUNT]={ {0,0,0,0,0,0,0,0,RIGID_BLOCK,RIGID_BLOCK,0,0},{0,0,RIGID_BLOCK,RIGID_BLOCK,RIGID_BLOCK,0,0,0,0,0,0,RIGID_BLOCK},{RIGID_BLOCK,0,0,0,0,0,0,0,0,0,0,RIGID_BLOCK},{0,0,0,0,0,0,0,0,0,0,0,RIGID_BLOCK},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,GOLF_EXIT,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,RIGID_BLOCK,RIGID_BLOCK,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,RIGID_BLOCK,0},{0,0,0,RIGID_BLOCK,0,0,0,0,0,0,RIGID_BLOCK,0},{0,0,0,0,BLACK_HOLE,RIGID_BLOCK,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0} }; 二维数组中0表示该位置不创建精灵,否则根据不同的值创建不同精灵,RIGID_BLOCK(值为1)表示创建一个方块精灵,BLACK_HOLE(值为2)表示创建一个黑洞精灵,GOLF_EXIT(值为3)表示创建一个出口精灵。 4) 进入GameInit函数里面,将球的运动状态初始化为静止,添加下面代码: m_iMoveState=0; 4、游戏初始化的时候,首先我们需要将前边添加的精灵全部删除掉,因此需要自定义的创建清除所有精灵函数ClearAllSprite()来实现这个功能。 1) 进入LessonX.h文件的CGameMain类中添加该函数的声明: void ClearAllSprite(); 2) 在LessonX.cpp最后面添加该函数的定义: void CGameMain:: ClearAllSprite() { } 3) 再使用3个循环,分别将上一关卡创建的3种精灵删除掉。在上边定义的函数中添加如下代码: int iLoop = 0; for(iLoop = 0; iLoop m_vRigidBlock.size(); iLoop++) { m_vRigidBlock[iLoop]->DeleteSprite(); } for(iLoop = 0; iLoop m_vBlackHole.size(); iLoop++) { m_vBlackHole[iLoop]->DeleteSprite(); } for(iLoop = 0; iLoop m_vGolfExit.size(); iLoop++) { m_vGolfExit[iLoop]->DeleteSprite(); } 其中m_vRigidBlock、m_vBlackHole、m_vGolfExit是存储三种精灵的向量数组,每一个循环都遍历一遍向量数组并调用数组中每个精灵的DeleteSprite函数即可。 m_vRigidBlock.size()、m_vBlackHole.size()、m_vGolfExit.size()表示每种精灵的总数。 4) 最后在GameInit()中添加调用此函数的代码: ClearAllSprite(); 5、在GameInit()中,我们也需要对关卡进行选择初始化。因此我们需要自定义一个初始化关卡函数InitLevel ()来实现这个功能。 1) 进入LessonX.h文件的CGameMain类中添加该函数的声明: void InitLevel(); 2) 在LessonX.cpp最后面添加该函数的定义: void CGameMain:: InitLevel() { } 3) 初始化关卡,要根据当前关卡,选择关卡的数据,即将代表关卡的二维数组中的数据拷贝到m_iGridData中,同时设置控制球在每个数组中的起始位置。首先把需要的数据初始化为0,代码如下: // 总数置0,重新创建 m_iRigidBlockCount = 0; m_iBlackHoleCount = 0; m_iGolfExitCount = 0; 4) 选择关卡我们使用了switch-case结构,程序通过判断switch中的参数进入到不同的case中去,每个case就是一种情况的实现。代码如下: // 根据当前关卡,选择关卡数据 switch(m_iCurLevel) { case 2: { m_iControlStartX = 5; m_iControlStartY = 9; memcpy(m_iGridData,m_iLevelData2,sizeof(int) * GRID_COUNT * GRID_COUNT); } break; case 3: { m_iControlStartX = 3; m_iControlStartY = 6; memcpy(m_iGridData,m_iLevelData3,sizeof(int) * GRID_COUNT * GRID_COUNT); } break; // Level1 或者g_iCurLevel错误 case 1: default: { m_iControlStartX = 5; m_iControlStartY = 6; memcpy(m_iGridData,m_iLevelData1,sizeof(int) * GRID_COUNT * GRID_COUNT); } break; }; memcpy函数作用是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。因为二维数组在内存中的存放方式是连续的,因此我们将源地址拷贝给m_iGridData的起始地址之后,系统后自动根据m_iGridData的下标来找到正确的值。 5) 最后在GameInit()中添加调用此函数的代码: InitLevel(); 至此,本实验结束。 实验三 初始化游戏精灵 【实验内容】 步骤一、创建精灵 步骤二、初始化精灵位置 【实验思路】 遍历二维数组m_iGridData,根据数组值生成对应的精灵实例:值为0的时候不用创建,需要创建的精灵名字前缀为(按照宏定义的1,2,3顺序):RigidBlock,BlackHole,GolfExit。每创建一种精灵,将其总数加1 :m_iRigidBlockCount,m_iBlackHoleCount,m_iGolfExitCount。 【实验指导】 1、进入LessonX.h,CGameMain类中添加下面成员变量的声明: CSprite* m_pControlBall; //控制球精灵 CSprite* m_pGolfArrow; //指示箭头精灵 在LessonX.cpp中CGameMain类在构造函数里面添加上面成员变量的初始化: m_pControlBall = new CSprite(“ControlBall“); m_pGolfArrow = new CSprite(“GolfArrow“); 2、创建精灵之后需要将精灵移到特定位置,因此我们需要定义一个自定义的函数MoveSpriteToBlock来实现这个功能。 6) 进入LessonX.h中添加该函数的声明: void MoveSpriteToBlock(CSprite* tmpSprite,const int iIndexX,const int iIndexY); 7) 在LessonX.cpp最后面添加该函数的定义: void CGameMain::MoveSpriteToBlock(CSprite* tmpSprite,const int iIndexX,const int iIndexY) { } 8) 传入该函数的是精灵实体以及x,y坐标参数。再通过SetSpritePosition函数设置精灵位置,在该函数里面添加如下代码: float fPosX = m_fGridStartX + iIndexX * m_fGridSize; float fPosY = m_fGridStartY + iIndexY * m_fGridSize; tmpSprite->SetSpritePosition(fPosX,fPosY); 3、这里定义一个函数CreateAllSprite()来创建控制球、方块精灵、出口精灵和黑洞精灵。然后在函数内部添加代码创建精灵。 原理是通过两个for循环来,判断m_iGridData的值,如果为0,则不创建,如果为RIGID_BLOCK则创建一个方块精灵,为 BLACK_HOLE则创建一个黑洞精灵,为GOLF_EXIT则创建一个出口精灵。由于我们预先在地图中摆放了三个模板精灵,因此只需要使用CloneSprite函数即可创建新的精灵。然后再调用MoveSpriteToBlock函数将精灵移动到指定位置。最后每创建一个实现精灵,将它添加到相应的精灵向量数组中。 1) 进入LessonX.h文件的CGameMain类中添加该函数的声明: void CreateAllSprite(); 2) 在LessonX.cpp最后面添加该函数的定义: void CGameMain:: CreateAllSprite() { } 3) 在定义汗的函数中添加变量声明: int iLoopX = 0,iLoopY = 0; CSprite* tmpSprite; char *szName = NULL; 4) 实现两个for循环: for(iLoopY = 0; iLoopY GRID_COUNT; iLoopY++) { for(int iLoopX = 0; iLoopX GRID_COUNT; iLoopX++) { } } 5) 在里面的循环添加判断代码: 如果是0,则不创建精灵,continue表示跳出本次循环,继续下一个循环。 if(0 == m_iGridData[iLoopY][iLoopX]) continue; 如果是方块,则创建方块精灵: if(RIGID_BLOCK == m_iGridData[iLoopY][iLoopX]) { szName = CSystem::MakeSpriteName(“RigidBlock“,m_iRigidBlockCount); tmpSprite=new CSprite(szName); tmpSprite->CloneSprite(“RigidBlockTemplate“); MoveSpriteToBlock(tmpSprite,iLoopX,iLoopY); m_vRigidBlock.push_back(tmpSprite); m_iRigidBlockCount++; } 如果是黑洞,则创建黑洞精灵: else if(BLACK_HOLE == m_iGridData[iLoopY][iLoopX]) { szName = CSystem::MakeSpriteName(“BlackHole“,m_iBlackHoleCount); tmpSprite=new CSprite(szName); tmpSprite->CloneSprite(“BlackHoleTemplate“); MoveSpriteToBlock(tmpSprite,iLoopX,iLoopY); m_vBlackHole.push_back(tmpSprite); m_iBlackHoleCount++; } 如果是出口,则创建出口精灵: else if(GOLF_EXIT == m_iGridData[iLoopY][iLoopX]) { szName = CSystem::MakeSpriteName(“GolfExit“,m_iGolfExitCount); tmpSprite=new CSprite(szName); tmpSprite->CloneSprite(“GolfExitTemplate“); MoveSpriteToBlock(tmpSprite,iLoopX,iLoopY); m_vGolfExit.push_back(tmpSprite); m_iGolfExitCount++; } 6) 将控制球和指示箭头摆放到初始位置,此时球静止,因此指示箭头可见。在上面的两个循环后面添加下面的代码: m_pControlBall->SetSpriteLinearVelocity(0.f,0.f); MoveSpriteToBlock(m_pControlBall,m_iControlStartX,m_iControlStartY); MoveSpriteToBlock(m_pGolfArrow,m_iControlStartX,m_iControlStartY); m_pGolfArrow->SetSpriteVisible(1); 7) 最后在GameInit()中调用此函数: CreateAllSprite(); 至此,本实验结束。 实验四 移动球 【实验内容】 步骤一、响应键盘按键按下消息 步骤二、球精灵坐标转换为二维格子数组索引 步骤三、判断移动方向,使球获取速度 【实验思路】 首先响应系统的按键消息函数,然后获取精灵坐标,并将其转换为二维格子中的坐标,判断其旁边的格子是否是方块,如果不是则给球一个移动的速度。 【实验指导】 1、进入LessonX.h中,添加我们自定义的键盘消息处理函数OnKeyDown的声明: void OnKeyDown(const int iKey,const int iAltPress,const int iShiftPress,const int iCtrlPress); 2、在LessonX.cpp中添加该函数的定义: void CGameMain::OnKeyDown(const int iKey,const int iAltPress,const int iShiftPress,const int iCtrlPress) { } 3、首先判断游戏状态,只有在游戏中已经可以移动状态才响应按键,在上面函数中添加下面的代码: if(2 != m_iGameState || 0 != m_iMoveState) return; 4、获取控制球精灵坐标转换到二维格子数组索引,这里我们需要定义两个函数SpritePosXToIndexX和SpritePosXToIndexY分别处理精灵坐标转换为二维格子的X索引和Y索引: 1) 进入LessonX.h中添加上面两个函数的声明: int SpritePosXToIndexX(const float fPosX); int SpritePosYToIndexY(const float fPosY); 2) 进入LessonX.cpp中添加SpritePosXToIndexX的定义: int CGameMain:: SpritePosXToIndexX (const float fPosX) { } 3) 首先得到左右边界的坐标值。m_fGridStartX是在方块的中心,所以需要减去半个方块的宽度才是左边边界。在SpritePosXToIndexX函数定义中添加下面的代码: const float fLeftSide = m_fGridStartX m_fGridSize / 2.f; const float fRightSide = fLeftSide + m_fGridSize * GRID_COUNT; 4) 最后需要判断坐标是否出了左右边界,如果没有则返回X索引值。在上面的函数里面添加下面的判断代码: if(fPosX fLeftSide || fPosX fRightSide) return -1; int iIndexX = (int)((fPosX fLeftSide) / m_fGridSize); return iIndexX; 5) 在LessonX.cpp中添加SpritePosYToIndexY函数的定义: int CGameMain::SpritePosYToIndexY(const float fPosY) { } 6) 首先获取上下边界坐标值。m_fGridStartY是在方块的中心,所以需要减去半个方块的宽度才是上边边界。在上面的函数定义中添加下面的代码: const float fTopSide = m_fGridStartY m_fGridSize / 2.f; const float fBottomSide = fTopSide + m_fGridSize * GRID_COUNT; 7) 最后判断是否超过了上下边界,没有则返回Y索引值: if(fPosY fTopSide || fPosY fBottomSide) return -1; int iIndexY = (int)((fPosY fTopSide) / m_fGridSize); return iIndexY; 5、有了上面的两个函数,我们就可以将控制球精灵坐标转换到二维格子数组索引,并判断坐标是否超出边界,在OnKeyDown函数中添加下面的代码: float fPosX = m_pControlBall->GetSpritePositionX(); float fPosY = m_pControlBall->GetSpritePositionY(); int iIndexX = SpritePosXToIndexX(fPosX); int iIndexY = SpritePosYToIndexY(fPosY); if(iIndexX 0 || iIndexX >= GRID_COUNT || iIndexY 0 || iIndexY >= GRID_COUNT) return; 6、根据上下左右方向键,先判断控制球旁边是否是方块,如果是方块则不能移动。不是方块,则给予控制球一个速度。使用iIndexX,iIndexY的时候,注意要判断是否是边缘的索引,如果不判断就进行加1减1,访问数组会造成下标溢出。即如果要判断左边是否是方块阻挡,则索引值为 IndexX 。此时必须先判断iIndexX大于0,才能减一。如果iIndexX为0,代表直接可以移动。 1) 如果是按下向上方向键: if(KEY_UP == iKey) { if(iIndexY 0 && RIGID_BLOCK == m_iGridData[iIndexY 1][iIndexX]) return; // 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 m_iMoveState = 1; m_pControlBall->SetSpriteLinearVelocityY(-30.f); m_pGolfArrow->SetSpriteVisible(0); } 2) 如果是按下向下方向键: else if(KEY_DOWN == iKey) { if(iIndexY GRID_COUNT && RIGID_BLOCK == m_iGridData[iIndexY + 1][iIndexX]) return; // 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 m_iMoveState = 2; m_pControlBall->SetSpriteLinearVelocityY(30.f); m_pGolfArrow->SetSpriteVisible(0); } 3) 如果是按下向左方向键: else if(KEY_LEFT == iKey) { if(iIndexX 0 && RIGID_BLOCK == m_iGridData[iIndexY][iIndexX 1]) return; // 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 m_iMoveState = 3; m_pControlBall->SetSpriteLinearVelocityX(-30.f); m_pGolfArrow->SetSpriteVisible(0); } 4) 如果是按下向右方向键: else if(KEY_RIGHT == iKey) { if(iIndexX GRID_COUNT && RIGID_BLOCK == m_iGridData[iIndexY][iIndexX + 1]) return; // 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 m_iMoveState = 4; m_pControlBall->SetSpriteLinearVelocityX(30.f); m_pGolfArrow->SetSpriteVisible(0); } 7、最后在Main.cpp中的OnKeyDown函数里面添加我们的自定义函数的调用: g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress); 至此,本实验结束。 实验五球运动情况的处理 【实验内容】 步骤一、获得球所在边缘格子信息 步骤二、不同格子分情况处理 【实验思路】 获取球精灵的当前坐标并将其转换为二维格子的坐标,判断在运动中球边缘的情况,如果已经出了边界则不需要再判断,否则如果是方块则球停靠、是黑洞则重新开始关卡、是出口则通关。 【实验指导】 1、进入LessonX.cpp中的GameRun函数中,移动状态为移动中,时刻监测控制球的移动情况,根据移动方向的下一个方块,进行对应的处理。添加下面的if判断: if(0 != m_iMoveState) { } 2、先将控制球精灵坐标转换到二维格子数组索引,如果控制球已经出了边界,所以不需要再判断。在上面的判断里面添加下面的代码: float fPosX = m_pControlBall->GetSpritePositionX(); float fPosY = m_pControlBall->GetSpritePositionY(); int iIndexX = SpritePosXToIndexX(fPosX); int iIndexY = SpritePosYToIndexY(fPosY); // 控制球已经出了边界,所以不需要再判断 if(iIndexX 0 || iIndexX >= GRID_COUNT || iIndexY 0 || iIndexY >= GRID_COUNT) return; 3、根据当前方向,获得控制球边缘所在的格子信息(球在坐标是在中心点,所以加上球的大小的一半)。总共有4中方向,即上下左右,分别用1、2、3、4来表示,添加下面的代码: float fNextPosX = fPosX; float fNextPosY = fPosY; // if(1 == m_iMoveState) { fNextPosY -= m_fGridSize * 0.5f; } else if(2 == m_iMoveState) { fNextPosY += m_fGridSize * 0.5f; } else if(3 == m_iMoveState) { fNextPosX -= m_fGridSize * 0.5f; } else if(4 == m_iMoveState) { fNextPosX += m_fGridSize * 0.5f; } 4、将上面得到的坐标再转换为二维格子的坐标,并判断是否越出边界,添加下面的代码: int iNextIndexX = SpritePosXToIndexX(fNextPosX); int iNextIndexY = SpritePosYToIndexY(fNextPosY); // 该边缘已经出了边界,不需要往下判断 if(iNextIndexX 0 || iNextIndexX >= GRID_COUNT || iNextIndexY 0 || iNextIndexY >= GRID_COUNT) return; 5、根据球边缘当前所在的格子的信息,进行不同的处理:是方块则球停靠、是黑洞则重新开始关卡、是出口则通关: 1) 是方块: if(RIGID_BLOCK == m_iGridData[iNextIndexY][iNextIndexX]) { // 清零移动状态 m_iMoveState = 0; // 速度清零,显示指示箭头 m_pControlBall->SetSpriteLinearVelocity(0.f,0.f); m_pGolfArrow->SetSpriteVisible(1); // 把球和指示箭头设置在本方块的中心 MoveSpriteToBlock(m_pControlBall,iIndexX,iIndexY); MoveSpriteToBlock(m_pGolfArrow,iIndexX,iIndexY); } 2) 是黑洞: else if(BLACK_HOLE == m_iGridData[iNextIndexY][iNextIndexX]) { // 将游戏状态设置为1,重新开始关卡 m_iGameState = 1; } 3) 是出口: else if(GOLF_EXIT == m_iGridData[iNextIndexY][iNextIndexX]) { // 将游戏状态设置为1,开始新关卡 m_iGameState = 1; // 往下一关卡,如果已经是最大值,则返回第一关 m_iCurLevel++; if(m_iCurLevel MAX_LEVEL) m_iCurLevel = 1; } 至此,本实验结束。 实验六球出边界处理 【实验内容】 步骤、控制球出边界,则游戏重新开始 【实验思路】 此部分比较简单,只要通过系统判断球精灵是否越过世界边界,得到数据之后在我们的自定义函数里面处理即可。 【实验指导】 1、进入LessonX.h中添加我们的自定义处理函数OnSpriteColWorldLimit的声明: void OnSpriteColWorldLimit(const char *szName,const int iColSide); 2、进入LessonX.cpp中添加该函数的定义: void CGameMain::OnSpriteColWorldLimit(const char *szName,const int iColSide) { } 3、在上面的函数定义中,我们只要知道系统的OnSpriteColWorldLimit函数中返回的szName是否是球精灵的名称,如果是的话则本局游戏结束,重新开始游戏。在上面的定义里面添加下面的代码: // 只处理控制的球 if(stricmp(szName,m_pControlBall->GetName()) != 0) return; // 将游戏状态设置为1,重新开始关卡 m_iGameState = 1; 4、进入Main.cpp文件,在OnSpriteColWorldLimit函数里面添加我们自定义的函数的调用,填入下面一行代码: g_GameMain.OnSpriteColWorldLimit(szName,iColSide); 5、打开Funcode,点击地图中的球精灵,在右侧的“编辑”->“世界边界限制”中,选择限制模式为NULL,这样系统就会以我们自定义的函数处理球越过边界的事件了。 至此,本实验结束。 《穷人》续写 谷硐小学六(1)班王爽 自从桑娜把邻居西蒙的两个孩子抱回家后,日子就更难熬了。为了让家里的每个人都吃得饱,渔夫每天起早贪黑,没日没夜的打鱼,桑娜又要照顾孩子,又要打扫屋子,很是辛苦。这天,很晚了,渔夫还没有回家,桑娜担心极了,“轰”门开了,渔夫满头大汗,气喘吁吁。“怎么了”桑娜问,“我被鲨鱼袭击了,那些可怕的恶魔袭击了我,船破了,网了丢了,不过上帝保佑我,我没死。”渔夫激动地说道。“那怎么办?你不能去打鱼了,孩子们怎么办?”“还好,我还有两桶鱼、凑合吃吧。”桑娜和渔夫的对话吵醒了,他们最大最懂事的孩子问:“怎么了,爸爸妈妈,是不是吃的不够?没关系,我少吃一点就行了,不能饿坏了两个小弟弟,我们总能熬过去的,对吧。””“对!”桑娜和渔夫抱住了孩子…… 第二天渔夫就修好了船,向其它渔夫家借了网,又继续出海了,他脑子里只有一句话:我们总能熬过去的。多么强大的一句话呀,它支撑着渔夫一家,让他们一直不放弃。 许多年后,桑娜和渔夫的七个孩子都过得很好,桑娜和渔夫早已白发苍苍,他们对视着说:我们总算熬过来了。第四篇:C++语言课程设计一迷你高尔夫
第五篇:王爽穷人续写