文章目錄
- 1.前言
- 2.效果展示
- 3.圖形界面如何添加
- 3.1工具的選擇
- 3.2 easyx庫中一些函式的使用
- 3.2.1頭檔案的包含
- 3.2.2 加載一個圖形化界面
- 3.2.3 圖片變數的宣告
- 3.2.4 圖片的儲存位置
- 4.圖片定義和列印
- 4.1圖片的定義
- 4.2圖片的列印
- 5.完整代碼
1.前言
前面撰寫了兩次拖箱子,一次普通版本,一次完善了基本功能,這次給推箱子加上圖形界面,因此這次主要是講圖形界面的添加;如果想要了解前面的設計可以看看我下面這兩篇博客
第一次簡單圖箱子設計鏈接;
功能完善版推箱子鏈接;
2.效果展示

3.圖形界面如何添加
3.1工具的選擇
百度 easyx圖形庫

3.2 easyx庫中一些函式的使用
3.2.1頭檔案的包含
想要呼叫一些函式,首先得先在頭檔案夾中包含 graphics.h表示呼叫easyx這個庫,這和我們平時使用其它的標準庫是一樣的;
3.2.2 加載一個圖形化界面
平時我們的視窗是編譯器自帶的是不能顯示圖片的,因此我們需要加載一個新的圖形化視窗;

3.2.3 圖片變數的宣告
平常我們使用變數都需要宣告定義,圖形變數也是一樣的,不過它的關鍵字是IMAGE;同時我們想要顯示圖片還得加載圖片,然后再選擇從什么位置開始顯示圖片;

我們還可以改變加載圖片的大小

