網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
本游戲需要用到的核心技術(shù),如下:
二維數(shù)組分支語(yǔ)句技術(shù)難點(diǎn): 二維數(shù)組的應(yīng)用和游戲的判斷邏輯
只要會(huì)以上的技術(shù)的萌新都能做出很棒的游戲,博主本身也是一枚小白,如果源代碼的某些地方有不足,請(qǐng)大佬在評(píng)論區(qū)指出。
游戲效果圖

游戲開(kāi)發(fā)思路
分析游戲邏輯,再根據(jù)游戲分析游戲代碼邏輯寫(xiě)出偽代碼,再分析可能存在的問(wèn)題,最后一步才是開(kāi)發(fā)游戲。
游戲邏輯的分析

源代碼實(shí)現(xiàn)
? 頭文件
#pragma once #include <stdio.h> #include <Windows.h> #define ROW 10 #define COL 10 enum Control { 上 = 72, 下 = 80, 左 = 75, 右 = 77 }; extern void Game(); extern void DisplayBoard(int board[ROW][COL]); extern void MovePlayer(int board[ROW][COL]); extern void PushBox(int board[ROW][COL], int y, int x, char ch); extern void MovePlay(int board[ROW][COL], int y, int x); extern int JudgeVictory(int board[ROW][COL]); extern void HelpMan();
PushBackGame.c文件
#include "PushBoxGame.h" void HelpMan() { system("cls"); printf("==============================\n"); printf("\t移動(dòng)操作\n"); printf("向上移動(dòng):\t↑\tw\n"); printf("向下移動(dòng):\t↓\ts\n"); printf("向左移動(dòng):\t←\ta\n"); printf("向右移動(dòng):\t→\td\n"); printf("------------------------------\n"); printf("\t功能性操作\n"); printf("游戲內(nèi)回到主菜單:\tz\n"); printf("==============================\n"); printf("按任意鍵退出.......\n"); _getch(); } int JudgeVictory(int board[ROW][COL]) { int i = 0; int j = 0; int count = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (5 == board[i][j]) { count++; } if (count == 4) { return 1; } } } return 0; } void MovePlay(int board[ROW][COL], int y, int x) { //看是空地還是存放點(diǎn) if (0 == board[y][x]) { board[y][x] = 6; } else if (3 == board[y][x]) { board[y][x] = 4; } } void PushBox(int board[ROW][COL], int y, int x, char ch) { //如果箱子在存放點(diǎn) if (5 == board[y][x]) { switch (ch) { case 'w': if (0 == board[y - 1][x]) { board[y--][x] = 4; board[y][x] = 2; } else if (3 == board[y - 1][x]) { board[y--][x] = 4; board[y][x] = 5; } break; case 's': if (0 == board[y + 1][x]) { board[y++][x] = 4; board[y][x] = 2; } else if (3 == board[y + 1][x]) { board[y++][x] = 4; board[y][x] = 5; } break; case 'a': if (0 == board[y][x - 1]) { board[y][x--] = 4; board[y][x] = 2; } else if (3 == board[y][x - 1]) { board[y][x--] = 4; board[y][x] = 5; } break; case 'd': if (0 == board[y][x + 1]) { board[y][x++] = 4; board[y][x] = 2; } else if (3 == board[y][x + 1]) { board[y][x++] = 4; board[y][x] = 5; } break; } } //沒(méi)在存放點(diǎn) else if (2 == board[y][x]) { switch (ch) { case 'w': if (0 == board[y - 1][x]) { board[y--][x] = 6; board[y][x] = 2; } else if (3 == board[y - 1][x]) { board[y--][x] = 6; board[y][x] = 5; } break; case 's': if (0 == board[y + 1][x]) { board[y++][x] = 6; board[y][x] = 2; } else if (3 == board[y + 1][x]) { board[y++][x] = 6; board[y][x] = 5; } break; case 'a': if (0 == board[y][x - 1]) { board[y][x--] = 6; board[y][x] = 2; } else if (3 == board[y][x - 1]) { board[y][x--] = 6; board[y][x] = 5; } break; case 'd': if (0 == board[y][x + 1]) { board[y][x++] = 6; board[y][x] = 2; } else if (3 == board[y][x + 1]) { board[y][x++] = 6; board[y][x] = 5; } break; } } } void MovePlayer(int board[ROW][COL]) { int x = 0; int y = 0; int i = 0; int j = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (6 == board[i][j]) { x = j; y = i; } } } do { DisplayBoard(board); switch (_getch()) { case 'w': case 'W': case 上: //判斷是在空地,還是在存放點(diǎn) if (6 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y - 2][x]) && !(5 == board[y - 2][x]) && !(1 == board[y - 2][x]) && (2 == board[y - 1][x] || 5 == board[y - 1][x])) { board[y--][x] = 0; PushBox(board, y, x, 'w'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y - 1][x] || 3 == board[y - 1][x]) { board[y--][x] = 0; MovePlay(board, y, x); } } else if (4 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y - 2][x]) && !(5 == board[y - 2][x]) && !(1 == board[y - 2][x]) && (2 == board[y - 1][x] || 5 == board[y - 1][x])) { board[y--][x] = 3; PushBox(board, y, x, 'w'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y - 1][x] || 3 == board[y - 1][x]) { board[y--][x] = 3; MovePlay(board, y, x); } } break; case 's': case 'S': case 下: //判斷是在空地,還是在存放點(diǎn) if (6 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y + 2][x]) && !(5 == board[y + 2][x]) && !(1 == board[y + 2][x]) && (2 == board[y + 1][x] || 5 == board[y + 1][x])) { board[y++][x] = 0; PushBox(board, y, x, 's'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y + 1][x] || 3 == board[y + 1][x]) { board[y++][x] = 0; MovePlay(board, y, x); } } else if (4 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y + 2][x]) && !(5 == board[y + 2][x]) && !(1 == board[y + 2][x]) && (2 == board[y + 1][x] || 5 == board[y + 1][x])) { board[y++][x] = 3; PushBox(board, y, x, 's'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y + 1][x] || 3 == board[y + 1][x]) { board[y++][x] = 3; MovePlay(board, y, x); } } break; case 'a': case 'A': case 左: //判斷是在空地,還是在存放點(diǎn) if (6 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y][x - 2]) && !(5 == board[y][x - 2]) && !(1 == board[y][x - 2]) && (2 == board[y][x - 1] || 5 == board[y][x - 1])) { board[y][x--] = 0; PushBox(board, y, x, 'a'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y][x - 1] || 3 == board[y][x - 1]) { board[y][x--] = 0; MovePlay(board, y, x); } } else if (4 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y][x - 2]) && !(5 == board[y][x - 2]) && !(1 == board[y][x - 2]) && (2 == board[y][x - 1] || 5 == board[y][x - 1])) { board[y][x--] = 3; PushBox(board, y, x, 'a'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y][x - 1] || 3 == board[y][x - 1]) { board[y][x--] = 3; MovePlay(board, y, x); } } break; case 'd': case 'D': case 右: //判斷是在空地,還是在存放點(diǎn) if (6 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y][x + 2]) && !(5 == board[y][x + 2]) && !(1 == board[y][x + 2]) && (2 == board[y][x + 1] || 5 == board[y][x + 1])) { board[y][x++] = 0; PushBox(board, y, x, 'd'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y][x + 1] || 3 == board[y][x + 1]) { board[y][x++] = 0; MovePlay(board, y, x); } } else if (4 == board[y][x]) { //如果人后面是箱子就移動(dòng)箱子 if (!(2 == board[y][x + 2]) && !(5 == board[y][x + 2]) && !(1 == board[y][x + 2]) && (2 == board[y][x + 1] || 5 == board[y][x + 1])) { board[y][x++] = 3; PushBox(board, y, x, 'd'); } //如果人后面不是箱子就移動(dòng)人 else if (0 == board[y][x + 1] || 3 == board[y][x + 1]) { board[y][x++] = 3; MovePlay(board, y, x); } } break; case 'z': return; } if (JudgeVictory(board)) { system("cls"); DisplayBoard(board); printf("恭喜通關(guān)!\n"); printf("按任意鍵繼續(xù)\n"); getchar(); _getch(); return; } } while (1); } void DisplayBoard(int board[ROW][COL]) { system("cls"); int i = 0; int j = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { switch (board[i][j]) { case 0: printf(" "); break; case 1: printf("■"); break; case 2: printf("□"); break; case 3: printf("☆"); break; case 4: printf("♂"); break; case 5: printf("★"); break; case 6: printf("♀"); break; } } putchar('\n'); } } void Game() { //墻壁:1 ■ //箱子:2 □ //箱子存放點(diǎn):3 ☆ //人在箱子存放點(diǎn):4 ♂ //箱子在箱子存放點(diǎn):5 ★ //人:6 ♀ int board[ROW][COL] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 1, 0, 2, 0, 0, 1, 0, 2, 0, 1 }, { 1, 0, 0, 2, 0, 1, 0, 0, 0, 1 }, { 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 }, { 1, 0, 2, 6, 1, 0, 0, 3, 3, 1 }, { 1, 0, 0, 0, 1, 0, 0, 3, 3, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, }; //DisplayBoard(board); MovePlayer(board); }
test.c文件
#include "PushBoxGame.h" #define nullptr ((void*) 0) int main() { int input = 0; do { system("color 3e"); system("mode con cols=30 lines=15"); system("cls"); printf("************************\n"); printf("**** 1. 開(kāi)始游戲 *****\n"); printf("**** 2. 幫助手冊(cè) *****\n"); printf("**** 0. 退出游戲 *****\n"); printf("************************\n"); printf("請(qǐng)輸入>:"); scanf("%d", &input); switch (input) { case 1: //游戲主體 Game(); break; case 2: HelpMan(); break; case 0: printf("游戲已退出\n"); break; default: printf("請(qǐng)輸入有效數(shù)字!\a\n"); Sleep(500); break; } } while (input); return 0; }
總結(jié)
原文鏈接:https://blog.csdn.net/qq_45326605/article/details/122561725
相關(guān)推薦
- 2023-01-05 find?命令全集_linux shell
- 2023-01-05 Python?optparse模塊及簡(jiǎn)單使用_python
- 2023-03-22 C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝_C 語(yǔ)言
- 2022-04-27 bash?shell獲取當(dāng)前腳本的絕對(duì)路徑(pwd/readlink)_linux shell
- 2022-09-29 關(guān)于numpy兩個(gè)array疊加操作詳解_python
- 2022-05-25 如何把自己寫(xiě)的jar包打進(jìn)本地maven倉(cāng)庫(kù)呢(也是springboot項(xiàng)目怎么打成SDK)
- 2022-05-29 C#實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能_C#教程
- 2022-06-16 C#實(shí)現(xiàn)優(yōu)先隊(duì)列和堆排序_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支