imported>neropsys |
imported>hit0473 |
| (14 intermediate revisions by 2 users not shown) |
| Line 8: |
Line 8: |
| * 스터디 일자 : 토요일 1시부터 ~ (?)시(default 4시간 - 이론 1~2시간 실습 2시간 이상) | | * 스터디 일자 : 토요일 1시부터 ~ (?)시(default 4시간 - 이론 1~2시간 실습 2시간 이상) |
|
| |
|
| == 11월 2일 토요일 == | | == 스터디 페이지 링크 == |
| * 참여 인원 : [[김윤환]], [[조영준]], [[장혁재]] | | * [[스터디/게임에 미친이들을 위한 히치하이킹/13-11-02]] |
| * 주제 : c++ 시작 + 배달맨 만들기
| | * [[스터디/게임에 미친이들을 위한 히치하이킹/13-11-16]] |
|
| |
|
| 배달맨 소스 코드
| |
| * [[장혁재]]
| |
| #include <iostream>
| |
| #include <conio.h>
| |
| using namespace std;
| |
| #define X 8
| |
| #define Y 5
| |
| //1=#(wall)
| |
| //0=""(space)
| |
| //2=p(player)
| |
| //3=.(wantedlocation)
| |
| //4=o(box)
| |
| //5=P(player_on_wanted_location)
| |
| //6=O(movedbox)
| |
| //collision 체크 함수와 move 함수 나누기
| |
| //2차원 배열 내 p의 위치는 이중for문에서 p를 찾았을때 인수로 i와 j의 값을 보내면 됨
| |
| void printgame(int stage[][X]);
| |
| void makegame(int stage[][X]);
| |
| void input(int stage[][X]);
| |
| int collision(int stage[][X], char movement, int x, int y);
| |
| int main(){
| |
| int stage[Y][X] = { 0 };
| |
| makegame(stage);
| |
| while (1){
| |
| printgame(stage);
| |
| input(stage);
| |
| }
| |
| getchar();
| |
| return 0;
| |
| }
| |
| void printgame(int stage[][X]){
| |
| int i = 0;
| |
| int j = 0;
| |
| for (i = 0; i < Y; i++){
| |
| for (j = 0; j < X; j++){
| |
| /*if (stage[i][j] == 1)
| |
| printf("#");
| |
| else if (stage[i][j] == 0)
| |
| printf(" ");
| |
| else if (stage[i][j] == 2)
| |
| printf("p");
| |
| else if (stage[i][j] == 3)
| |
| printf(".");
| |
| else if (stage[i][j] == 4)
| |
| printf("o");
| |
| else if (stage[i][j] == 5)
| |
| printf("P");
| |
| else if (stage[i][j] == 6)
| |
| printf("O");*/
| |
| printf("%d", stage[i][j]);
| |
|
| |
| }
| |
| printf("\n");
| |
| }
| |
| }
| |
| void makegame(int stage[][X]){
| |
| int i = 0, j = 0;
| |
| for (i = 0; i < Y; i++){
| |
| for (j = 0; j < X; j++){
| |
| if (i == 0 || i == 4)
| |
| stage[i][j] = 1;
| |
| else if (j == 0 || j == 7)
| |
| stage[i][j] = 1;
| |
| else
| |
| stage[i][j] = 0;
| |
| }
| |
| }
| |
| stage[1][5] = 2;
| |
| stage[1][2] = 3;
| |
| stage[1][3] = 3;
| |
| stage[2][2] = 4;
| |
| stage[2][3] = 4;
| |
| }
| |
| void input(int stage[][X]){
| |
| char movement;
| |
| int i = 0, j = 0;
| |
| printf("a:left, w:up, s:down, d:right:");
| |
| movement = getche();
| |
| for (i = 0; i < Y; i++){
| |
| for (j = 0; j < X; j++){
| |
| if (stage[i][j] == 2 || stage[i][j]==5){
| |
| switch (movement){
| |
| case 'a':
| |
| if (collision(stage, movement, j, i) == 1)
| |
| break;
| |
| else{
| |
| stage[i][j--] += stage[i][j];
| |
| stage[i][j] -= 2;
| |
| }
| |
| break;
| |
| case 'w':
| |
| if (collision(stage, movement, j, i) == 1)
| |
| break;
| |
| else{
| |
| stage[i--][j] += stage[i][j];
| |
| stage[i][j] -= 2;
| |
| }
| |
| break;
| |
| case 's':
| |
| if (collision(stage, movement, j, i) == 1)
| |
| break;
| |
| else{
| |
| stage[i++][j] += stage[i][j];
| |
| stage[i][j] - 2;
| |
| }
| |
| break;
| |
| case 'd':
| |
| if (collision(stage, movement, j, i) == 1)
| |
| break;
| |
| else{
| |
| stage[i][j++] += stage[i][j];
| |
| stage[i][j] -= 2;
| |
| }
| |
| break;
| |
| }
| |
| }
| |
| }
| |
| }
| |
| printf("\n");
| |
| }
| |
| int collision(int stage[][X], char movement, int j, int i){
| |
| switch (movement){
| |
| case 'a':
| |
| if (stage[i][j--] == 1)
| |
| return 1;
| |
| else if (stage[i][j--] == 4){
| |
| if (stage[i][j - 2] == 4 || stage[i][j - 2] == 1)
| |
| return 1;
| |
| else
| |
| return 0;
| |
| //밑에 코드 모두 동일 조건
| |
| }
| |
| else
| |
| return 0;
| |
| break;
| |
| case 'w'://i--, j
| |
| if (stage[i--][j] == 1)
| |
| return 1;
| |
| else if (stage[i--][j] == 4){
| |
| if (stage[i - 2][j] == 4 || stage[i - 2][j] == 1)
| |
| return 1;
| |
| else
| |
| return 0;
| |
| }
| |
| else
| |
| return 0;
| |
| break;
| |
| case 's'://i++, j
| |
| if (stage[i++][j] == 1){
| |
| return 1;
| |
| }
| |
| else if (stage[i++][j] == 4){
| |
| if (stage[i + 2][j] == 4 || stage[i + 2][j] == 1)
| |
| return 1;
| |
| else
| |
| return 0;
| |
|
| |
| }
| |
| else
| |
| return 0;
| |
|
| |
| break;
| |
| case 'd'://i,j++
| |
| if (stage[i][j++] == 1){
| |
| return 1;
| |
| }
| |
| else if (stage[i][j++] == 4){
| |
| if (stage[i][j + 2] == 4 || stage[i][j + 2] == 1)
| |
| return 1;
| |
| else
| |
| return 0;
| |
| }
| |
| else
| |
| return 0;
| |
| break;
| |
| }
| |
|
| |
| }
| |
| * [[조영준]]
| |
| #include <stdio.h>
| |
| #include <stdlib.h>
| |
|
| |
| enum FloorType {
| |
| floor, goal, wall
| |
| };
| |
|
| |
| enum ObjectType {
| |
| box, player, empty
| |
| };
| |
|
| |
| enum Direction {
| |
| up, right, down, left
| |
| };
| |
|
| |
| class Sokoban;
| |
| class Map;
| |
| class MapManager;
| |
|
| |
| class Map {
| |
| public:
| |
| int width;
| |
| int height;
| |
| FloorType **floorMatrix;
| |
| ObjectType **objectMatrix;
| |
| };
| |
|
| |
| class MapManager {
| |
| public :
| |
| void printMap(Map *map) {
| |
| int width = map->width;
| |
| int height = map->height;
| |
|
| |
| for (int i = 0; i < height; i++) {
| |
| for (int j = 0; j < width; j++) {
| |
| char charToPrint;
| |
| if (map->floorMatrix[i][j] == floor && map->objectMatrix[i][j] == empty) {
| |
| charToPrint = ' ';
| |
| } else if (map->floorMatrix[i][j] == floor && map->objectMatrix[i][j] == player) {
| |
| charToPrint = 'p';
| |
| } else if (map->floorMatrix[i][j] == floor && map->objectMatrix[i][j] == box) {
| |
| charToPrint = 'o';
| |
| } else if (map->floorMatrix[i][j] == goal && map->objectMatrix[i][j] == empty) {
| |
| charToPrint = '.';
| |
| } else if (map->floorMatrix[i][j] == goal && map->objectMatrix[i][j] == player) {
| |
| charToPrint = 'P';
| |
| } else if (map->floorMatrix[i][j] == goal && map->objectMatrix[i][j] == box) {
| |
| charToPrint = 'O';
| |
| } else if (map->floorMatrix[i][j] == wall) {
| |
| charToPrint = '#';
| |
| }
| |
| printf("%c", charToPrint);
| |
| }
| |
| printf("\n");
| |
| }
| |
| }
| |
|
| |
| Map *phaseStringToMap(char *string[], int width, int height) {
| |
| Map *map = new Map();
| |
|
| |
| map->width = width;
| |
| map->height = height;
| |
|
| |
| map->floorMatrix = (FloorType**) (malloc(sizeof(FloorType*) * height));
| |
| map->objectMatrix = (ObjectType**) (malloc(sizeof(ObjectType*) * height));
| |
|
| |
| for (int i = 0; i < height; i++) {
| |
| map->floorMatrix[i] = (FloorType*) (malloc(sizeof(FloorType)* width));
| |
| map->objectMatrix[i] = (ObjectType*)(malloc(sizeof(ObjectType)* width));
| |
| }
| |
|
| |
| for (int i = 0; i < height; i++) {
| |
| for (int j = 0; j < width; j++) {
| |
| if (string[i][j] == ' ') {
| |
| map->floorMatrix[i][j] = floor;
| |
| map->objectMatrix[i][j] = empty;
| |
| } else if (string[i][j] == '#') {
| |
| map->floorMatrix[i][j] = wall;
| |
| map->objectMatrix[i][j] = empty;
| |
| } else if (string[i][j] == 'p') {
| |
| map->floorMatrix[i][j] = floor;
| |
| map->objectMatrix[i][j] = player;
| |
| } else if (string[i][j] == 'P') {
| |
| map->floorMatrix[i][j] = goal;
| |
| map->objectMatrix[i][j] = player;
| |
| } else if (string[i][j] == '.') {
| |
| map->floorMatrix[i][j] = goal;
| |
| map->objectMatrix[i][j] = empty;
| |
| } else if (string[i][j] == 'o') {
| |
| map->floorMatrix[i][j] = floor;
| |
| map->objectMatrix[i][j] = box;
| |
| } else if (string[i][j] == 'O') {
| |
| map->floorMatrix[i][j] = goal;
| |
| map->objectMatrix[i][j] = box;
| |
| } else {
| |
| map->floorMatrix[i][j] = floor;
| |
| map->objectMatrix[i][j] = empty;
| |
| }
| |
| }
| |
| }
| |
|
| |
| return map;
| |
| }
| |
| };
| |
|
| |
| class Sokoban {
| |
| public:
| |
| Sokoban() {
| |
| mapManager = new MapManager();
| |
|
| |
| map = NULL;
| |
| playerX = -1;
| |
| playerY = -1;
| |
| numberOfGoals = 0;
| |
| numberOfFilledGoals = 0;
| |
| numberOfMoves = 0;
| |
| }
| |
|
| |
| void setGame(Map *newMap) {
| |
| map = newMap;
| |
|
| |
| for (int i = 0; i < map->height; i++) {
| |
| for (int j = 0; j < map->width; j++) {
| |
| if (map->floorMatrix[i][j] == wall) {
| |
| map->objectMatrix[i][j] = empty;
| |
| } else if (map->floorMatrix[i][j] == goal) {
| |
| numberOfGoals++;
| |
| }
| |
| if (map->objectMatrix[i][j] == player) {
| |
| if (playerX >= 0) {
| |
| map->objectMatrix[playerY][playerX] = empty;
| |
| }
| |
| playerX = j;
| |
| playerY = i;
| |
| }
| |
| }
| |
| }
| |
|
| |
| update();
| |
| }
| |
|
| |
| void movePlayer(Direction direction) {
| |
| if (moveObject(playerX, playerY, direction) == true) {
| |
| numberOfMoves++;
| |
| update();
| |
| }
| |
| }
| |
|
| |
| void print() {
| |
| mapManager->printMap(map);
| |
| printf("%d, %d, %d\n", numberOfGoals, numberOfFilledGoals, numberOfMoves);
| |
| }
| |
| private:
| |
| MapManager *mapManager;
| |
| Map *map;
| |
| int playerX;
| |
| int playerY;
| |
| int numberOfGoals;
| |
| int numberOfFilledGoals;
| |
| int numberOfMoves;
| |
|
| |
| bool moveObject(int x, int y, Direction direction) {
| |
| int frontX = x;
| |
| int frontY = y;
| |
|
| |
| if (direction == up) {
| |
| frontY -= 1;
| |
| }
| |
| else if (direction == right) {
| |
| frontX += 1;
| |
| }
| |
| else if (direction == down) {
| |
| frontY += 1;
| |
| }
| |
| else if (direction == left) {
| |
| frontX -= 1;
| |
| }
| |
|
| |
| if (frontX < 0 || frontX >= map->width || frontY < 0 || frontY >= map->height) {
| |
| return false;
| |
| }
| |
|
| |
| ObjectType thisObject = map->objectMatrix[y][x];
| |
| FloorType thisFloor = map->floorMatrix[y][x];
| |
| ObjectType frontObject = map->objectMatrix[frontY][frontX];
| |
| FloorType frontFloor = map->floorMatrix[frontY][frontX];
| |
|
| |
| if (thisFloor == wall) {
| |
| return false;
| |
| }
| |
| else if (thisObject == empty) {
| |
| return true;
| |
| }
| |
| else if (thisObject == box && (frontObject == box || frontFloor == wall)) {
| |
| return false;
| |
| }
| |
| else if (moveObject(frontX, frontY, direction) == true) {
| |
| map->objectMatrix[frontY][frontX] = map->objectMatrix[y][x];
| |
| map->objectMatrix[y][x] = empty;
| |
| return true;
| |
| }
| |
| else {
| |
| return false;
| |
| }
| |
| }
| |
|
| |
| void update() {
| |
| numberOfFilledGoals = 0;
| |
| for (int i = 0; i < map->height; i++) {
| |
| for (int j = 0; j < map->width; j++) {
| |
| if (map->objectMatrix[i][j] == box) {
| |
| if (map->floorMatrix[i][j] == goal) {
| |
| numberOfFilledGoals++;
| |
| }
| |
| }
| |
| else if (map->objectMatrix[i][j] == player) {
| |
| playerY = i;
| |
| playerX = j;
| |
| }
| |
| }
| |
| }
| |
| }
| |
| };
| |
|
| |
| int main() {
| |
| char *string[] = {
| |
| "########",
| |
| "# .. p #",
| |
| "# o o #",
| |
| "# p #",
| |
| "########"
| |
| };
| |
|
| |
| char input;
| |
|
| |
| MapManager *mapManager = new MapManager();
| |
| Map *map = mapManager->phaseStringToMap(string, 8, sizeof(string) / sizeof(string[0]));
| |
| Sokoban *sokoban = new Sokoban();
| |
|
| |
| sokoban->setGame(map);
| |
|
| |
| while (true) {
| |
| sokoban->print();
| |
| printf(":");
| |
| scanf_s("%c%*c", &input);
| |
| if (input == 'w') {
| |
| sokoban->movePlayer(up);
| |
| } else if (input == 'd') {
| |
| sokoban->movePlayer(right);
| |
| } else if (input == 's') {
| |
| sokoban->movePlayer(down);
| |
| } else if (input == 'a') {
| |
| sokoban->movePlayer(left);
| |
| }
| |
| }
| |
| }
| |
| * [[김윤환]]
| |
|
| |
| ---- | | ---- |
| === 후기 === | | === 후기 === |
| * 42 | | * it is main page! - [[김윤환]] |
| [[2013년활동지도]] | | [[2013년활동지도]] |
|
| |
|