Question: For this project, you are given a program that implements a game where a human user tries to escape from four robots. The user and
For this project, you are given a program that implements a game where a human user tries to escape from four robots. The user and four robots are on an x-y grid. On every step, you enter a move for the human. The robots will attempt to get closer to the human. When a robot has the same x-y coordinates as the human, the game is over. You will translate this program faithfully, following all function call guidelines and MIPS register use conventions. Two arrays x[4] and y[4] keep track of the x- and y-coordinates of four robots. The positions of the human and the four robots are initialized in the program. On each step, the user enters a move; the positions of the human and the robots are updated. This continues until the human dies. This figure gives an idea of the game; well work with a text-only version, sorry.
C++ code and part of MIPS code can be found below:
#C++ code:
#include
int moveRobots(int *, int *, int, int ); int getNew(int, int);
int main() { int x[4], y[4], i, j, myX = 25, myY = 25, move, status = 1;
// initialize positions of four robots x[0] = 0; y[0] = 0; x[1] = 0; y[1] = 50; x[2] = 50; y[2] = 0; x[3] = 50; y[3] = 50;
cout << "Your coordinates: 25 25 ";
while (status == 1) { cout << "Enter move (1 for +x, -1 for -x, 2 for + y, -2 for -y):"; cin >> move;
// process user's move if (move == 1) myX++; else if (move == -1) myX--; else if (move == 2) myY++; else if (move == -2) myY--;
// update robot positions status = moveRobots(&x[0],&y[0],myX,myY);
cout << "Your coordinates: " << myX << " " << myY << endl; for (i=0;i<4;i++) cout << "Robot at " << x[i] << " " << y[i] << endl;
} cout << "AAAARRRRGHHHHH... Game over "; }
int moveRobots(int *arg0, int *arg1, int arg2, int arg3) { int i, *ptrX, *ptrY, alive = 1;
ptrX = arg0; ptrY = arg1; for (i=0;i<4;i++) { *ptrX = getNew(*ptrX,arg2); // update x-coordinate of robot i *ptrY = getNew(*ptrY,arg3); // update y-coordinate of robot i
// check if robot caught user if ((*ptrX == arg2) && (*ptrY == arg3)) { alive = 0; break; } ptrX++; ptrY++; } return alive; }
// move coordinate of robot closer to coordinate of user int getNew(int arg0, int arg1) { int temp, result;
temp = arg0 - arg1; if (temp >= 10) result = arg0 - 10; else if (temp > 0) result = arg0 - 1; else if (temp == 0) result = arg0; else if (temp > -10) result = arg0 + 1; else if (temp <= -10) result = arg0 + 10;
return result; }
MIPS code:
#
# A proper program header goes here...
#
#
.data
x: .word 0:4 # x-coordinates of 4 robots
y: .word 0:4 # y-coordinates of 4 robots
str1: .asciiz "Your coordinates: 25 25 "
str2: .asciiz "Enter move (1 for +x, -1 for -x, 2 for + y, -2 for -y):"
str3: .asciiz "Your coordinates: "
sp: .asciiz " "
endl: .asciiz " "
str4: .asciiz "Robot at "
str5: .asciiz "AAAARRRRGHHHHH... Game over "
#i $s0
#myX $s1
#myY $s2
#move $s3
#status $s4
#temp,pointers $s5,$s6
.text
.globl inc
.globl getNew
main: li $s1,25 # myX = 25
li $s2,25 # myY = 25
li $s4,1 # status = 1
la $s5,x
la $s6,y
sw $0,($s5) # x[0] = 0; y[0] = 0;
sw $0,($s6)
sw $0,4($s5) # x[1] = 0; y[1] = 50;
li $s7,50
sw $s7,4($s6)
sw $s7,8($s5) # x[2] = 50; y[2] = 0;
sw $0,8($s6)
sw $s7,12($s5) # x[3] = 50; y[3] = 50;
sw $s7,12($s6)
la $a0,str1 # cout << "Your coordinates: 25 25 ";
li $v0,4
syscall
bne $s4,1,exitw # while (status == 1) {
while: la $a0,str2 # cout << "Enter move (1 for +x,
li $v0,4 # -1 for -x, 2 for + y, -2 for -y):";
syscall
li $v0,5 # cin >> move;
syscall
move $s3,$v0
bne $s3,1,else1 # if (move == 1)
add $s1,$s1,1 # myX++;
b exitif
else1: bne $s3,-1,else2 # else if (move == -1)
add $s1,$s1,-1 # myX--;
b exitif
else2: bne $s3,2,else3 # else if (move == 2)
add $s2,$s2,1 # myY++;
b exitif
else3: bne $s3,-2,exitif # else if (move == -2)
add $s2,$s2,-1 # myY--;
exitif: la $a0,x # status = moveRobots(&x[0],&y[0],myX,myY);
la $a1,y
move $a2,$s1
move $a3,$s2
jal moveRobots
move $s4,$v0
la $a0,str3 # cout << "Your coordinates: " << myX
li $v0,4 # << " " << myY << endl;
syscall
move $a0,$s1
li $v0,1
syscall
la $a0,sp
li $v0,4
syscall
move $a0,$s2
li $v0,1
syscall
la $a0,endl
li $v0,4
syscall
la $s5,x
la $s6,y
li $s0,0 # for (i=0;i<4;i++)
for: la $a0,str4 # cout << "Robot at " << x[i] << " "
li $v0,4 # << y[i] << endl;
syscall
lw $a0,($s5)
li $v0,1
syscall
la $a0,sp
li $v0,4
syscall
lw $a0,($s6)
li $v0,1
syscall
la $a0,endl
li $v0,4
syscall
add $s5,$s5,4
add $s6,$s6,4
add $s0,$s0,1
blt $s0,4,for
beq $s4,1,while
# }
exitw: la $a0,str5 # cout << "AAAARRRRGHHHHH... Game over ";
li $v0,4
syscall
li $v0,10 #}
syscall
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
