89.game_snake(1)

本文介绍了一个使用C++实现的贪吃蛇游戏代码,包括游戏的基本逻辑、蛇的移动、食物生成及碰撞检测等功能。游戏利用了墙、蛇和食物三个类,通过键盘输入控制蛇的移动方向,实现了蛇吃食物增长、边界和身体碰撞检测。

game.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include "wall.h"
#include "snake.h"
#include "food.h"
#include <ctime>
#include <conio.h>
#include <Windows.h>

int main(){

	//添加随机种子
	srand((unsigned int)time(NULL));

	//是否死亡标示
	bool isDead = false;

	char preKey = NULL;

	Wall wall;
	wall.initWall();
	
	Food food(wall);
	food.setFood();

	Snake snake(wall, food);
	snake.initSnake();

	//snake.move('w');
	//snake.move('w');
	//snake.move('a');

	wall.drawWall();


	//接受用户输入


	while (!isDead)
	{
		char key = _getch();

		//判断 如果是第一次按了 左键 才不能激活游戏
		// 判断 上一次 移动方向
		if (preKey == NULL && key == snake.LEFT)
		{
			continue;
		}

		do 
		{
			if (key == snake.UP || key  == snake.DOWN || key == snake.LEFT || key == snake.RIGHT)
			{
				//判断本次按键 是否与上次冲突
				if ( (key == snake.LEFT && preKey == snake.RIGHT)  ||
					(key == snake.RIGHT && preKey == snake.LEFT) ||
					(key == snake.UP && preKey == snake.DOWN) ||
					(key == snake.DOWN && preKey == snake.UP))
				{
					key = preKey;
				}
				else
				{
					preKey = key; //不是冲突按键  可以更新按键
				}


				if (snake.move(key) == true)
				{
					//移动成功 代码
					system("cls");
					wall.drawWall();
					Sleep(100);
				}
				else
				{
					isDead = true;
					break;
				}
			}
			else
			{
				key = preKey; //强制将错误按键变为 上一次移动的方向
			}
			

		} while (!_kbhit()); //当没有键盘输入的时候 返回0

	
	}

	

	


	////测试
	//wall.setWall(5, 4, '=');
	//wall.setWall(5, 5, '=');
	//wall.setWall(5, 6, '@');

	//

	//cout << wall.getWall(0, 0) << endl;
	//cout << wall.getWall(5, 4) << endl;
	//cout << wall.getWall(5, 6) << endl;
	//cout << wall.getWall(1, 1) << endl;

	system("pause");
	return EXIT_SUCCESS;
}

wall.h

#ifndef _WALL_HEAD
#define _WALL_HEAD
//#pragma  once

#include <iostream>
using namespace std;

class Wall
{
public:
	enum {
		ROW = 26,
		COL = 26
	};

	
	//初始化墙壁
	void initWall();

	//画出墙壁
	void drawWall();

	//根据索引设置 二维数组里的内容
	void setWall(int x, int y, char c);

	//根据索引获取当前位置的符号
	char getWall(int x, int y);

private:
	char gameArray[ROW][COL];
};




#endif

wall.cpp

#include "wall.h"


void Wall::initWall()
{
	for (int i = 0; i < ROW;i++)
	{
		for (int j = 0; j < COL;j++)
		{
			//放墙壁
			if (i == 0  || j == 0 || i == ROW - 1 || j == COL - 1)
			{
				gameArray[i][j] = '*';
			}
			else
			{
				gameArray[i][j] = ' ';
			}
		}
	}


}

void Wall::drawWall()
{
	for (int i = 0; i < ROW;i ++)
	{
		for (int j = 0; j < COL; j ++)
		{
			cout << gameArray[i][j] << " ";
		}
		if (i == 5)
		{
			cout << "create by zt";
		}
		if (i == 6)
		{
			cout << "a : left";
		}
		if (i == 7)
		{
			cout << "d : right";
		}
		if (i == 8)
		{
			cout << "w : up";
		}
		if (i == 9)
		{
			cout << "s : down";
		}
		cout << endl;
	}


}

void Wall::setWall(int x, int y, char c)
{
	gameArray[x][y] = c;
}

char Wall::getWall(int x, int y)
{
	return gameArray[x][y];
}

food.h

#pragma  once
#include <iostream>
#include "wall.h"
using namespace std;

class Food
{
public:
	Food(Wall & tempWall);

	//设置食物
	void setFood();


	int foodX;
	int foodY;

	Wall & wall;
};

food.cpp

#include "food.h"

Food::Food(Wall & tempWall) : wall(tempWall)
{

}

