***********************************************
开发工具:VC6.0中文版
**********************************************
前段时间实习做了贪吃蛇游戏,现在抽空进行总结和整理,重点是整理思路,如何让一个想法变成代码。
1、创建一条蛇
2、让这条蛇移动
3、按键控制蛇的移动
4、创建食物
5、蛇吃掉食物,并且增长
6、创建简单的规则
这是我的大概思路,后面会一步步按照思路来整理并且优化代码。
首先是创建一条蛇,用printf("*");来代替蛇,当蛇移动的时候,需要在蛇头移动的方向依次打印蛇身,而后面的蛇身要消失,这样子蛇就会看起来像是移动了
这里需要引入一个函数来获取坐标控制台
创建一个蛇,开始移动,代码:
#include "stdafx.h"
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
int i;
//在规定的坐标点创建蛇身
COORD pos = {0,0};
COORD pos1 = {0,1};
COORD pos2 = {0,2};
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); //获得窗体控制台
for(i = 0;i < 20;i++) //沿Y轴向下移动20步
{
Sleep(100); //延时100ms
system("cls"); //清屏
//pos.X++;
pos.Y++;
SetConsoleCursorPosition(hout,pos); //在控制台上设置光标位置
printf("*");
pos1.Y++;
SetConsoleCursorPosition(hout,pos1); //在控制台上设置光标位置
printf("*");
pos2.Y++;
SetConsoleCursorPosition(hout,pos2); //在控制台上设置光标位置
printf("*");
}
return 0;
}
这条蛇目前并不能转弯,如果要实现转弯的功能,思路如下:
让蛇转弯,规律:后一个重复前一个位置,只需要让第一个动,后面的依次复制即可,如果想重复转弯,可以加一个while循环在int i;
代码如下:
#include "stdafx.h"
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
int i;
COORD pos = {0,0};
COORD pos1 = {0,1};
COORD pos2 = {0,2};
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//获得窗体控制台
for(i = 0;i < 20;i++)
{
Sleep(100);
system("cls");
//pos.X++;
pos.Y++;
SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
printf("*");
pos1.Y++;
SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
printf("*");
pos2.Y++;
SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
printf("*");
}
for(i = 0;i < 20;i++)
{
Sleep(100);
system("cls");
//pos.X++;
pos=pos1; //让蛇的第二段的位置等于蛇的第一个位置
pos1=pos2; //最后一段蛇身,等于第二段的位置
pos2.X++;
SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
printf("*");
}
for(i = 0;i < 22;i++)
{
Sleep(100);
system("cls");
//pos.X++;
pos=pos1;
pos1=pos2;
pos2.Y--;
SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
printf("*");
}
for(i = 0;i < 20;i++)
{
Sleep(100);
system("cls");
//pos.X++;
pos=pos1;
pos1=pos2;
pos2.X--;
SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
printf("*");
SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
printf("*");
}
return 0;
}
执行效果如下:
前面的代码比较繁杂,现在将其封装成函数形式,简化格式并且不停循环转圈
代码及注释如下:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define SNAKELEN 10
#define SNAKEMAX 10
#define INITSNAKELEN 4
#define RIGHT 1
#define LEFT 2
#define DOWN 3
#define UP 4
COORD snakeBodyPosition[SNAKELEN];
void showSnake();
int snakeLen = 3;
void initSnake(COORD snakeHeadPosition )
{
int i = 0;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台
COORD tmp = snakeHeadPosition; //把蛇头位置赋值给tmp
for(i = 0;i < INITSNAKELEN;i++) //打印蛇身
{
snakeBodyPosition[i] = tmp;
SetConsoleCursorPosition(hout,tmp); //获取光标位置
printf("*");
tmp.X--; //光标向后移,方便再次打印蛇下一部分
}
snakeLen = INITSNAKELEN;
}
void move(int direction)
{
Sleep(100); //延时100ms
system("cls"); //清除屏幕
int i = 0;
for(i = 0;i < snakeLen - 1;i++) //除了蛇头外,蛇的其它部分依次移动
{
snakeBodyPosition[snakeLen -1-i] = snakeBodyPosition[snakeLen - 2-i]; //除蛇头,其余部分和蛇的前一个点位置一致
}
switch(direction) //switch和if的区别:当条件多余三个时,switch执行效率更高
{
case RIGHT:
{
snakeBodyPosition[0].X++;
break;
}
case LEFT:
{
snakeBodyPosition[0].X--;
break;
}
case DOWN:
{
snakeBodyPosition[0].Y++;
break;
}
case UP:
{
snakeBodyPosition[0].Y--;
break;
}
default:
{
break;
}
}
showSnake(); //打印蛇身,因为这个函数在move函数后创建,要在开始处进行声明(程序是顺序执行)
}
void showSnake()
{
int i = 0;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
for(i = 0;i <snakeLen;i++)
{
SetConsoleCursorPosition(hout,snakeBodyPosition[i]);
printf("*");
}
}
int main(int argc, char* argv[])
{
int i = 0;
COORD pos = {0,0}; //设定蛇头位置
initSnake(pos); //根据蛇头位置创建一条蛇
while(1) //无限循环转方形
{
for(i = 0;i < 20;i++)
{
move(RIGHT); //控制蛇右移20步
}
for(i = 0;i < 20;i++)
{
move(DOWN);
}
for(i = 0;i < 20;i++)
{
move(LEFT);
}
for(i = 0;i < 20;i++)
{
move(UP);
}
}
/*
for(i = 0;i < INITSNAKELEN;i++)
{
printf("\n"); //进行换行,防止后面程序自带的字体掩盖蛇身
}
*/
return 0;
}
执行效果如下:
总结:
1、熟悉用C建立坐标系
2、一段好的代码,主函数一定是简洁的
3、熟悉VC6.0用法