通过C语言编程一个小游戏(乐趣无边)
首先附上源代码,这个是大一C语言程序设计基础的大作业,所有代码为手打,部分链表内容参考了网上的程序
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 60
#define HEIGHT 20
enum direction
{
LEFT,RIGHT,UP,DOWN
};
struct structFood
{
int x;
int y;
};
struct structNode
{
int x;
int y;
struct structNode *pNext;
};
struct structSnake
{
int length;
enum direction dir;
};
struct structFood *pFood;
struct structSnake *pSnake;
struct structNode *pNode,*pTail;
int speech=250;
double score=0;
double lastscore=0;
char level='F';
double maxeat=0;
int smark=0;
int stop=0;
int counttime=0;
int countfood=0;
time_t start,end;
void hideCursor(void);
void gotoXY(int x,int y);
void initSnake(void);
void addNode(int x,int y);
void initFood(void);
void homePage(void);
void keybordHit(void);
void move(void);
void draw(void);
void eatFood(void);
void addTail(void);
void showresult(void);
void record(void);
void getlastscoreandlevel(void);
int main(void)
{
start =time(NULL);
homePage();
while(stop==0)
{
keybordHit();
move();
draw();
Sleep(speech);
}
return 0;
}
void hideCursor(void)
{
CONSOLE_CURSOR_INFO cursorInfo={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo);
}
void gotoXY(int x,int y)
{
COORD pos;
pos.X=x-1;
pos.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void addNode(int x,int y)
{
struct structNode *newnode=(struct structNode*)malloc(sizeof(struct structNode));
struct structNode *p=pNode;
newnode->pNext=pNode;
newnode->x=x;
newnode->y=y;
pNode=newnode;
if(x<2||x>=WIDTH||y<2||y>=HEIGHT)
{
stop=1;
gotoXY(21,21);
printf("撞墙,游戏结束,按任意键退出!");
getch();
free(pNode);
free(pSnake);
showresult();
exit(0);
}
while(p!=NULL)
{
if(p->pNext!=NULL)
{
if((p->x==x)&&(p->y==y))
{
stop=1;
gotoXY(21,21);
printf("撞到自身,游戏结束,按任意键退出!");
getch();
free(pNode);
free(pSnake);
showresult();
exit(0);
}
}
p=p->pNext;
}
}
void initSnake(void)
{
int i;
pSnake=(struct structSnake *)malloc(sizeof(struct structSnake));
pFood=(struct structFood *)malloc(sizeof(struct structFood));
pSnake->length=5;
pSnake->dir=RIGHT;
for(i=2;i<=pSnake->length+2;i++)
addNode(i,2);
}
void homePage(void)
{
hideCursor();
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("x\t\t\t\t\t\t\t x\n");
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
gotoXY(5,13);
printf("按任意键开始游戏!按W、A、S、D控制方向");
getch();
initSnake();
initFood();
gotoXY(5,13);
printf(" ");
}
void keybordHit(void)
{
char ch;
if(kbhit())
{
ch=getch();
switch(ch)
{
case 'W':
case 'w':
{
if(pSnake->dir==DOWN)
break;
else
pSnake->dir=UP;
}break;
case 'A':
case 'a':
{
if(pSnake->dir==RIGHT)
break;
else
pSnake->dir=LEFT;
}break;
case 'S':
case 's':
{
if(pSnake->dir==UP)
break;
else
pSnake->dir=DOWN;
}break;
case 'D':
case 'd':
{
if(pSnake->dir==LEFT)
break;
else
pSnake->dir=RIGHT;
}break;
case 'O':
case 'o':
{
if(speech>=110)
speech=speech-10;
}break;
case 'P':
case 'p':
{
if(speech<=490)
speech=speech+10;
}break;
case 27:
{
gotoXY(25,22);
printf("游戏结束");
showresult();
exit(0);
}
case ' ':
{
gotoXY(25,22);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoXY(25,22);
printf(" ");
}break;
default:break;
}
}
}
void initFood(void)
{
struct structNode *p=pNode;
int mark=1;
srand((unsigned)time(NULL));
while(1)
{
pFood->x=rand()%(WIDTH-2)+2;
pFood->y=rand()%(HEIGHT-2)+2;
if(pFood->x==1||pFood->x==2||pFood->x==3||pFood->y==1||pFood->y==2||pFood->y==3)
mark=0;
if(pFood->x==WIDTH-1||pFood->x==WIDTH-2||pFood->x==WIDTH-3||pFood->y==HEIGHT-1||pFood->y==HEIGHT-2||pFood->y==HEIGHT-3)
mark=0;
while(p!=NULL)
{
if((pFood->x==p->x)&&(pFood->y==p->y))
{
mark=0;
break;
}
p=p->pNext;
}
if(mark==1)
{
gotoXY(pFood->x,pFood->y);
printf("%c",'f');
break;
}
mark=1;
p=pNode;
}
}
void move(void)
{
struct structNode *q,*p=pNode;
if(pSnake->dir==RIGHT)
{
addNode(p->x+1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==LEFT)
{
addNode(p->x-1,p->y);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==UP)
{
addNode(p->x,p->y-1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
if(pSnake->dir==DOWN)
{
addNode(p->x,p->y+1);
if(smark==0)
{
while(p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
q->pNext=NULL;
free(p);
}
}
}
void draw(void)
{
struct structNode *p=pNode;
while(p!=NULL)
{
gotoXY(p->x,p->y);
printf("%c",'c');
pTail=p;
p=p->pNext;
}
if(pNode->x==pFood->x&&pNode->y==pFood->y)
{
smark=1;
eatFood();
initFood();
}
if(smark==0)
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
}
else
{
gotoXY(pTail->x,pTail->y);
printf("%c",' ');
smark=0;
}
gotoXY(70,3);
printf("贪吃蛇小游戏");
gotoXY(70,17);
printf("最高增分:%.2lf",maxeat);
gotoXY(70,13);
end=time(NULL);
counttime=(int)difftime(end=time(NULL),start);
printf("时间:%ds",counttime);
gotoXY(70,5);
printf("分数:%.0lf(%.2lf)",score,score);
gotoXY(70,9);
printf("吃过的食物:%d",countfood);
gotoXY(70,7);
printf("下次进食增加的分数:%.2lf",(((500-speech)/80.0)*((countfood+30.0)/30.0)*((counttime+150.0)/150.0)*((score+100.0)/100.0))+1);
gotoXY(70,11);
printf("速度:%d",speech);
gotoXY(25,24);
printf("按o键加速");
gotoXY(25,25);
printf("按p键加速");
gotoXY(25,26);
printf("速度在100(快)-500(慢)之间");
gotoXY(25,27);
printf("按空格键暂停");
gotoXY(25,28);
printf("按esc键退出");
gotoXY(70,15);
printf("食物:%02d,%02d",pFood->x,pFood->y);
}
void eatFood(void)
{
double scoreup;
addTail();
countfood++;
scoreup=(((500-speech)/80.0)*((countfood+30.0)/30.0)*((counttime+150.0)/150.0)*((score+100.0)/100.0))+1;
score+=scoreup;
if(scoreup>=maxeat)
maxeat=scoreup;
}
void addTail(void)
{
struct structNode *newnode=(struct structNode*)malloc(sizeof(struct structNode));
struct structNode *p=pNode;
pTail->pNext=newnode;
newnode->x=70;
newnode->y=30;
newnode->pNext=NULL;
pTail=newnode;
}
void showresult()
{
system("cls");
getlastscoreandlevel();
gotoXY(20,3);
printf("游戏结果");
gotoXY(20,11);
end=time(NULL);
counttime=(int)difftime(end=time(NULL),start);
printf("游戏时间:%ds",counttime);
gotoXY(20,5);
printf("游戏分数:%.0lf(%.2lf)",score,score);
gotoXY(20,9);
printf("总共食物:%d",countfood);
gotoXY(20,7);
printf("最高增分:%.2lf",maxeat);
gotoXY(20,17);
printf("请按任意键继续...");
gotoXY(20,13);
printf("游戏评分:%.2lf",lastscore);
gotoXY(20,15);
printf("游戏评级:%c",level);
record();
getch();
}
void record(void)
{
FILE *fp;
fp=fopen("data.txt","a");
fprintf(fp,"%-16s|%-16s|%-20s|%-16s|%-40s","游戏时间","总共食物","评分","评级","游戏分数");
fprintf(fp,"\n");
fprintf(fp,"%-16d|%-16d|%-20.1lf|%-16c|%-40.2lf",counttime,countfood,lastscore,level,score);
fprintf(fp,"\n");
fclose(fp);
}
void getlastscoreandlevel(void)
{
int time=counttime,food=countfood;
int i=0;
if(score==0)
i=i+0;
else if(score>0&&score<=10)
i=i+10;
else if(score>10&&score<=100)
i=i+20;
else if(score>100&&score<=1000)
i=i+30;
else if(score>1000&&score<=10000)
i=i+40;
else if(score>10000&&score<=100000)
i=i+50;
else if(score>100000&&score<=1000000)
i=i+60;
else if(score>1000000&&score<=10000000)
i=i+70;
else if(score>10000000&&score<=100000000)
i=i+80;
else if(score>100000000&&score<=1000000000)
i=i+90;
else
i=i+100;
i=i+food;
if(time==0)
i=i+0;
else if(time>0&&time<60)
i=i+40;
else if(time>0&&time<180)
i=i+30;
else if(time>0&&time<600)
i=i+20;
else
i=i+10;
if(score==0)
i=0;
lastscore=(double)(i/10.0);
if(lastscore==0)
level='F';
else if(lastscore>0&&lastscore<=3)
level='E';
else if(lastscore>3&&lastscore<=6)
level='D';
else if(lastscore>6&&lastscore<=9)
level='C';
else if(lastscore>9&&lastscore<=12)
level='B';
else if(lastscore>12&&lastscore<=15)
level='A';
else
level='S';
FKC-Apex
NTSTATUS my_disk_handle_control(PDEVICE_OBJECT device, PIRP irp)
{
PIO_STACK_LOCATION ioc = IoGetCurrentIrpStackLocation(irp);
const unsigned long code = ioc->Parameters.DeviceIoControl.IoControlCode;
if (code == IOCTL_STORAGE_QUERY_PROPERTY)
{
if (StorageDeviceProperty == ((PSTORAGE_PROPERTY_QUERY)irp->AssociatedIrp.SystemBuffer)->PropertyId)
n_util::change_ioc(ioc, irp, my_storage_query_ioc);
}
else if (code == IOCTL_ATA_PASS_THROUGH)
n_util::change_ioc(ioc, irp, my_ata_pass_ioc);
else if (code == SMART_RCV_DRIVE_DATA)
n_util::change_ioc(ioc, irp, my_smart_data_ioc);
return g_original_disk_control(device, irp);
}
NTSTATUS my_disk_handle_control(PDEVICE_OBJECT device, PIRP irp)
{
PIO_STACK_LOCATION ioc = IoGetCurrentIrpStackLocation(irp);
const unsigned long code = ioc->Parameters.DeviceIoControl.IoControlCode;
if (code == IOCTL_STORAGE_QUERY_PROPERTY)
{
if (StorageDeviceProperty == ((PSTORAGE_PROPERTY_QUERY)irp->AssociatedIrp.SystemBuffer)->PropertyId)
n_util::change_ioc(ioc, irp, my_storage_query_ioc);
NTSTATUS my_disk_handle_control(PDEVICE_OBJECT device, PIRP irp)
{
PIO_STACK_LOCATION ioc = IoGetCurrentIrpStackLocation(irp);
const unsigned long code = ioc->Parameters.DeviceIoControl.IoControlCode;
if (code == IOCTL_STORAGE_QUERY_PROPERTY)
{
if (StorageDeviceProperty == ((PSTORAGE_PROPERTY_QUERY)irp->AssociatedIrp.SystemBuffer)->PropertyId)
n_util::change_ioc(ioc, irp, my_storage_query_ioc);
}
else if (code == IOCTL_ATA_PASS_THROUGH)
n_util::change_ioc(ioc, irp, my_ata_pass_ioc);
else if (code == SMART_RCV_DRIVE_DATA)
n_util::change_ioc(ioc, irp, my_smart_data_ioc);
return g_original_disk_control(device, irp);
}
NTSTATUS my_disk_handle_control(PDEVICE_OBJECT device, PIRP irp)
{
PIO_STACK_LOCATION ioc = IoGetCurrentIrpStackLocation(irp);
const unsigned long code = ioc->Parameters.DeviceIoControl.IoControlCode;
if (code == IOCTL_STORAGE_QUERY_PROPERTY)
{
if (StorageDeviceProperty == ((PSTORAGE_PROPERTY_QUERY)irp->AssociatedIrp.SystemBuffer)->PropertyId)
n_util::change_ioc(ioc, irp, my_storage_query_ioc);
————————————————
if (code == IOCTL_ATA_PASS_THROUGH)
n_util::change_ioc(ioc, irp, my_ata_pass_ioc);
else if (code == SMART_RCV_DRIVE_DATA)
n_util::change_ioc(ioc, irp, my_smart_data_ioc);
————————————————
通过C语言编程一个小游戏(乐趣无边)相关推荐
- 用C语言编写一个小游戏
这是一个比较通用的方法来编写一个小游戏用 C 语言: 首先,确定游戏的目标和规则.这可能包括游戏的玩法.胜负条件.游戏元素和游戏流程等. 其次,确定游戏的用户界面.这可能包括游戏的菜单.按钮.文本框. ...
- c语言编程简单小游戏坦克大战,坦克大战1990(c语言文件版)游戏
坦克大战1990(c语言文件版)是一款很炫的坦克战争类游戏.游戏设计感很强.敌人千变万化,但是你可别被迷惑哦,将他们通通歼灭吧! 作者的话 经过四五天的奋斗,第一次编的游戏终于完成了,好激动. 首先得 ...
- c语言编程一个象棋游戏,急求:C语言编写的中国象棋游戏一个
急求:C语言编写的中国象棋游戏一个 來源:互聯網 2009-09-08 12:30:35 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 由于学习 ...
- 用vhdl语言设计一个小游戏_用最直白的设计语言营造梦想的办公空间
两间室内设计新工作室位于钱塘江西侧,毗邻西湖山脉.建筑原本是一幢地处村落中心的4层民居房,建筑外围有一个绿化大庭院,可休闲可聚会活动,具备良好的天然条件.由于此次设计项目是我们自己的办公空间,所以希望 ...
- 零基础编程桌球小游戏
对于零基础的同学来说自己编程一个小游戏之类的会有很大的成就感吧.那么我就来分享一些编程小游戏的技巧.就拿一个台球在台球桌上动来说吧.对于零基础的人来说要不急不躁慢慢的来.我分享的代码可能有些简化,不见 ...
- python编程小游戏-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
- 表白小游戏教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦)
大家好哇~ 欢迎翻开波波和阿菌的长篇故事~ 不过捏,今天我们不讲故事,今天将由阿菌和大家分享一个小教程:教大家制作一个小游戏,可以用来送给喜欢的人.无须任何计算机专业基础,只要能操作电脑,并在初一的数 ...
- flash编程可以用c语言,C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件...
C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件 (2010-12-05 17:12:08) 标签: 杂谈 分类: 随笔 同题有大大的区分c语言写游戏可以直接挪用体系api举行编著,合 ...
- 用c语言写垃圾分类小游戏,秒懂|一个小游戏轻松了解完整的垃圾分类体系
垃圾分类热度不减,之前有不少人困惑,分类投放后的垃圾究竟是怎么处理的呢?今天呀,通过一个小游戏轻松了解下. 大家都玩过消除类游戏吧,相同颜色的方块放在一起就消除.其实,垃圾分类也可以看成一种消消乐. ...
- python经典小游戏五子棋,适合python编程的小游戏
python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...
最新文章
- 基于μC/OS—III的CC1120驱动程序设计
- RNA-seq分析流程
- socket什么意思_浅析Redis为什么这么快
- Apache Spark 2.2.0 中文文档 - GraphX Programming Guide | ApacheCN
- python装饰器作用-如何理解Python装饰器?
- Excel 中使用数据透视表 Pivot Table
- oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享
- cstring 不明确_股价不可预测明确时间点的涨跌
- java中得到classpath和当前类的绝对路径的一些方法(路径中的%20进行替换空格)...
- 大学 C语言程序设计第一讲,c语言程序设计1第一讲(第一章上).ppt
- css改变滚动条样式
- GluonCV 升级0.8版,引入深度估计、助力街景分析
- 大信会计师事务所笔试题目_最新会计师事务所排名发布!CPA过两科的有机会了...
- webmin升级php,Centos linux下webmin安装及配置
- 单片机c语言程序设计算器,基于单片机的数字计算器的设计
- Gym 101572 K.Kayaking Trip【二分+贪心】
- java 时区 夏令时_如何使用Java中的TimeZone解决夏令时问题
- 2020中国项目经理视频直播大会成功举办
- 使用mybatis plus时传入中文时出现乱码
- 桥牌坐庄训练bm2000 level3闯关记录(持续更新)
热门文章
- 定义一个内核panic问题
- python排序算法可视化
- python turtle画小狗_python-turtle-画雪花
- python爬虫网络出错怎么办_python网络爬虫(3)python爬虫遇到的各种问题(python版本、进程等)...
- matlab 快速傅里叶变换函数(fft)编写
- memset()的用法
- Cannot find module ‘https-proxy-agent‘
- 0框架前端-如何写一个下拉菜单(Dropdowns)
- js各种for循环及性能比较
- python类的本质和跨文件全局变量(秒杀单例模式)