void Food::setFood()
{
	while (true)
	{
		foodX = rand() % (Wall::ROW - 2) + 1;
		foodY = rand() % (Wall::COL - 2) + 1;

		//如果随机的位置是蛇头或蛇身 就重新生成随机数
		if (wall.getWall(foodX, foodY) == ' ')
		{
			
			wall.setWall(foodX, foodY, '#');
			break;
		}
	}
}

Snake.h

#pragma  once
#include <iostream>
#include "wall.h"
#include "food.h"
using namespace std;

class Snake
{
public:
	Snake(Wall & tempWall, Food & food );

	enum { UP = 'w', DOWN = 's', LEFT = 'a' , RIGHT = 'd'};

	//节点
	struct Point
	{
		//数据域
		int x;
		int y;
		//指针域
		Point * next;
	};

	//初始化蛇
	void initSnake();

	// 销毁节点
	void destroyPoint();

	// 添加节点
	void addPoint(int x,int y);


	// 删除节点
	void delPoint();

	//移动蛇操作
	//返回值代表 移动是否成功
	bool move(char key);

	Point * pHead;

	Wall & wall;

	Food & food;

	bool isRool; //判断循环标示
};


snake.cpp

#include "snake.h"


Snake::Snake(Wall & tempWall, Food & tmpFood) : wall(tempWall), food(tmpFood)
{
	pHead = NULL;
	isRool = false;
}


void Snake::initSnake()
{
	destroyPoint();

	addPoint(5, 3);
	addPoint(5, 4);
	addPoint(5, 5);
}

//销毁所有节点
void Snake::destroyPoint()
{
	Point * pCur = pHead;

	while (pHead != NULL)
	{
		pCur = pHead->next;
		delete pHead;

		pHead = pCur;
	}
}

void Snake::addPoint(int x, int y)
{
	//创建新节点
	Point * newPoint = new Point;
	newPoint->x = x;
	newPoint->y = y;
	newPoint->next = NULL;

	//如果原来头不为空 改为 身子

	if (pHead != NULL)
	{
		wall.setWall(pHead->x, pHead->y, '=');
	}

	newPoint->next = pHead;

	pHead = newPoint; //更新头部

	wall.setWall(pHead->x, pHead->y, '@');


}

//删除节点
void Snake::delPoint()
{
	
	//两个节点以上 才去做删除操作
	if (pHead == NULL || pHead->next == NULL)
	{
		return;
	}

	Point * pCur = pHead->next;
	Point * pPre = pHead;

	while (pCur->next !=NULL)
	{
		pPre = pPre->next;
		pCur = pCur->next;
	}
	//删除尾节点

	wall.setWall(pCur->x, pCur->y, ' ');

	delete pCur;
	pCur = NULL;
	pPre->next = NULL;

}

bool Snake::move(char key)
{
	int x = pHead->x;
	int y = pHead->y; 

	switch (key)
	{
	case UP:
		x--;
		break;
	case DOWN :
		x++;
		break;
	case LEFT:
		y--;
		break;
	case RIGHT:
		y++;
		break;
	default:
		break;
	}

	//判断 如果是下一步碰到的是尾巴,不应该死亡
	Point * pCur = pHead->next;
	Point * pPre = pHead;

	while (pCur->next != NULL)
	{
		pPre = pPre->next;
		pCur = pCur->next;
	}
	if (pCur->x == x && pCur->y == y)
	{
		//碰到尾巴 循环
		isRool = true;
	}
	else
	{
		//判断用户到达位置是否成功
		if (wall.getWall(x, y) == '*' || wall.getWall(x, y) == '=')
		{
			addPoint(x, y);
			delPoint();
			system("cls");
			wall.drawWall();
			cout << "GAME OVER!!!" << endl;
			return false;
		}
	}



	//移动成功 分两种  
	//吃到食物  未吃到食物
	if (wall.getWall(x,y) == '#')
	{
		addPoint(x, y);

		//重新设置食物
		food.setFood();
	}
	else
	{
		addPoint(x, y);
		delPoint();
		if (isRool == true)
		{
			wall.setWall(x, y, '@');
		}
		
	}

	return true;
}

 

