move.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 137 行

C
137
字号
#include <u.h>#include <libc.h>#include <draw.h>#include "sokoban.h"/* pretty ghastly, if you ask me */voidmove(int key){	Point g = level.glenda;	int moved = 0;	/* this is messy; no time for math */	switch(key) {	case Up:		switch(level.board[g.x][g.y-1]) {		case Empty:		case Goal:			moved = 1;			level.glenda = Pt(g.x, g.y-1);			break;		case Cargo:		case GoalCargo:			switch(level.board[g.x][g.y-2]) {			case Empty:				moved = 1;				level.board[g.x][g.y-2] = Cargo;				drawboard(Pt(g.x, g.y-2));				break;			case Goal:				moved = 1;				level.board[g.x][g.y-2] = GoalCargo;				drawboard(Pt(g.x, g.y-2));				break;			}			if(moved) {				level.board[g.x][g.y-1] = (level.board[g.x][g.y-1] == Cargo) ? Empty : Goal;				level.glenda = Pt(g.x, g.y-1);			}			break;		}		break;	case Down:		switch(level.board[g.x][g.y+1]) {		case Empty:		case Goal:			moved = 1;			level.glenda = Pt(g.x, g.y+1);			break;		case Cargo:		case GoalCargo:			switch(level.board[g.x][g.y+2]) {			case Empty:				moved = 1;				level.board[g.x][g.y+2] = Cargo;				drawboard(Pt(g.x, g.y+2));				break;			case Goal:				moved = 1;				level.board[g.x][g.y+2] = GoalCargo;				drawboard(Pt(g.x, g.y+2));				break;			}			if(moved) {				level.board[g.x][g.y+1] = (level.board[g.x][g.y+1] == Cargo) ? Empty : Goal;				level.glenda = Pt(g.x, g.y+1);			}			break;		}		break;	case Left:		glenda = gleft;		switch(level.board[g.x-1][g.y]) {		case Empty:		case Goal:			moved = 1;			level.glenda = Pt(g.x-1, g.y);			break;		case Cargo:		case GoalCargo:			switch(level.board[g.x-2][g.y]) {			case Empty:				moved = 1;				level.board[g.x-2][g.y] = Cargo;				drawboard(Pt(g.x-2, g.y));				break;			case Goal:				moved = 1;				level.board[g.x-2][g.y] = GoalCargo;				drawboard(Pt(g.x-2, g.y));				break;			}			if(moved) {				level.board[g.x-1][g.y] = (level.board[g.x-1][g.y] == Cargo) ? Empty : Goal;				level.glenda = Pt(g.x-1, g.y);			}			break;		}		break;	case Right:		glenda = gright;		switch(level.board[g.x+1][g.y]) {		case Empty:		case Goal:			moved = 1;			level.glenda = Pt(g.x+1, g.y);			break;		case Cargo:		case GoalCargo:			switch(level.board[g.x+2][g.y]) {			case Empty:				moved = 1;				level.board[g.x+2][g.y] = Cargo;				drawboard(Pt(g.x+2, g.y));				break;			case Goal:				moved = 1;				level.board[g.x+2][g.y] = GoalCargo;				drawboard(Pt(g.x+2, g.y));				break;			}			if(moved) {				level.board[g.x+1][g.y] = (level.board[g.x+1][g.y] == Cargo) ? Empty : Goal;				level.glenda = Pt(g.x+1, g.y);			}			break;		}		break;	}	if(moved)		drawboard(Pt(g.x, g.y));	drawglenda();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?