一个及其简单的打字游戏

大一期末要交个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;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值