内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
# 使用Pygame制作一个简单的贪吃蛇游戏,实现游戏界面,游戏的得分机制。 import pygame import sys import random from pygame.math import Vector2 # 初始化pygame pygame.init() # 游戏设置 CELL_SIZE = 20 CELL_NUMBER = 20 SCREEN_WIDTH = CELL_SIZE * CELL_NUMBER SCREEN_HEIGHT = CELL_SIZE * CELL_NUMBER FPS = 60 # 颜色定义 BACKGROUND_COLOR = (175, 215, 70) SNAKE_COLOR = (75, 105, 47) FOOD_COLOR = (220, 60, 60) TEXT_COLOR = (50, 50, 50) class Snake: def __init__(self): # 初始蛇身(3个方块) self.body = [Vector2(5, 10), Vector2(4, 10), Vector2(3, 10)] self.direction = Vector2(1, 0) # 初始向右移动 self.new_block = False def draw_snake(self, screen): for block in self.body: block_rect = pygame.Rect(block.x * CELL_SIZE, block.y * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, SNAKE_COLOR, block_rect) # 绘制蛇身内部小矩形增加细节 inner_rect = pygame.Rect(block.x * CELL_SIZE + 4, block.y * CELL_SIZE + 4, CELL_SIZE - 8, CELL_SIZE - 8) pygame.draw.rect(screen, (90, 130, 60), inner_rect) def move_snake(self): if self.new_block: body_copy = self.body[:] body_copy.insert(0, body_copy[0] + self.direction) self.body = body_copy self.new_block = False else: body_copy = self.body[:-1] body_copy.insert(0, body_copy[0] + self.direction) self.body = body_copy def add_block(self): self.new_block = True def reset(self): self.body = [Vector2(5, 10), Vector2(4, 10), Vector2(3, 10)] self.direction = Vector2(1, 0) class Food: def __init__(self, snake_body=None): self.snake_body = snake_body if snake_body else [] self.randomize() def draw_food(self, screen): food_rect = pygame.Rect(self.pos.x * CELL_SIZE, self.pos.y * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, FOOD_COLOR, food_rect) def randomize(self): # 确保食物不会生成在蛇身上 while True: self.x = random.randint(0, CELL_NUMBER - 1) self.y = random.randint(0, CELL_NUMBER - 1) self.pos = Vector2(self.x, self.y) if self.pos not in self.snake_body: break class Game: def __init__(self): self.snake = Snake() self.food = Food(self.snake.body) # 传入蛇身用于检查食物位置 self.score = 0 try: self.game_font = pygame.font.SysFont(None, 25) except: # 如果字体加载失败,使用默认字体 self.game_font = pygame.font.Font(None, 25) def update(self): self.snake.move_snake() self.check_collision() self.check_fail() def draw_elements(self, screen): self.draw_grid(screen) self.food.draw_food(screen) self.snake.draw_snake(screen) self.draw_score(screen) def check_collision(self): if self.food.pos == self.snake.body[0]: self.food.randomize() self.snake.add_block() self.score += 1 def check_fail(self): # 检查是否撞墙 snake_head = self.snake.body[0] if not 0 <= snake_head.x < CELL_NUMBER or not 0 <= snake_head.y < CELL_NUMBER: self.game_over() # 检查是否撞到自己 for block in self.snake.body[1:]: if block == snake_head: self.game_over() def game_over(self): self.snake.reset() self.score = 0 # 重置食物位置 self.food = Food(self.snake.body) def draw_grid(self, screen): for row in range(CELL_NUMBER): for col in range(CELL_NUMBER): rect = pygame.Rect(row * CELL_SIZE, col * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, (160, 200, 80) if (row + col) % 2 == 0 else (170, 210, 90), rect) def draw_score(self, screen): score_text = f'Score: {self.score}' try: score_surface = self.game_font.render(score_text, True, TEXT_COLOR) score_rect = score_surface.get_rect(topleft=(10, 10)) screen.blit(score_surface, score_rect) except: # 如果字体渲染失败,跳过显示 pass def main(): screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('贪吃蛇游戏') clock = pygame.time.Clock() game = Game() # 设置定时移动事件 SCREEN_UPDATE = pygame.USEREVENT pygame.time.set_timer(SCREEN_UPDATE, 150) # 每150毫秒移动一次 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == SCREEN_UPDATE: game.update() if event.type == pygame.KEYDOWN: # 键盘控制方向 if event.key == pygame.K_UP and game.snake.direction.y != 1: game.snake.direction = Vector2(0, -1) if event.key == pygame.K_DOWN and game.snake.direction.y != -1: game.snake.direction = Vector2(0, 1) if event.key == pygame.K_LEFT and game.snake.direction.x != 1: game.snake.direction = Vector2(-1, 0) if event.key == pygame.K_RIGHT and game.snake.direction.x != -1: game.snake.direction = Vector2(1, 0) screen.fill(BACKGROUND_COLOR) game.draw_elements(screen) pygame.display.update() clock.tick(FPS) if __name__ == "__main__": main()这个代码这么写可以吗?有什么需要修改的地方吗?请帮我写出修改后的完整代码。
12-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值