C语言入门编程实战(一)——低配版贪吃蛇

游戏效果如图:

游戏说明:通过方向键操控,按下蛇动,不按则不动- -非常简单

               红色部分表示头部

                每次游戏时间30s,时间结束后程序自动退出。

编程语言:C语言

开发环境:VS2017

使用EasyX库处理界面

代码如下:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <tchar.h>

typedef struct postion {
	int x;
	int y;
}Foodpostion;
typedef struct Snakemessage {
	int x;
	int y;
}Snakepostion;
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000)//按下1,不按0
Foodpostion food;                         //当前食物位置
Snakepostion snakeArr[100];               //当前小蛇每个点的信息
int length;                              //当前小蛇长度

void init();                             //初始化界面
void gamebegin();                        //游戏启动
void gameplay();                         //玩游戏具体过程
void close();                            //释放资源
void drawsnake(Snakepostion *snp);        //画蛇
void drawfood();                      //画食物
void clearfood();                     //吃掉食物
void clearsnake(Snakepostion snp[]);  //清除小蛇,准备画新
void drawscore(int score);                   //分数
void drawwindows();                         //绘制边框
void drawtime(int sec);                            //绘制时间
void main() {
	init();                             //初始化界面
	gamebegin();                        //游戏启动
	gameplay();                         //玩游戏具体过程
	close();                            //释放资源
}
void init() {
	initgraph(700, 605);
}
void gamebegin() {
	//绘制边框
	drawwindows();
	/*setlinecolor(RGB(50, 50, 50));//边框颜色
	setlinestyle(PS_SOLID, 10);  //边框为实线,粗细为10像素,此函数后两个参数有默认值,不传
	fillrectangle(0, 0, 475, 600);//左上角和右下角(x,y),此坐标是线宽的中轴线的坐标,外坐标-5 内+5*/
	//绘制初始小蛇
	setlinestyle(PS_SOLID, 1);//改线条粗细
	//setlinecolor(RGB(0, 0, 0));//改线条颜色
	
	length = 5;
	for (int i = 0; i < 5; i++) {
		snakeArr[i].x = 200;
		snakeArr[i].y = 200+i*10;
	}
	drawsnake(snakeArr);
	//绘制初始食物
	drawfood();
	//绘制分数
	drawscore(0);
	//绘制时间
	drawtime(30);
	
}
void gameplay() {
	for (int j = 299; j >= 0; j--) {//监听键盘
		if (j % 10 == 0) {
			drawtime(j / 10);
		}
		if (KEY_DOWN(VK_UP) && snakeArr[0].y > 10) {//上边界
			clearsnake(snakeArr);
			for (int i = length - 1; i > 0; i--) {
				snakeArr[i].x = snakeArr[i - 1].x;
				snakeArr[i].y = snakeArr[i - 1].y;
			}
			snakeArr[0].x = snakeArr[0].x;
			snakeArr[0].y = snakeArr[0].y - 10;
			drawsnake(snakeArr);
		}
		if (KEY_DOWN(VK_DOWN) && snakeArr[length -1].y<590) {//下边界
			clearsnake(snakeArr);
			for (int i = length - 1; i >0; i--) {
				snakeArr[i].x = snakeArr[i - 1].x;
				snakeArr[i].y = snakeArr[i - 1].y;
			}
			snakeArr[0].x = snakeArr[0].x;
			snakeArr[0].y = snakeArr[0].y + 10;
			drawsnake(snakeArr);
			
		}
		if (KEY_DOWN(VK_LEFT) && snakeArr[0].x>10) {//左边界
			clearsnake(snakeArr);
			for (int i = length - 1; i > 0; i--) {
				snakeArr[i].x = snakeArr[i - 1].x;
				snakeArr[i].y = snakeArr[i - 1].y;
			}
			snakeArr[0].x = snakeArr[0].x-10;
			snakeArr[0].y = snakeArr[0].y;
			drawsnake(snakeArr);
		}
		if (KEY_DOWN(VK_RIGHT) && snakeArr[0].x<470) {//右边界
			clearsnake(snakeArr);
			for (int i = length - 1; i > 0; i--) {
				snakeArr[i].x = snakeArr[i - 1].x;
				snakeArr[i].y = snakeArr[i - 1].y;
			}
			snakeArr[0].x = snakeArr[0].x + 10;
			snakeArr[0].y = snakeArr[0].y;
			drawsnake(snakeArr);
		}
		
		if ((food.x == snakeArr[0].x) && (food.y == snakeArr[0].y)) {
			snakeArr[length].x = snakeArr[length - 1].x;
			snakeArr[length].y = snakeArr[length - 1].y+10;
			length++;
			clearfood();
			drawfood();
			
			
			clearsnake(snakeArr);
			drawsnake(snakeArr);
		}
		
		Sleep(100);
		drawscore(length * 10 - 50);
	}
	cleardevice();
	TCHAR str[30];
	settextcolor(RGB(255, 0, 0));//设置文字颜色
	settextstyle(50, 0, _T("黑体"));//设置文字大小,粗细,字体
	_stprintf(str, _T("GAME OVER"));
	outtextxy(300, 250, str);
	drawscore(length * 10 - 50);
	Sleep(2000);
}
void close() {
	_getch();
	closegraph();
}
void drawsnake(Snakepostion snp[]){
	setlinecolor(RGB(0,0,0));
	setfillcolor(RGB(255, 50, 50));
	fillrectangle(snp[0].x, snp[0].y, snp[0].x + 10, snp[0].y + 10);
	setfillcolor(RGB(0, 0, 0));
	for (int i =1; i <length; i++) {
		fillrectangle(snp[i].x, snp[i].y, snp[i].x + 10, snp[i].y + 10);
	}
}
void drawfood() {
	srand((unsigned)time(NULL));//随机数初始化
	food.x = (rand() % 40) * 10 + 10;//防止食物出现在边框上,+10
	food.y = (rand() % 40) * 10 + 10;
	setlinestyle(PS_SOLID, 1);//改线条粗细
	setfillcolor(RGB(0,0,0));
	fillrectangle(food.x, food.y, food.x + 10, food.y + 10);
}
void clearfood(){
	setfillcolor(RGB(255,255,255));
	fillrectangle(food.x, food.y, food.x + 10, food.y + 10);
}
void clearsnake(Snakepostion snp[]) {
	setlinecolor(RGB(255,255,255));
	setfillcolor(RGB(255, 255, 255));
	for (int i = 0; i <length; i++) {
		fillrectangle(snp[i].x, snp[i].y, snp[i].x + 10, snp[i].y + 10);
	}
}
void drawscore(int score) {
	TCHAR str[30];
	TCHAR s[30];
	TCHAR st[30];
	settextcolor(RGB(255, 0, 0));//设置文字颜色
	settextstyle(25, 0, _T("黑体"));//设置文字大小,粗细,字体							
	_stprintf(str, _T("Your score:"));
	outtextxy(500, 50, str);
	_stprintf(s, _T("%3d"),score);
	outtextxy(530, 80, s);
	_stprintf(st, _T("WECLOME!"));
	outtextxy(520,450, st);
}
void drawwindows() {
	setlinecolor(RGB(50, 50, 50));//边框颜色
	setlinestyle(PS_SOLID, 10);  //边框为实线,粗细为10像素,此函数后两个参数有默认值,不传
	fillrectangle(0, 0, 475, 600);//左上角和右下角(x,y),此坐标是线宽的中轴线的坐标,外坐标-5 内+5
}
void drawtime(int sec) {
	TCHAR str[30];
	settextcolor(RGB(255, 255, 0));//设置文字颜色
	settextstyle(25, 0, _T("黑体"));//设置文字大小,粗细,字体
	_stprintf(str, _T("剩余时间: %2ds"), sec);
	outtextxy(500, 250, str);
}

  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
