用C代码写贪吃蛇游戏--创建一条蛇并移动

来源:互联网 发布:淘宝开店上传宝贝 编辑:程序博客网 时间:2024/06/09 17:00

***********************************************
开发工具: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);//延时100mssystem("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>#defineSNAKELEN10#defineSNAKEMAX10#define INITSNAKELEN4#define RIGHT1#define LEFT2#defineDOWN3#defineUP4COORD snakeBodyPosition[SNAKELEN];void showSnake();int snakeLen = 3;void initSnake(COORD snakeHeadPosition ){int i = 0;HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台COORD tmp = snakeHeadPosition;//把蛇头位置赋值给tmpfor(i = 0;i < INITSNAKELEN;i++)//打印蛇身{snakeBodyPosition[i] = tmp;SetConsoleCursorPosition(hout,tmp);//获取光标位置printf("*");tmp.X--;//光标向后移,方便再次打印蛇下一部分}snakeLen = INITSNAKELEN;}void move(int direction){Sleep(100);//延时100mssystem("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;COORDpos = {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用法