3.2.4 圖片的儲存位置
記得將圖片存盤在我們代碼所在的檔案夾,這樣才能加載出來,否則加載函式內部填寫的路徑就要改為絕對路徑
4.圖片定義和列印
4.1圖片的定義
如下面代碼所示:
首先將需要的圖片素材改好名字存放在對應的檔案夾里;
定義我們需要的圖片,呼叫一個圖形視窗,將需要的圖片加載進來;
//定義圖片變數
IMAGE mm;//背景
IMAGE room;//地板
IMAGE box;//箱子
IMAGE people;//人物
IMAGE wall;//墻壁
IMAGE lable;//目標點
IMAGE over;//箱子進入目標點
IMAGE people2;//人物進入目標點
void Load()
{
initgraph(1000, 1000);
loadimage(&room,"room.jpg",50, 50);
loadimage(&mm, "mm.jpg", 1000, 1000);
loadimage(&box, "box.jpg", 50, 50);
loadimage(&people, "people.jpg", 50, 50);
loadimage(&wall, "wall.jpg", 50, 50);
loadimage(&lable, "lable.jpg", 50, 50);
loadimage(&over, "over.jpg", 50, 50);
loadimage(&people2, "people2.jpg", 50, 50);
}
4.2圖片的列印
如圖所示我們以前是直接輸出字符,但是在呼叫的圖形視窗之中,列印函式需要變為putimage(x, y, &over);即將對應的圖片列印出來而不是將我們的符號列印出來
void ShowMap(char arr[][LINE])//列印地圖
{ //x,y代表在視窗的什么位置開始列印圖片,因為圖片是由大小的,所以我們的列印坐標需要改變,
//本次加載的圖片大小為50*50,因此我們需要改變x和y的坐標
putimage(0, 0, &mm);
int x = 0;
int y = 0;
for (int i = 0; i < ROW; i++)
{
y = i * 50;
for (int j = 0; j < LINE; j++)
{
x = j * 50;
if (arr[i][j]==1)//地板
putimage(x, y, &room);
if (arr[i][j] == 0)//墻壁
putimage(x, y, &wall);
else if (arr[i][j] == 2)//列印箱子
putimage(x, y, &box);
else if (arr[i][j] == 3)//列印目的點
putimage(x, y, &lable);
else if (arr[i][j] == 4)//列印人物
putimage(x, y, &people);
else if (arr[i][j] == 5)//列印人物和目標點重疊后的圖案
putimage(x, y, &people2);
else if (arr[i][j] == 6)//箱子進入目標點后的圖案
putimage(x, y, &over);
}
}
}
5.完整代碼
#include "game.h"
//定義圖片變數
IMAGE mm;//背景
IMAGE room;//地板
IMAGE box;//箱子
IMAGE people;//人物
IMAGE wall;//墻壁
IMAGE lable;//目標點
IMAGE over;//箱子進入目標點
IMAGE people2;//人物進入目標點
void Load()//加載視窗和圖片
{
initgraph(1000, 1000);
loadimage(&room,"room.jpg",50, 50);
loadimage(&mm, "mm.jpg", 1000, 1000);
loadimage(&box, "box.jpg", 50, 50);
loadimage(&people, "people.jpg", 50, 50);
loadimage(&wall, "wall.jpg", 50, 50);
loadimage(&lable, "lable.jpg", 50, 50);
loadimage(&over, "over.jpg", 50, 50);
loadimage(&people2, "people2.jpg", 50, 50);
}
void ShowMap(char arr[][LINE])//列印地圖
{
putimage(0, 0, &mm);
int x = 0;
int y = 0;
for (int i = 0; i < ROW; i++)
{
y = i * 50;
for (int j = 0; j < LINE; j++)
{
x = j * 50;
if (arr[i][j]==1)//地板
putimage(x, y, &room);
if (arr[i][j] == 0)//墻壁
putimage(x, y, &wall);a
else if (arr[i][j] == 2)//列印箱子
putimage(x, y, &box);
else if (arr[i][j] == 3)//列印目的點
putimage(x, y, &lable);
else if (arr[i][j] == 4)//列印人物
putimage(x, y, &people);
else if (arr[i][j] == 5)//列印人物和目標點重疊后的圖案
putimage(x, y, &people2);
else if (arr[i][j] == 6)//箱子進入目標點后的圖案
putimage(x, y, &over);
}
}
}
void Move(char arr[][LINE], int *row, int *line, char retarr[][LINE], int *retrow, int *retline)//移動小人兒
{
while (1)
{
int newrow = *row;
int newline = *line;
int quit = 0;
outtextxy(0,500,"請通過w,s,a,d,控制上下左右,輸入r回傳");
//printf("請通過w,s,a,d,控制上下左右,輸入r回傳\n");
int move = 0;
int c = 0;
while (!quit)
{
move = getchar();//從標準輸入讀取字符
while ((c = getchar()) != '\n');//吃掉多余的字符以及空格
switch (move)
{
case 'w':
newrow--;//向上移動
quit = 1;
break;
case 's':
newrow++;//向下移動
quit = 1;
break;
case 'a':
newline--;//向左移動
quit = 1;
break;
case 'd':
newline++;//向右移動
quit = 1;
break;
case 'r':
quit = 1;
break;
default:
outtextxy(0, 500, "輸入有誤,請從新輸入");
//printf("輸入有誤,請從新輸入\n");
break;
}
}
if (move == 'r')//回傳
{
cleardevice();
ShowMap(retarr);//列印舊地圖
Retain(arr, retarr);//地圖內容更換為上一步的內容
//將小人坐標替換為上一步的小人坐標
*row = *retrow;
*line = *retline;
break;
}
Save(retarr, arr, row, line, retrow, retline);//此時已經不需要回傳,坐標更新前保存一份
if (arr[newrow][newline] == 0)//下一個坐標為墻壁
{
printf("禁止前行\n");
break;
}
else//前面為空白,箱子,或者目標點,或者箱子到目標點后的結合圖案(也是箱子)
{
if (arr[newrow][newline] == 1)//為空白
{
arr[newrow][newline] = 4;//將小人移動到坐標點
if (arr[*row][*line] == 5)//此時小人與目標重合,
{
arr[*row][*line] = 3;//那么出來后就變成目標點了;
}
else
{
arr[*row][*line] = 1;//小人的地方變為空白
}
//坐標更新
*row = newrow;
*line = newline;
}
else if (arr[newrow][newline] == 3)//為目標點
{
arr[newrow][newline] = 5;//小人兒和目標點重合的影像
if (arr[*row][*line] == 5)//此時小人與目標重合,
{
arr[*row][*line] = 3;//那么出來后就變成目標點了;
}
else
{
arr[*row][*line] = 1;//小人的地方變為空白
}
//坐標更新
*row = newrow;
*line = newline;
}
else if (arr[newrow][newline] == 2 || arr[newrow][newline] == 6)//下一個點為箱子或者箱子和目標點的結合圖案
{
int nextrow = newrow;
int nextline = newline;
if (move == 'w')//上
nextrow = newrow - 1;
else if (move == 's')//下
nextrow = newrow + 1;
else if (move == 'a')//左
nextline = newline - 1;
else//右
nextline = newline + 1;
if (arr[nextrow][nextline] == 0 || arr[nextrow][nextline] == 2 || arr[nextrow][nextline] == 6)
//箱子前面是墻壁或者箱子或者箱子和目標點的結合
{
printf("移動不了,箱子前方有障礙\n");
break;
}
else //箱子前面不是墻壁
{
if (arr[nextrow][nextline] == 3)//箱子前面是目標點
{
arr[nextrow][nextline] = 6;//箱子前挪,圖案變成箱子和目標點重合的圖案
}
else//箱子前面是空白
{
arr[nextrow][nextline] = 2;//空白處變成箱子
}
if (arr[newrow][newline] == 6)//原箱子位置是目標點
{
arr[newrow][newline] = 5;//變成目標點和小人兒的結合
}
else
{
arr[newrow][newline] = 4;//箱子位置變為人
}
if (arr[*row][*line] == 5)//此時小人與目標點重合,
{
arr[*row][*line] = 3;//那么出來后就變成目標點了;
}
else
{
arr[*row][*line] = 1;//小人的地方變為空白
}
//坐標更新
*row = newrow;
*line = newline;
}
}
}
//進行移動之后的地圖列印;
cleardevice();
ShowMap(arr);
break;
}
}
void Judge(char arr[][LINE], int *boxs)
{
int temp = 0;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < LINE; j++)
{
if (arr[i][j] == 3 || arr[i][j] == 5)//剩余目標點數以及人物進入了目標點
temp++;
}
}
*boxs = temp;
}
void Retain(char retarr[][LINE], char arr[][LINE])//保存舊地圖
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < LINE; j++)
{
retarr[i][j] = arr[i][j];
}
}
}
void Save(char retarr[][LINE], char arr[][LINE], int *row, int *line, int *retrow, int *retline)//更新前內容保存
{
Retain(retarr, arr);//內容新前將其保存一份;
//小人坐標更新前保存一份
*retrow = *row;
*retline = *line;
}
void SlectMap(char arr[][LINE], char map[][ROW][LINE], int select)//選擇地圖
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < LINE; j++)
{
arr[i][j] = map[select][i][j];
}
}
}
char map[2][10][10] = { //0位墻壁■,1位空白,2為箱子●,3為目的點¤,4為人♀,5為小人兒與目標點重合★,6為箱子進入了目標點☆
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 3, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 1, 1, 1, 1, 3, 1, 0 },
{ 0, 1, 1, 1, 2, 1, 1, 1, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 1, 2, 1, 0, 1, 2, 0, 0, 0 },
{ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 0, 0, 1, 1, 1, 1, 1, 3, 0 },
{ 0, 3, 1, 2, 1, 4, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},//地圖1
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 3, 0, 0, 0, 0, 0, 1, 3, 0 },
{ 0, 3, 0, 1, 1, 1, 1, 3, 1, 0 },
{ 0, 1, 1, 1, 2, 1, 2, 1, 1, 0 },
{ 0, 1, 2, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 1, 1, 2, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 2, 1, 1, 0 },
{ 0, 3, 0, 2, 1, 0, 1, 1, 0, 0 },
{ 0, 3, 1, 1, 1, 4, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
};
void Game()
{
Load();
char arr[ROW][LINE];
int select = 0;
int quit = 0;
while (!quit)
{
outtextxy(0,0,"請選擇你的關卡");
outtextxy(0,30,"###########################");
outtextxy(0,60,"1.第一關##########2.第二關###");
outtextxy(0,90,"###########################");
scanf("%d", &select);
switch (select)
{
case 1:
select = 0;//陣列下標從0開始
SlectMap(arr, map, select);
quit = 1;
break;
case 2:
select = 1;
SlectMap(arr, map, select);
quit = 1;
break;
default:
outtextxy(0, 0, "輸入有誤,請從新輸入");
}
}
ShowMap(arr);
int row = 8, line = 5;//小人初始橫縱坐標
int boxs = 4;//還未到達目標點的盒子數
char retarr[ROW][LINE];
Retain(retarr, arr);//先保存一份,直接按回傳不會出錯
int retrow = row, retline = line;//舊的小人地址
while (boxs)
{
Move(arr, &row, &line, retarr, &retrow, &retline);//移動小人
Judge(arr, &boxs);//剩余目標點數
if (boxs == 0)
outtextxy(0, 0, "恭喜你,通關成功");
}
}
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma warning (disable :4996)
#include <graphics.h>
#define ROW 10
#define LINE 10
void Load();
void SlectMap(char arr[][LINE], char[][ROW][LINE], int select);
void Game();
void Retain(char retarr[][LINE], char arr[][LINE]);
void Save(char retarr[][LINE], char arr[][LINE], int *row, int *line, int *retrow, int *retline);
#endif
#include "game.h"
int main()
{
Game();
getchar();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240466.html
標籤:其他
上一篇:游戲地圖背景移動C++
下一篇:游戲產業鏈:游戲分發/渠道商