关于C语言一些简单的实例,里面有些思想值得借鉴 1 一个价值“三天”的BUG  2 灵活使用递增(递减)操作符  3 算术运算符计算器  4 逻辑运算符计算器 5 IP地址解析  6 用if…else语句解决奖金发放问题  7 用for循环模拟自由落体  8 用while语句求n!  9 模拟银行常用打印程序  10 使用一维数组统计选票  11 使用二维数组统计学生成绩  12 简单的计算器  13 时钟程序  14 华氏温度和摄氏温度的相互转换  15 SimpleDebug函数应用  16 常用的几种排序方法  17 广度优先搜索及深度优先搜索  18 实现基本的串操作  19 计算各点到源点的最短距离  20 储油问题  21 中奖彩球问题  22 0-1背包问题  24 二叉树算法集  25 模拟LRU页面置换算法  26 大整数阶乘新思路  27 银行事件驱动模拟程序  28 模拟迷宫探路  29 实现高随机度随机序列  30 停车场管理系统 31 菜单实现 32 窗口制作  33 模拟屏幕保护程序  34 文件读写基本操作  35 格式化读写文件  36 成块读写操作  37 随机读写文件  38 文件的加密和解密  39 实现两个文件的连接  40 实现两个文件信息的合并  41 文件信息统计  42 文件分割   43 同时显示两个文件的内容  44 模拟Linux环境下的vi编辑器  45 文件操作综合应用——银行账户管理  46 实用内存清理程序  47 如何检测Sniffer   48 加密DOS批处理程序  49 使用栈实现密码设置  50 远程缓冲区溢出漏洞利用程序  51 简易漏洞扫描器  52 文件病毒检测程序  53 监测内存泄露与溢出  54 实现traceroute命令  55 实现ping程序功能  56 获取Linux本机IP地址  57 实现扩展内存的访问  58 随机加密程序  59 MD5加密程序  60 RSA加密   61 制作表格  62 用画线函数作出的图案  63 多样的椭圆  64 多变的立方体 65 简易时钟  66 跳动的小球  67 用柱状图表示学生成绩各分数段比率  68 EGA/VGA屏幕存储  69 按钮制作  70 三维视图制作  71 红旗图案制作  72 火焰动画制作  73 模拟水纹扩散  74 彩色的Photo Frame   75 火箭发射演示  76 恢复内存文本 77 挽救磁盘数据 78 建立和隐藏多个PRI DOS分区 79 简单的DOS下的中断服务程序 80 文件名分析程序  81 鼠标中断处理  82 实现磁盘数据的整体加密  83 揭开CMOS密码  84 获取网卡信息  85 创建自己的设备  86 设置应用程序启动密码  87 获取系统置信息  88 硬件检测  89 管道通信  90 程序自杀技术实现  91 连续击键游戏  92 掷骰子游戏  93 弹力球  94 俄罗斯方块  95 24点扑克牌游戏  96 贪吃  97 潜水艇大战  98 机器人大战  99 图形模式下的搬运工  100 十全十美游戏  101 强大的通信录  102 模拟Windows下UltraEdit程序  103 轻松实现个人理财  104 竞技比赛打分系统  105 火车订票系统 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值