我的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;
}