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

一、项目介绍

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

image-20230618212712519

实现步骤如下:

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

二、代码实现

image-20230618212645898

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78922.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在服务器上搭建gitlab

目录 1.在服务器上下载gitlab 2.编辑站点位置 3.重载配置 4.访问gitlab 最终效果展示&#xff1a; 官方文档&#xff1a; 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.r…

C. Mark and His Unfinished Essay - 思维

分析&#xff1a; 直接模拟操作会mle&#xff0c;可以每次复制记录对应源字符串的下标&#xff0c;可以记录每次字符串增加的长度的左右端点下标&#xff0c;可以发现左端点与读入的l是对应的&#xff0c;因此就可以向前移到l的位置&#xff0c;这样层层递归&#xff0c;就能找…

设计模式之适配器模式

一、概述 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 二、适用性 1.你想使用一个已经存在的类&#xff0c;而它的接口不符合你的需求。 2.你想创建一个可以复用的类&#xff0c;该类可以与其他不…

el-popover使用自定义图标

使用el-popover实现鼠标点击或浮动到自定义图标上弹出表格弹窗&#xff0c;官方文档上使用的是按钮el-button&#xff0c;如果想换成图标或其他的组件的话直接把el-button替换掉即可。注意替换之后的组件一定要加slot“reference”&#xff0c;不然组件是显示不出来的。 代码如…

ProxyGenerator-代理类生成器

ProxyGenerator是JDK-sun包下提供的用于生成动态代理类信息的类&#xff0c;其唯一向外透出的是其静态方法-generateProxyClass(…)。 public class ProxyGenerator { ... }学习本篇文章&#xff0c;就是想学习ProxyGenerator如何生成代理类信息的过程。 一、唯一入口-公开静…

Misc取证学习

文章目录 Misc取证学习磁盘取证工具veracryto挂载fat文件DiskGenius 磁盘取证例题[RCTF2019]disk 磁盘[](https://ciphersaw.me/ctf-wiki/misc/disk-memory/introduction/#_2)内存取证工具volatility 内存取证例题数字取证赛题0x01.从内存中获取到用户admin的密码并且破解密码 …

LangChain手记 Overview

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Overview 综述&#xff08;Overview&#xff09; LangChain是为大模型应用开发设计的开源框架 LangChain目前提供Python和JavaScript&#xff08;TypeScript&#xff09;两种语言的包 LangChain的主攻方向是聚合和…

使用docker部署一个jar项目

简介: 通过docker镜像, docker可以在服务器上运行包含项目所需运行环境的docker容器, 在线仓库里有很多各个软件公司官方发布的镜像, 或者第三方的镜像. 如果我们需要使用docker把我们的应用程序打包成镜像, 别的机器上只要安装了docker, 就可以直接运行镜像, 而不需要再安装应…

基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练 广告生成 任务

一、ChatYuan-large-v2 ChatYuan-large-v2是一个开源的支持中英双语的功能型对话语言大模型&#xff0c;与其他 LLM 不同的是模型十分轻量化&#xff0c;并且在轻量化的同时效果相对还不错&#xff0c;仅仅通过0.7B参数量就可以实现10B模型的基础效果&#xff0c;正是其如此的…

VBA技术资料MF40:VBA_计数筛选状态的数据行数

【分享成果&#xff0c;随喜正能量】人唯有与喜欢的事物发展关系&#xff0c;不管是人或者是物还是事&#xff0c;包括喜欢自己外表、个性的部分&#xff0c;喜欢自己做的事&#xff0c;喜欢自己的创造&#xff0c;喜欢的风景……才给人带来对自己的认同。在与喜欢的事物互动关…

【Linux命令详解 | cd命令】Linux系统中用于更改当前工作目录的命令

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 使用cd命令切换到特定目录2. 使用cd命令与路径相关的特殊字符3. 使用cd命令切换到包含空格的目录4. 使用cd命令切换到前一个和后一个目录5. 使用cd命令切换到用户的主目录6. 使用cd命令与绝对路径和相对路径 总结…

Vue day01

Vue 1.简介&#xff1a; ​ Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅容易上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工…

【Docker】DockerFile

目录 一、镜像原理 二、如何制作镜像 1、容器转镜像 2、DockerFile 三、DockerFile关键字​编辑 四、案例&#xff1a;部署SpringBoot项目 一、镜像原理 docker镜像是由一个特殊的文件系统叠加而成的&#xff0c;他的最低端是bootfs&#xff0c;并使用宿主机的bootfs&…

Maven设置阿里云路径(防止加载过慢)

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …

【web逆向】全报文加密流量的去加密测试方案

aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文&#xff1a;请求和响应都是全加密&#xff0c;这种情况就不像参数加密可以方便全文搜索定位加密代码&#xff0c;但因为前端必须解密响应的密文&#xff0c;因此万能的方法就是搜索拦截器&#xff0c…

Golang之路---04 并发编程——WaitGroup

WaitGroup 为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出&#xff0c;前面使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的&#xff0c; sleep 个 1 秒&#xff0c;我们主观上认为是够用的。 但在实际开发中&#xff0c;开发人员是无法…

Swish - Mac 触控板手势窗口管理工具[macOS]

Swish for Mac是一款Mac触控板增强工具&#xff0c;借助直观的两指轻扫&#xff0c;捏合&#xff0c;轻击和按住手势&#xff0c;就可以从触控板上控制窗口和应用程序。 Swish for Mac又不仅仅只是一个窗口管理器&#xff0c;Swish具有28个易于使用的标题栏&#xff0c;停靠栏…

设计模式之策略模式(Strategy)

一、概述 定义一系列的算法&#xff0c;把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2.需要使用一个算法的不同变体。…

【DFS】17. 电话号码的字母组合

【DFS】17. 电话号码的字母组合 Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我bua&#xff01; TOC 题目: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rikjhVFD-1691333891079)(C:\Us…

高成本帖子——RDK X3模组快速体验载板辅助选型

转眼&#xff0c;又是一年了&#xff0c;还记得22年6月自己第一次体验X3开发板 [首发] 多方位玩转“地平线新发布AIoT开发板——旭日X3派(Sunrise x3 Pi)” 。至今还记得拿到手的新奇与兴奋&#xff0c;还记得第一次玩BPU就遇到了大坑&#xff0c;第一次发帖就把论坛搞崩。如今…