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);
}

猜你喜欢

转载自blog.csdn.net/qq_36616692/article/details/80581640