我的C++之旅---03

我的C++之旅—03

(原创)
下面的是eating snake游戏的源代码

功能:

小游戏

#define _CRT_SECURE_NO_WARNINGS
#define MAX 3072
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<conio.h>
#include<graphics.h>
#include<time.h>


typedef struct pointxy
{
	int x;
	int y;
}MyPoint;
HWND hwnd = NULL;


struct snake {
	int num;
	MyPoint xy[MAX];
	char position;//方向
}s;
enum movePosition { right, left, down, up };


struct food {
	MyPoint foodxy;
	int flag = 0;
	int eatGrade;
}f;


void initSnake() {

	s.xy[2].x = 10;
	s.xy[2].y = 10;

	s.xy[1].x = 20;
	s.xy[1].y = 10;

	s.xy[0].x = 30;
	s.xy[0].y = 10;
	
	
	s.position = right;
	s.num = 3;
}


void drawSnake() {
	for (int i = 0;i < s.num;i++) {
		setlinecolor(RED);
		setfillcolor(GREEN);
		fillrectangle(s.xy[i].x, s.xy[i].y, s.xy[i].x + 10, s.xy[i].y + 10);
	}
}


void moveSnake() {
	for (int i = s.num;i > 0;i--) {
		s.xy[i].x = s.xy[i - 1].x;
		s.xy[i].y = s.xy[i - 1].y;
	}
	switch (s.position) {
	case right:
		s.xy[0].x = s.xy[0].x + 10;
		break;
	case left:
		s.xy[0].x = s.xy[0].x - 10;
		break;
	case up:
		s.xy[0].y = s.xy[0].y - 10;
		break;
	case down:
		s.xy[0].y = s.xy[0].y + 10;
		break;
	default:
		break;
	}
}


void keyAction() {
	char key = '\0';
	key = _getch();   //用户不可见输入
	switch (key)
	{
	case 'W':
	case 'w':
	case 72:
		if (s.position != up && s.position != down) {
			s.position = up;
		}
		break;
	case 's':
	case 'S':
	case 80:
		if (s.position != down && s.position != up) {
			s.position = down;
		}
		break;
	case 'A':
	case 'a':
	case 75:
		if (s.position != left && s.position != right) {
			s.position = left;
		}
		break;
	case 'd':
	case 'D':
	case 77:
		if (s.position != right && s.position != left) {
			s.position = right;
		}
		break;
	default:
		break;
	}
}


void initFood(){
	int i;
	while (1) {
		int n = 0;
		f.foodxy.x = (int)rand() % 64 * 10;
		f.foodxy.y = (int)rand() % 48 * 10;
		for (i = 0;i < s.num;i++) {
			if (f.foodxy.x == s.xy[i].x && f.foodxy.y == s.xy[i].y) {
				n++;
			}
		}
		if (n == 0)break;
	}


	f.flag = 1;

}


void drawFood() {
	fillrectangle(f.foodxy.x, f.foodxy.y, f.foodxy.x + 10, f.foodxy.y + 10);
}


void eatFood() {
	if (s.xy->x == f.foodxy.x && s.xy->y == f.foodxy.y) {
		s.num++;
		f.flag = 0;
		f.eatGrade += 10;
	}
}


int dieSnake() {
	//显示分数
	char grade[100] = { 0 };
	sprintf(grade, "%d", f.eatGrade);
	setbkmode(TRANSPARENT);
	settextcolor(RED);
	outtextxy(580, 20, "分数:");
	outtextxy(620, 20, grade);


	//判断是否撞墙
	if (s.xy[0].x > 640 || s.xy[0].x < 0 || s.xy[0].y > 480 || s.xy[0].y < 0) {
		MessageBox(hwnd, "撞墙而死","游戏结束",0);
		return 1;
	}
	//判断是否装自己
	int i;
	for (i = 1;i < s.num;i++) {
		if (s.xy[0].x == s.xy[i].x && s.xy[0].y == s.xy[i].y) {
			MessageBox(hwnd, "自残而死", "游戏结束", 0);
			return 1;
		}
	}
	return 0;
}


int main() {
	srand((unsigned int)time(NULL));
	hwnd = initgraph(640,480);
	setbkcolor(WHITE);
	cleardevice();
	initSnake();
	while (1) {
		cleardevice();        //刷新路径
		if (f.flag == 0) {
			initFood();
		}
		drawFood();
		drawSnake();
		if (dieSnake()) {
			break;
		}
		eatFood();
		moveSnake();
		Sleep(150);
		while (_kbhit()) {    //_kbhit()判断是否存在按键
			keyAction();
		}
	}
	closegraph();
	printf("Game Over!!!");
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值