大一期末要交个C语言游戏+答辩,先来个小游戏练练手
一个简易的打字游戏,难得注释写的很全,就放上来了
有错欢迎指出,游戏有爱自取
C
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define MAXN 5//数组的大小
#define WIDTH 40//在[0,WIDTH]范围内生成字母
#define HIGH 20//垂直下降的高度
int grade,tier=1,hp=3;//分数,等级和生命值
int gameover=0;
struct ALPHA{
int x;
int y;
char ch;
int alive=0; //用来记录该元素是否存在,和judge()函数一起理解
}alpha[MAXN];
void HideCursor(void)//隐藏光标
{
CONSOLE_CURSOR_INFO Cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&Cursor_info);
}
void gotoxy(int x,int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos={x,y};
SetConsoleCursorPosition(handle,pos);
}
void init(void)//隐藏指针和初始化随机数
{
HideCursor();
srand((unsigned)time(0));
}
void judge(void)//判断是否需要产生新的字母
{
if(hp==0)//生命为0,游戏结束
{
gotoxy(0,HIGH+4);
printf("gameover\n");
system("pause");
exit(0);
}
int i,count; //count用来记录已经拥有的字母,游戏采取count==tier
for(i=0,count=0;i<MAXN;i++)
if(alpha[i].alive)
count++;
while(count<tier)//保证同时在屏幕上出现的字母数等于难度
{
for(i=0;i<MAXN;i++)
{
if(!alpha[i].alive)
{
alpha[i].x=rand()%WIDTH;
alpha[i].y=-1;
alpha[i].ch=rand()%26+'A';
alpha[i].alive=1;
count++;
break;
}
}
}
if(tier==1&&grade==5)//根据分数增加难度
tier++;
else if(tier==2&&grade==10)
tier++;
else if(tier==3&&grade==15)
tier++;
else if(tier==4&&grade==20)
tier++;
for(i=0;i<MAXN;i++)//如果字母落到底,清除这个字母,生命值减一
if(alpha[i].alive)
if(alpha[i].y==HIGH)
{
hp--;
alpha[i].alive=0;
}
}
void show(void)//实现从上往下落字母的效果
{
int i;
switch(tier)//根据难度指定字母下落的速度
{
case 1:
Sleep(500);
break;
case 2:
Sleep(400);
break;
case 3:
Sleep(300);
break;
case 4:
Sleep(200);
break;
case 5:
Sleep(100);
break;
}
for(i=0;i<MAXN;i++)//打印字母
{
if(alpha[i].alive)
{
if(alpha[i].y!=-1)//要保证gotoxy()的y为有效值
{
gotoxy(alpha[i].x,alpha[i].y);
putchar(' ');
}
alpha[i].y++;
gotoxy(alpha[i].x,alpha[i].y);
putchar(alpha[i].ch);
}
}
gotoxy(0,HIGH);
for(int i=0;i<WIDTH;i++)//打印边界以及统计信息
putchar('-');
printf("\n等级:%d\n",tier);
printf("分数:%d\n",grade);
printf("生命值%d\n",hp);
}
void get_input(void)//读取玩家输入
{
int i;
char input;
if(_kbhit())
{
input=_getch();
input=_toupper(input);
for(i=0;i<MAXN;i++)
if(alpha[i].alive)
if(alpha[i].ch==input)
{
gotoxy(alpha[i].x,alpha[i].y);
putchar(' ');
alpha[i].alive=0;
grade++;
}
}
}
void start(void)
{
init();
while(1)
{
judge();
show();
get_input();
}
}
int main(void)
{
start();
return 0;
}