首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通过C语言设计的推箱子(控制台终端)

通过C语言设计的推箱子(控制台终端)

作者头像
DS小龙哥
发布2023-08-09 17:12:19
发布2023-08-09 17:12:19
6020
举报

一、项目介绍

推箱子游戏是一款经典的益智小游戏,玩家需要控制主角角色将几个木箱按照要求推到指定位置。在控制台终端中,可以使用字符来表示不同的游戏元素,例如 ‘#’ 表示墙壁, ’ ’ 表示空地, ‘$’ 表示木箱, ‘@’ 表示主角角色, ‘+’ 表示完成任务的目标位置。

实现步骤如下:

  1. 定义常量和全局变量:需要定义一些常量和全局变量,用于存储游戏中的数据信息,游戏界面的宽度和高度、不同状态下的符号表示、木箱和目标位置等参数。同时还需要定义一个二维字符数组board,用于表示整个游戏界面。
  2. 初始化游戏界面:在InitGame()函数中进行游戏初始化,设置游戏界面的边框和各个元素的位置。其中,可以使用循环遍历二维字符数组来设置元素的位置,将 ‘#’ 设置为墙壁, ’ ’ 设置为空地,‘$’ 设置为木箱等。
  3. 绘制游戏画面:DrawGame()函数用于绘制游戏画面,并将board数组中的字符逐行输出。可以使用循环遍历二维字符数组来进行输出。
  4. 更新游戏状态:UpdateGame()函数用于更新游戏状态,包括判断主角角色是否可以移动,以及是否完成任务等操作。可以使用if语句和switch语句来判断不同情况下的操作,判断主角角色是否碰到墙壁或木箱,是否完成任务等。
  5. 控制主角角色移动:Control()函数用于控制主角角色的移动,读取键盘输入并更新主角角色的位置。可以使用getch()函数获取键盘输入,并根据用户输入进行判断,按下方向键上时主角角色向上移动。
  6. 判断游戏是否结束:CheckGameOver()函数用于检查游戏是否结束,包括是否成功完成任务或者失败结束游戏。如果判断出游戏结束,则直接退出程序。
  7. 游戏暂停:Pause()函数用于控制游戏的暂停时间,可以通过调用Sleep()函数来实现。
  8. 游戏结束:GameOver()函数用于输出最终的游戏得分和游戏结束信息,并直接退出程序。

二、代码实现

代码语言:javascript
复制
#include <stdio.h>
#include <conio.h>
#include <windows.h>

//定义常量和全局变量
const int WIDTH = 11;
const int HEIGHT = 10;
const char WALL = '#';
const char EMPTY = ' ';
const char BOX = '$';
const char TARGET = '+';
const char PLAYER = '@';

int playerX, playerY, score;
char board[HEIGHT][WIDTH];

//初始化游戏界面
void InitGame() {
	//设置游戏界面的边框和各个元素的位置
	for (int i = 0; i < HEIGHT; i++) {
		for (int j = 0; j < WIDTH; j++) {
			if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
				board[i][j] = WALL;
			}
			else {
				board[i][j] = EMPTY;
			}
		}
	}

	//设置木箱和目标位置
	board[2][2] = BOX;
	board[4][5] = BOX;
	board[6][8] = BOX;
	board[2][8] = TARGET;
	board[4][2] = TARGET;
	board[6][5] = TARGET;

	//设置主角角色位置
	playerX = 7;
	playerY = 5;
	board[playerX][playerY] = PLAYER;
}

//绘制游戏画面
void DrawGame() {
	system("cls");
	for (int i = 0; i < HEIGHT; i++) {
		for (int j = 0; j < WIDTH; j++) {
			printf("%c", board[i][j]);
		}
		printf("\n");
	}
	printf("Score: %d\n", score);
}

//更新游戏状态
void UpdateGame(int dx, int dy) {
	int nextX = playerX + dx;
	int nextY = playerY + dy;

	//判断主角角色是否可以移动
	if (board[nextX][nextY] == EMPTY || board[nextX][nextY] == TARGET) {
		board[playerX][playerY] = EMPTY;
		playerX = nextX;
		playerY = nextY;
		board[playerX][playerY] = PLAYER;
	}
	else if (board[nextX][nextY] == BOX && (board[nextX + dx][nextY + dy] == EMPTY || board[nextX + dx][nextY + dy] == TARGET)) {
		//判断主角角色是否可以推动木箱
		board[playerX][playerY] = EMPTY;
		playerX = nextX;
		playerY = nextY;
		board[playerX][playerY] = PLAYER;
		board[nextX + dx][nextY + dy] = BOX;
		board[nextX][nextY] = EMPTY;
	}

	//判断是否完成任务
	if (board[2][8] == BOX && board[4][2] == BOX && board[6][5] == BOX) {
		score += 100;
		printf("Congratulations! You win!\n");
		Sleep(2000);
		exit(0);
	}
}

//控制主角角色移动
void Control() {
	char c = getch();
	switch (c) {
	case 'w':
		UpdateGame(-1, 0);
		break;
	case 's':
		UpdateGame(1, 0);
		break;
	case 'a':
		UpdateGame(0, -1);
		break;
	case 'd':
		UpdateGame(0, 1);
		break;
	default:
		break;
	}
}

//判断游戏是否结束
void CheckGameOver() {
	if (board[playerX - 1][playerY] == WALL || board[playerX + 1][playerY] == WALL || board[playerX][playerY - 1] == WALL || board[playerX][playerY + 1] == WALL) {
		printf("Game over! You lose!\n");
		Sleep(2000);
		exit(0);
	}
}

//游戏暂停
void Pause() {
	Sleep(100);
}

//游戏结束
void GameOver() {
	printf("Your final score is: %d\n", score);
	exit(0);
}

int main() {
	//初始化游戏界面
	InitGame();

	//游戏循环
	while (1) {
		DrawGame();
		Control();
		CheckGameOver();
		Pause();
	}

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目介绍
  • 二、代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档