The problems that 0X01 encountered
Windows can use the Getch () function, which is entered as an input stream. (simply by pressing a button, you can react without clicking return). But in a Linux environment, there is no connio.h header file for this function. But every time you press the return of the car is still quite inverse days. But I found a replacement on the Internet (thank you Ghost)
http://my.oschina.net/yougui/blog/111345
0X02 Code Implementation
/*******************************************************************
* Project Name:push the Boxs
* Create date:2015.10.17
* Last Modify date:2015.10.19
* Auther Name:mouse_ts
* E-mail address:michaelhaozi@hotmail.com
* Description:this is game, your control a boy push the Boxs
* to the destination. But you can ' t push the stone and two boxs.
* If you are "R box Touch" wall, you can ' t pull it.
* ****************************************************************/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <termios.h>//using getch ()
#include <unistd.h>
#include <assert.h>
This is constant
#define TRUE 1
#define FALSE 0
#define MAX 10
#define WALL 6
#define PLAYER 7
#define BOX 8
#define BLANK 5
#define DES 9
#define W ' W '
#define a ' a '
#define S ' s '
#define d ' d '
This is game map
int Map[max][max];
int OK = 0;
Player
struct player
{
int x;
int y;
}player;
Boxs
struct box
{
int x;
int y;
}box_1, Box_2, box_3;
Des
struct des
{
int x;
int y;
}des_1, Des_2, Des_3;
statement function
void Initmap (); Init the Map
void Initplayer (); Init the player
void Initbox (); Init the Boxs
void Initdes (); Init the DES
void Printmap (); Print the Map
void Setmap (); Set the player, Boxs, des
Char Getch (); Getch ()
void Goup (); Go up
void Godown (); Go down
void Goleft (); Go left
void GoRight (); Go right
int computingsuccess ()//computing How many box SECCESSD
int main ()
{
Char ch;
System ("clear");
Init the game
Initmap ();
Initplayer ();
Initbox ();
Setmap ();
Printmap ();
Control the boy
while (ch = getch ())
{
Switch (CH)//where is the boy move
{
Case W:
Goup ();
Break
Case A:
Goleft ();
Break
Case S:
Godown ();
Break
Case D:
GoRight ();
Break
Defualt:
printf ("You should press W, a, S, D to control the boy to Move\n");
}
Setmap ();
System ("clear");
Printmap ();
if (computingsuccess () = = 3)
Break
Else
Continue
}
System ("clear");
printf ("\n\n\n\n\n\n\n you win the game!\n");
Getch ();
System ("clear");
return 0;
}
Getch () by. Yougui http://my.oschina.net/yougui/blog/111345
Char Getch ()
{
int c = 0;
struct Termios org_opts, new_opts;
int res = 0;
res = tcgetattr (Stdin_fileno, &org_opts);
ASSERT (res = = 0);
memcpy (&new_opts, &org_opts, sizeof (new_opts));
New_opts.c_lflag &= ~ (Icanon | ECHO | Echoe | Echok | echonl | Echoprt | Echoke | ICRNL);
Tcsetattr (Stdin_fileno, Tcsanow, &new_opts);
c = GetChar ();
res = tcsetattr (Stdin_fileno, Tcsanow, &org_opts);
ASSERT (res = = 0);
return C;
}
Init this map
void Initmap ()
{
int I, J;
for (i = 0; i < MAX; i++)
{
for (j = 0; J < MAX; J + +)
{
MAP[I][J] = WALL;
}
}
for (i = 2; i < 8; i++)
{
MAP[I][2] = BLANK;
MAP[I][3] = BLANK;
MAP[I][5] = BLANK;
MAP[I][6] = BLANK;
MAP[I][7] = BLANK;
}
MAP[5][4] = BLANK;
Initdes ();
}
Print Map
void Printmap ()
{
printf ("This is a game!\n");
int I, J;
for (i = 0; i < MAX; i++)
{
for (j = 0; J < MAX; J + +)
{
if (map[i][j] = = WALL)
printf ("#");
else if (map[i][j] = = BOX)
printf ("@");
else if (map[i][j] = = PLAYER)
printf ("X");
else if (map[i][j] = = BLANK)
printf ("");
else if (map[i][j] = = DES)
printf ("O");
}
printf ("\ n");
}
}
Init the player
void Initplayer ()
{
Player.x = 2;
PLAYER.Y = 2;
}
Init the Boxs
void Initbox ()
{
box_1.x = 3;
BOX_1.Y = 6;
box_2.x = 4;
BOX_2.Y = 3;
box_3.x = 6;
BOX_3.Y = 3;
}
Init the DES
void Initdes ()
{
des_1.x = 5;
DES_1.Y = 7;
des_2.x = 6;
DES_2.Y = 7;
des_3.x = 7;
DES_3.Y = 7;
}
Set map
void Setmap ()
{
int I, J;
Set blank
for (i = 2; i < 8; i++)
{
MAP[I][2] = BLANK;
MAP[I][3] = BLANK;
MAP[I][5] = BLANK;
MAP[I][6] = BLANK;
MAP[I][7] = BLANK;
}
MAP[5][4] = BLANK;
Set des
MAP[DES_1.X][DES_1.Y] = des;
MAP[DES_2.X][DES_2.Y] = des;
MAP[DES_3.X][DES_3.Y] = des;
Set player
MAP[PLAYER.X][PLAYER.Y] = player;
Set box
MAP[BOX_1.X][BOX_1.Y] = box;
MAP[BOX_2.X][BOX_2.Y] = box;
MAP[BOX_3.X][BOX_3.Y] = box;
}
Computing the "Success move" box to the DES
int computingsuccess ()
{
int num = 0;
if (map[des_1.x][des_1.y] = = BOX)
num++;
if (map[des_2.x][des_2.y] = = BOX)
num++;
if (map[des_3.x][des_3.y] = = BOX)
num++;
return num;
}
/*
* After this ' is ' Control your boy '
* All of the ' functions to ' control ' boy to move
*/
Control the boy go up
void Goup ()
{
if (map[player.x-1][player.y] = = BLANK | |
MAP[PLAYER.X-1][PLAYER.Y] = = DES)
{
player.x--;
return;
}
if (player.x-1 = = box_1.x && player.y = box_1.y &&
MAP[BOX_1.X-1][BOX_1.Y] = = BLANK | |
Player.x-1 = = box_1.x && Player.y = = Box_1.y &&
MAP[BOX_1.X-1][BOX_1.Y] = = DES)
{
box_1.x--;
player.x--;
return;
}
else if (player.x-1 = box_2.x && player.y = box_2.y &&
MAP[BOX_2.X-1][BOX_2.Y] = = BLANK | |
Player.x-1 = = box_2.x && Player.y = = Box_2.y &&
MAP[BOX_2.X-1][BOX_2.Y] = = DES)
{
box_2.x--;
player.x--;
return;
}
else if (player.x-1 = box_3.x && player.y = box_3.y &&
MAP[BOX_3.X-1][BOX_3.Y] = = BLANK | |
Player.x-1 = = box_3.x && Player.y = = Box_3.y &&
MAP[BOX_3.X-1][BOX_3.Y] = = DES)
{
box_3.x--;
player.x--;
return;
}
}
Control of the boy go down
void Godown ()
{
if (map[player.x + 1][player.y] = = BLANK | |
Map[player.x + 1][player.y] = = DES)
player.x++;
if (player.x + 1 = box_1.x && player.y = box_1.y &&
map[box_1.x + 1][box_1.y] = = BLANK | |
player.x + 1 = box_1.x && player.y = box_1.y &&
map[box_1.x + 1][box_1.y] = = DES)
{
box_1.x++;
player.x++;
return;
}
else if (player.x + 1 = box_2.x && player.y = box_2.y &&
map[box_2.x + 1][box_2.y] = = BLANK | |
player.x + 1 = box_2.x && player.y = box_2.y &&
map[box_2.x + 1][box_2.y] = = DES)
{
box_2.x++;
player.x++;
return;
}
else if (player.x + 1 = box_3.x && player.y = box_3.y &&
map[box_3.x + 1][box_3.y] = = BLANK | |
player.x + 1 = box_3.x && player.y = box_3.y &&
map[box_3.x + 1][box_3.y] = = DES)
{
box_3.x++;
player.x++;
return;
}
}
Control the boy to left
void Goleft ()
{
if (map[player.x][player.y-1] = = BLANK | |
Map[player.x][player.y-1] = = DES)
player.y--;
if (player.x = = box_1.x && player.y-1 = box_1.y &&
Map[box_1.x][box_1.y-1] = = BLANK | |
Player.x = = box_1.x && player.y-1 = = Box_1.y &&
Map[box_1.x][box_1.y-1] = = DES)
{
box_1.y--;
player.y--;
return;
}
else if (player.x = box_2.x && player.y-1 = box_2.y &&
Map[box_2.x][box_2.y-1] = = BLANK | |
Player.x = = box_2.x && player.y-1 = = Box_2.y &&
Map[box_2.x][box_2.y-1] = = DES)
{
box_2.y--;
player.y--;
return;
}