一个“歼灭敌机”的小游戏,DEVc++通过编译:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define zlx 10 //增量坐标(x)让游戏框不靠边
#define zly 3 //增量坐标(y)让誉清游戏框不靠边
#define W 26 //游戏框的宽度
#define H 24 //游戏框的高度
int jiem[22][22]={0}, wj=10 //界面数组, 我机位置(初值为10)
int speed=4,density=30, score=0,death=0//敌机速度, 敌机密度, 玩家成绩,死亡次数
int m=0,n=0 // m,n是控制敌机的变量
void gtxy (int x, int y) //控制光标位置的函数
{ COORD pos
pos.X = x pos.Y = y
SetConsoleCursorPosition ( GetStdHandle (STD_OUTPUT_HANDLE), pos )
}
void Color(int a) //设定颜色的函数(a应为1-15)
{ SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), a )}
void yinc(int x=1,int y=0) //隐藏光标的函数
{ CONSOLE_CURSOR_INFO gb={x,y} //y设为0即隐藏
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &gb)
}
void csh( ) //初始化函数
{ int i
Color(7)
gtxy(zlx,zly)printf("╔") gtxy(zlx+W-2,zly)printf("╗") //左上角和右上角的框角
gtxy(zlx,zly+H-1)printf("╚")gtxy(zlx+W-2,zly+H-1)printf("╝")//下边两框角
for(i=2i<W-2i+=2) {gtxy(zlx+i,zly) printf("═樱虚搭")} //打印上横框
for(i=2i<W-2i+=2) {gtxy(zlx+i,zly+H-1)printf("═")} //打印下横框
for(i=1i<H-1i++) { gtxy(zlx,zly+i) printf("║")} //打印左竖框
for(i=1i<H-1i++) {gtxy(zlx+W-2,zly+i)printf("║")} //打印右竖框
Color(14)gtxy(19,2)printf("歼灭敌机")Color(10)
gtxy(37,5)printf("设置:Esc ")
gtxy(37,7)printf("发射:↑ ")
gtxy(37,9)printf("控制:← → ")
gtxy(37,11)printf("得分:%d"脊拿,score)
gtxy(37,13)printf("死亡:%d",death)
yinc(1,0)
}
void qcjm( ) //清除界面函数
{int i,j
for(i=0i<H-2i++)
for(j=0j<W-4j++){gtxy(zlx+2+j,zly+1+i)printf(" ")}
}
void feiji( ) //飞机移动函数
{int i,j
for(i=21i>=0i--) //从底行往上是为了避免敌机直接冲出数组
for(j=0j<22j++)
{if(i==21&&jiem[i][j]==3) jiem[i][j]=0 //底行赋值0 以免越界
if(jiem[i][j]==3) jiem[i][j]=0, jiem[i+1][j]=3
}
if(jiem[20][wj]==3&&jiem[21][wj]==1) death++
}
void zidan( ) //子d移动函数
{ int i,j
for(i=0i<22i++)
for(j=0j<22j++)
{if(i==0&&jiem[i][j]==2) jiem[i][j]=0
if(jiem[i][j]==2) { if(jiem[i-1][j]==3) score+=100,printf("\7")
jiem[i][j]=0,jiem[i-1][j]=2}
}
}
void print( ) //输出界面函数
{int i,j
qcjm( )
for(i=0i<22i++)
for(j=0j<22j++)
{ gtxy(12+j,4+i)
if(jiem[i][j]==3) {Color(13)printf("□")}
if(jiem[i][j]==2) {Color(10)printf(".")}
if(jiem[i][j]==1) {Color(10)printf("■")}
}
gtxy(37,11)Color(10)printf("得分:%d",score)
gtxy(37,13)printf("死亡:%d",death)
}
void setting( ) //游戏设置函数
{ qcjm( )
gtxy(12,4)printf("选择敌机速度:")
gtxy(12,5)printf(" 1.快 2.中 3.慢>>")
switch(getche( ))
{case '1': speed=2break
case '2': speed=4break
case '3': speed=5break
default: gtxy(12,6)printf(" 错误!默认值")
}
gtxy(12,7)printf("选择敌机密度:")
gtxy(12,8)printf(" 1.大 2.中 3.小>>")
switch(getche( ))
{case '1': density=20break
case '2': density=30 break
case '3': density=40break
default: gtxy(12,9)printf(" 错误!默认值")
}
for(int i=0i<22i++)
for(int j=0j<22j++) jiem[i][j]=0
jiem[21][wj=10]=1jiem[0][5]=3
gtxy(12,10)printf(" 按任意键保存...")
getch( )
qcjm( )
}
void run( ) //游戏运行函数
{ jiem[21][wj]=1 //值为1代表我机(2则为子d)
jiem[0][5]=3 //值为3代表敌机
SetConsoleTitle("歼灭敌机") //设置窗口标题
while(1)
{ if (kbhit( )) //如有键按下,控制我机左右移动、发射或进行设定
{int key
if((key=getch( ))==224) key=getch( )
switch(key)
{case 75: if(wj>0) jiem[21][wj]=0,jiem[21][--wj]=1break
case 77: if(wj<20) jiem[21][wj]=0,jiem[21][++wj]=1 break
case 72: jiem[20][wj]=2break
case 27: setting( )
}
}
if(++n%density==0) //控制产生敌机的速度
{ n=0srand((unsigned)time(NULL))
jiem[0][rand( )%20+1]=3
}
if(++m%speed==0) { feiji( )m=0} //控制敌机移动速度(相对子d而言)
zidan( ) //子d移动
print( ) //输出界面
Sleep(120) //延时120毫秒
}
}
int main( )
{csh( )
run( )
return 0
}
第一题void func(char *w,char x,int *n){int i, p=0</p><p _extended="true">w[*n]=x</p>备瞎大<p _extended="true">while (x>w[p]) p++</p><p _extended="神旁true">for (i=*ni>pi--) w[i]=w[i-1]</p><p _extended="true">w[p]=x</p><p _extended="true">++ *n</p><p _extended="true">仿竖}呵呵,就完了,晚上就给你答案哈,你多等等~~~恩,完工了,你看看吧:
/伍橘/注:本程序因涉及到引用即“&”,所以得保存为.cpp的后缀名再用c++编译器进行编译
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>//用来得到当前时间
typedef struct student
{
char stuNumber[20]
char classNumber[20]
double score[10]
struct student *next
}stuNode,*stuList
void cre_node(stuList &L)//createNode,创建节点
{
int i
L=(stuList)malloc(sizeof(stuNode))
L->next=NULL
for(i=0i<10i++)
L->明碧score[i]=0
}
void add_node(stuList &L,char stuNumber[],char classNumber[],stuList &p)//增加节点
{
stuList q,prior
prior=L
p=L->next
while(p &&strcmp(classNumber,p->classNumber))
{
prior=p
p=p->next
}
while(p &&!strcmp(classNumber,p->classNumber))
{
prior=p
p=p->next
}
cre_node(q)
strcpy(q->stuNumber,stuNumber)
strcpy(q->classNumber,classNumber)
q->next=prior->next
prior->next=q
p=q
}
int check_list(stuList L,char stuNumber[])
{
stuList p=L->next
while(p &&strcmp(stuNumber,p->stuNumber))
p=p->next
if(p)
{
puts("学号不能重复,请重新输入:")
return 0
}
return 1
}
void cre_cla_info(stuList &L)//create class infomation
{
int i=0,j=0
char classNumber[20],stuNumber[20]
stuList p
puts("开始创建班级信息(输入0结束):")
while(1)
{
printf("\腔槐团n请输入第%d个班级班号:\n",i+1)
fflush(stdin)
gets(classNumber)
if( !strcmp(classNumber,"0"))
break
printf("开始创建%s班的学生信息(输入0结束):\n",classNumber)
j=0
while(1)
{
printf("请输入第%d个学生学号:\n",j+1)
fflush(stdin)
while(1)
{
gets(stuNumber)
if(check_list(L,stuNumber))
break
}
if( !strcmp(stuNumber,"0"))
break
add_node(L,stuNumber,classNumber,p)
j++
}
i++
}
p=L->next
system("cls")
puts("班级信息为:")
while(p)
{
strcpy(classNumber,p->classNumber)
printf("%s班:\n",classNumber)
while(p &&!strcmp(p->classNumber,classNumber))
{
puts(p->stuNumber)
p=p->next
}
}
puts("\n按任意一个键继续:")
getch()
}
int get_stu_info(stuList &L,char stuNumber[],stuList &p)//get student infomation
{
char ch,classNumber[20]
p=L->next
while(p &&strcmp(stuNumber,p->stuNumber))
p=p->next
if( !p)
{
puts("无该学生记录,你要增加该学生记录吗?(是则输入Y或y,不是输入则输入其他字符):")
scanf(" %c",&ch)
if(ch=='Y' || ch=='y')
{
puts("输入该学生所在班级班号:")
fflush(stdin)
gets(classNumber)
add_node(L,stuNumber,classNumber,p)
return 2
}
else
return 0
}
return 1
}
void print_cla_info(stuList &L,char classNumber[])
{
double average
int i=0,flag=0
char ch,stuNumber[20]
stuList p=L->next
while(p)
{
if( !strcmp(p->classNumber,classNumber))
{
flag=1
printf("学生%s作业完成情况为:\n",p->stuNumber)
average=0
for(i=0i<10i++)
{
average+=p->score[i]
printf("第%d次:\t%g\n",i+1,p->score[i])
}
average/=10
printf("\n该学生期末成绩为: %g\n\n",average)
}
p=p->next
}
if( !flag)
{
puts("无该班级信息,要创建一个吗?是输入Y或y,不是则输入其他字符:")
scanf(" %c",&ch)
if(ch=='Y' || ch=='y')
{
puts("输入该班学生学号,输入0结束:")
i=1
while(1)
{
printf("请输入第%d个学生学号:\n",i++)
while(1)
{
fflush(stdin)
gets(stuNumber)
if(check_list(L,stuNumber))
break
}
if( !strcmp(stuNumber,"0"))
break
add_node(L,stuNumber,classNumber,p)
}
}
}
puts("\n按任意一个键继续:")
getch()
}
void print(void)
{
puts("请选择一个 *** 作进行(输入一个数字):\n")
puts("(1)录入某位学生某次作业的分数:\n")
puts("(2)给定学号,显示某位学生的作业完成情况:\n")
puts("(3)给定某个班级的班号,显示该班学生所有学生的作业完成情况:\n")
puts("(4)给定某位学生的学号,修改该学生的作业完成情况:\n")
puts("(5)给定某位学生的学号,删除该学生的作业完成情况:\n")
puts("(6)提供一些统计各类信息的功能:\n")
puts("输入其他数字退出:\n")
}
void count(stuList L)
{
time_t cur_time//time_t在time.h头文件中被定义为long型
double average,m
int n,i,flag1,flag2,sum1,sum2
stuList p
char classNumber[20]
cur_time=time(NULL)//得到当前系统时间
FILE *fp
fp=fopen("d:\\统计.txt","a+")
fputs("\n\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n",fp)
fputs("时间格式:星期,月,日,小时:分:秒,年\n存档时间:",fp)
fputs(ctime(&cur_time),fp)
while(1)
{
system("cls")
puts("统计查询:")
puts("如若显示内容超过窗口所容,你可以到d:\\统计.txt文本中查看:\n")
puts("请选择一个 *** 作进行(输入一个数字):\n")
puts("(1)显示全部班级学生作业完成情况,并显示总人数:\n")
puts("(2)显示所有满足某次作业分数不大于m的学生,并显示学生人数(m值由你输入,且范围为0~100):\n")
puts("(3)显示所有满足某次作业分数不小于m的学生,并显示学生人数(m说明同上)::\n")
puts("(4)显示满足第i次作业分数不大于m的学生,并显示人数(i范围1~10,m范围0~100):\n")
puts("(5)显示满足第i次作业分数不小于m的学生,并显示人数(i范围1~10,m范围0~100):\n")
puts("输入其他数字返回:\n")
scanf("%d",&n)
if(n<1 || n>5)
break
p=L->next
if(n==1)
{
system("cls")
while(p)
{
sum1=0
strcpy(classNumber,p->classNumber)
printf("\n%s班所有学生作业完成情况为:\n",classNumber)
fprintf(fp,"\n%s班所有学生作业完成情况为:\n",classNumber)
while( p &&!strcmp(classNumber,p->classNumber))
{
average=0
printf("\n学生%s:\n",p->stuNumber)
fprintf(fp,"学生%s:\n",p->stuNumber)
for(i=0i<10i++)
{
average+=p->score[i]
printf("第%d次作业分数:\t%g\n",i+1,p->score[i])
fprintf(fp,"第%d次作业分数:\t%g\n",i+1,p->score[i])
}
average/=10
printf("该学生期末成绩为: %g\n",average)
fprintf(fp,"该学生期末成绩为: %g\n",average)
p=p->next
sum1++
}
printf("\n~%s班总人数为: %d~\n",classNumber,sum1)
fprintf(fp,"\n~%s班总人数为: %d~\n",classNumber,sum1)
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)
}
puts("\n按任意一个键继续:")
getch()
}
else if(n==2 || n==3)
{
system("cls")
puts("请输入m值(0~100):")
fputs("\n请输入m值(0~100):",fp)
while(1)
{
scanf("%lf",&m)
fprintf(fp,"%g\n",m)
if(m<0 || m>100)
{
puts("输入有误,请重新输入:")
fputs("输入有误,请重新输入:",fp)
continue
}
break
}
if(n==2)
{
printf("所有满足某次作业分数不大于%g的学生为:\n",m)
fprintf(fp,"所有满足某次作业分数不大于%g的学生为:\n",m)
}
else
{
printf("所有满足某次作业分数不小于%g的学生为:\n",m)
fprintf(fp,"所有满足某次作业分数不小于%g的学生为:\n",m)
}
sum2=0
while(p)
{
strcpy(classNumber,p->classNumber)
printf("\n%s班:\n",classNumber)
fprintf(fp,"\n%s班:\n",classNumber)
flag1=0
sum1=0
while( p &&!strcmp(classNumber,p->classNumber))
{
flag2=0
for(i=0i<10i++)
if(n==2 &&p->score[i] <= m)
{
flag1++
flag2++
if(flag2==1)
{
sum1++
printf("\n学生%s:\n",p->stuNumber)
fprintf(fp,"学生%s:\n",p->stuNumber)
}
printf("第%d次作业分数: %g\n",i+1,p->score[i])
fprintf(fp,"第%d次作业分数: %g\n",i+1,p->score[i])
}
else if(n==3 &&p->score[i] >= m)
{
flag1++
flag2++
if(flag2==1)
{
sum1++
printf("\n学生%s:\n",p->stuNumber)
fprintf(fp,"学生%s:\n",p->stuNumber)
}
printf("第%d次作业分数: %g\n",i+1,p->score[i])
fprintf(fp,"第%d次作业分数: %g\n",i+1,p->score[i])
}
p=p->next
}
if( !flag1)
{
printf("NULL:\n")
fprintf(fp,"%NULL:\n")
}
printf("\n%s班满足条件人数为:%d\n",classNumber,sum1)
fprintf(fp,"\n%s班满足条件人数为:%d\n",classNumber,sum1)
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)
sum2+=sum1
}
printf("\n一共满足条件人数为:%d\n",sum2)
fprintf(fp,"\n一共班满足条件人数为:%d\n",sum2)
puts("\n按任意一个键继续:")
getch()
}
else if(n==4 || n==5)
{
system("cls")
puts("输入i和m的值,用空格键分开(i:1~10,m:0~100):")
fputs("输入i和m的值,用空格键分开(i:1~10,m:0~100):",fp)
while(1)
{
scanf("%d%lf",&i,&m)
if(i<1 || i>10 || m<0 || m>100)
{
puts("输入错误,请重新输入:")
fputs("输入错误,请重新输入:",fp)
continue
}
break
}
if(n==4)
{
printf("所有满足第%d次作业分数不大于%g的学生为:\n",i,m)
fprintf(fp,"所有满足第%d次作业分数不大于%g的学生为:\n",i,m)
}
else
{
printf("所有满足第%d次作业分数不小于%g的学生为:\n",i,m)
fprintf(fp,"所有满足第%d次作业分数不小于%g的学生为:\n",i,m)
}
sum2=0
while(p)
{
strcpy(classNumber,p->classNumber)
printf("\n%s班:\n",classNumber)
fprintf(fp,"\n%s班:\n",classNumber)
flag1=0
sum1=0
while( p && !strcmp(classNumber,p->classNumber))
{
if(n==4 &&p->score[i-1] <= m)
{
flag1++
sum1++
printf("学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])
fprintf(fp,"学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])
}
else if(n==5 &&p->score[i-1] >= m)
{
flag1++
sum1++
printf("学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])
fprintf(fp,"学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])
}
p=p->next
}
if( !flag1)
{
printf("NULL:\n",classNumber)
fprintf(fp,"NULL:\n",classNumber)
}
printf("\n%s班满足条件人数为:%d\n",classNumber,sum1)
fprintf(fp,"\n%s班满足条件人数为:%d\n",classNumber,sum1)
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)
sum2+=sum1
}
printf("\n一共满足条件人数为:%d\n",sum2)
fprintf(fp,"\n一共班满足条件人数为:%d\n",sum2)
puts("\n按任意一个键继续:")
getch()
}
}
fclose(fp)
}
void destroy_list(stuList &L)
{
stuList p
while(p=L->next)
{
L->next=p->next
free(p)
}
free(L)
}
int main()
{
int m,n,i
double average
char stuNumber[20],classNumber[20]
stuList L,p
cre_node(L)
cre_cla_info(L)
while(1)
{
system("cls")
print()
scanf("%d",&n)
if(n<1 || n>6)
break
if(n==1)
{
system("cls")
puts("输入该学生学号:")
fflush(stdin)
gets(stuNumber)
if( !get_stu_info(L,stuNumber,p))
continue
printf("该学生%s所在班级为:%s\n",p->stuNumber,p->classNumber)
puts("只录入该学生某一次的作业请输入1,要一起录入该学生10次作业请输入其他数字:")
scanf("%d",&m)
if(m==1)
{
puts("录入该学生第几次的作业?")
while(1)
{
scanf("%d",&i)
if(i<1 || i>10)
{
puts("范围只能是1~10,请重新输入:")
continue
}
break
}
printf("该学生第%d次作业分数为:%g,你要修改为?:\t",i,p->score[i-1])
scanf("%lf",&p->score[i-1])
puts("本次 *** 作结果:")
printf("%s班%s学生第%d次作业分数为%g:\n",p->classNumber,p->stuNumber,i,p->score[i-1])
puts("\n按任意一个键继续:")
getch()
}
else
for(i=0i<10i++)
{
printf("第%d次作业分数: ",i+1)
scanf("%lf",&p->score[i])
}
}
else if(n==2)
{
system("cls")
puts("输入该学生学号:")
fflush(stdin)
gets(stuNumber)
i=get_stu_info(L,stuNumber,p)
if( !i)
continue
average=0
if(i==1)
{
printf("该学生所在班级班号为:%s,10次作业完成情况为:\n",p->classNumber)
for(i=0i<10i++)
{
average+=p->score[i]
printf("第%d次作业分数: %g\n",i+1,p->score[i])
}
average/=10
printf("\n该学生期末成绩为: %g\n\n",average)
}
puts("\n按任意一个键继续:")
getch()
}
else if(n==3)
{
system("cls")
puts("输入班级的班号:")
fflush(stdin)
gets(classNumber)
print_cla_info(L,classNumber)
}
else if(n==4)
{
system("cls")
puts("输入该学生学号:")
fflush(stdin)
gets(stuNumber)
if( !get_stu_info(L,stuNumber,p))
continue
printf("该学生所在班级班号为:%s,当前作业完成情况为:\n",p->classNumber)
for(i=0i<10i++)
printf("第%d次作业分数:\t%g\n",i+1,p->score[i])
while(1)
{
puts("要修改第几次作业?(输入数字1~10,输入其他数字结束):")
scanf("%d",&m)
if(m<1 || m>10)
break
printf("修改该学生分数%g为:\t",p->score[m-1])
scanf("%lf",&p->score[m-1])
}
}
else if(n==5)
{
system("cls")
puts("输入该学生学号:")
fflush(stdin)
gets(stuNumber)
if( !get_stu_info(L,stuNumber,p))
continue
printf("该学生所在班级班号为:%s,当前作业完成情况为:\n",p->classNumber)
for(i=0i<10i++)
printf("第%d次作业分数:\t%g\n",i+1,p->score[i])
while(1)
{
puts("要删除第几次作业?(输入数字1~10,输入其他数字结束):")
scanf("%d",&m)
if(m<1 || m>10)
break
p->score[m-1]=0
}
}
else
{
system("cls")
count(L)
}
}
destroy_list(L)
puts("谢谢使用!按任意键退出:")
getch()
return 0
}
哪里不懂可追问:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)