贪吃蛇中的小思考

贪吃蛇中的小技术

程序设计思路
  1. 构造游戏地图,用矩阵实现,每一个元素就是一个点
  2. 构造蛇对象,有长度,身体,移动等属性
  3. 游戏时,蛇一直在移动,获取到键盘输入的消息后改变方向,继续移动
  4. 构建食物对象,位置,以及被蛇吃掉后的位置更新
  5. 程序终止条件,也就是蛇不能撞到自己或者边界,也就是输了;当然为了游戏效果,设置一个最大值,当蛇的长度超过这个值,就判定为win
关键点

由于是控制台程序,因此实现贪吃蛇的关键点在于将蛇移动后的界面重绘并展示出来,并随时获取到键盘输入的消息,以及食物被吃后的重新设定。

将每次移动后的画面重现,初步构想是把每次界面中各元素的位置记录下来,然后清楚屏幕内容,重新输出。(MFC中易于实现,主要是除了redraw window,不知道还有什么方法可以去除画过的痕迹)但实际上并没有必要,改变的只是蛇头和蛇尾的位置,只需要改两个点的位置的内容就好。

随时获取键盘消息,在MFC中很方便可以实现(虽然亲自试验并没有起作用),但在控制台程序里,还需要引用一些库中的函数。

食物的重新设定,主要是位置不要出界,不要落在蛇身在的位置。

引用头文件

标准C++程序开头,除了常见的,还需要

#include <iostream>
#include <ctime>  //需要随机设置食物的位置,时间作为随机种子
#include <conio.h>  //响应键盘函数
#include <windows.h>   //控制台界面的控制
关键点的实现
void Snake::Move()
{
	
	gotoxy(body[len - 1].x, body[len - 1].y);
	cout <<' ';
	
	for (int i = len - 1; i > 0; --i) {
		this->body[i].x = this->body[i - 1].x;
		this->body[i].y = this->body[i - 1].y;
	}
	if (this->dir == 1) {
		this->body[0].x--;
	}
	else if (this->dir == 2) {
		this->body[0].y++;
	}
	else if (this->dir == 3) {
		this->body[0].x++;
	}
	else if (this->dir == 4) {
		this->body[0].y--;
	}
	gotoxy(this->body[0].x, this->body[0].y);
	cout <<'O';
}

这个是蛇的移动方法,同时表现了在界面里的展示方法

if(kbhit())					//kbhit 非阻塞函数 
{
    ch=getch();	//使用 getch 函数获取键盘输入 
    switch (ch){
        case 'A':
        case 'a':
            snake.Left();
            break;
        case 's':
        case 'S':
            snake.Down();
            break;
        case 'd':
        case 'D':
            snake.Right();
            break;
        case 'w':
        case 'W':
            snake.Up();
            break;
    }
}

这里的 kbhit() 函数就是可以实现随时响应键盘输入的函数,效果比较好

void setFood(Snake &s){
	food.x = rand() % 28 + 2;
	food.y = rand() % 78 + 2;
	int i;
	int flag = 1;
	while(flag){
		for (i = 0; i < s.len; ++i){
			if(s.body[i].x==food.x && s.body[i].y == food.y){
				break;
			}
		}
		if(i==s.len){
			flag = 0;
			gotoxy(food.x, food.y);
			cout << '$';
		}else{
			food.x = rand() % 28 + 2;
			food.y = rand() % 78 + 2;
		}
	}
	return;
}

这个就是食物设置的方法,这个的28和78是边界大小

问题探讨

目前程序实现的基本还有一个蛇身重合,也就是自己会撞自己没有加上去(懒得改了)。其他的没有问题。

但对于键盘消息响应,一直耿耿于怀,查到了还有一种方法是

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)

if(KEY_DOWN('A')){
    ······
}else if(){
    ······
}······

但是和kbhit()比起来,效果比较卡。在实现双击加速时,使用了条件嵌套,结果kbhit()效果也逊色不少,所以想着应该有更好的办法,还是说在MFC等封装好的图形界面设计里,优化效果会好点?这个目前还没有找到答案。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
android贪吃蛇毕业设计论文, 目 录 摘 要 I Abstract II 第1章 绪 论 1 1.1 Android简介 1 1.1.1 Android的来源及发展 1 1.1.2 Android系统的特点 2 1.2 项目目的与意义 2 1.2.1 开发目的 2 1.2.2 开发意义 3 1.3 国内外现状分析 3 1.3.1 国内外手机系统现状 3 1.3.2 国内外手机应用现状 4 1.3.3 发展趋势 5 第2章 方案论证 6 2.1 经济可行性分析 6 2.2 技术可行性分析 6 2.2.1 Android平台特性 6 2.2.2 Android平台架构 6 2.2.3 Android应用程序组件 7 2.3 本项目的开发方法 9 2.4 开发工具及环境简介 10 2.4.1 开发工具Eclipse简介 10 2.4.2 开发环境简介 10 第3章 需求分析 11 3.1 系统开发目标 11 3.2 系统需求分析 11 3.2.1 业务需求分析 11 3.2.2 用户需求分析 12 3.2.3 功能需求分析 12 第4章 过程论述 13 4.1 程序流程设计 13 4.2 概要设计 14 4.2.1 模块划分 14 4.2.2 游戏主界面模块 14 4.2.3 游戏控制模块 15 4.3 模块实现原理 15 4.3.1 游戏界面模块实现 15 4.3.2 游戏控制模块实现 16 4.3.3 TileView类的设计 17 4.3.4 SnakeView类的设计 17 4.4 程序主结构 17 4.5 程序类图 18 4.6 类的详细设计 19 4.6.1 Snake类的详细设计 19 4.6.2 TileView类的详细设计 21 4.6.3 SnakeView类的详细设计 22 第5章 系统测试与结果分析 25 5.1 软件测试 25 5.1.1 测试的基本概念 25 5.1.2 测试的步骤 25 5.2 系统测试 26 5.3 测试结论 27 结 论 28 致 谢 29 参考文献 30 附 录 31
贪吃蛇是一个经典的小游戏,通常用来展示编程语言的基本原理和技巧。在Python课程设计的小游戏贪吃蛇设计可以帮助学生学习和巩固Python语言的基础知识和编程技能。 首先,学生可以通过使用Python的基本语法和数据结构来实现贪吃蛇游戏的主要逻辑。他们需要定义蛇的移动规则、食物的生成和吃掉、游戏界面的呈现等功能。通过这个过程,学生可以学习到Python如何使用循环、条件语句、列表等基本知识来实现复杂的游戏逻辑。 其次,学生还可以通过设计贪吃蛇游戏来学习Python的面向对象编程。他们可以将蛇、食物、游戏界面等元素抽象成对象,并定义它们之间的交互关系。这样一来,学生可以更好地理解Python面向对象的概念和用法,同时也能锻炼他们的设计和封装能力。 最后,通过完成贪吃蛇游戏的设计和实现,学生还可以进一步提升他们的问题解决能力和团队合作精神。他们需要分析游戏的需求,思考如何实现这些需求,并在实现过程不断调试和优化。这一过程可以帮助学生提升他们的编程思维和解决实际问题的能力。 总的来说,Python课程设计贪吃蛇小游戏不仅可以帮助学生巩固Python语言的基础知识和编程技能,还能培养他们的面向对象编程能力和问题解决能力。这样的设计对于学生的编程学习和发展都具有积极的意义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值