示例#1
0
void fsm_can(can_message_t *msg){
    switch (msg->id) {
        case MENU_ID:
            g_state = msg->data[0];
            break;
        case GAME_ID:
            break;
		case SCORE_ID:
			if(msg->data[0]){
				add_score();
				print_score();
			}
			else{
				g_state = STATE_GAME_OVER;
				oled_print_game_over();
				play_melody(0);
			}
			break;
        case CONTROLLER_ID:
            break;
        case SLIDER_ID:
            if(g_state == STATE_CALIBRATE){
                oled_pos(3,8);
                fprintf(FONT5,"Left: %d %%    \nRight: %d %%    ", msg->data[0], msg->data[1]);
            }
            break;
        default:
            break;
    }
}
示例#2
0
//消行计分
void game_area_frame::deLine(int y)
{
    int line = y/30;
    bool flag[4];
    int lineCnt = 4;
    //俄罗斯方块一次最多消去4行,得到四行的状态,即利用flag标志该行是否应该被消除
    for(int i = 0; i < 4; i++)
    {
        //如果越界
        flag[i] = true;
        if(line+i > 19){
            lineCnt--;
            continue;
        }
        for(int j = 0; j < 10; j++)
        {
            //有一个位置点为空则将flag置为false并退出判断
            if(state[line+i][j] == false){
                flag[i] = false;
                lineCnt--;
                break;
            }
        }
    }
    //进行消行处理--有问题(疑似已经解决)
    for(int i = 0; i < 4; i++)
    {
        //越界直接退出循环
        if(line+i > 19)
            break;
        //标志为真则消行--状态标识下移
        if(flag[i] == true)
        {
            for(int j = line+i; j >= 0; j--)
            {
                if(j==0)
                {
                    for(int k = 0; k < 10; k++)
                        state[0][k] = 0;
                    timer.start(timeoutTime(), this);
                }
                else
                {

                    for(int k = 0; k < 10; k++)
                    {
                        state[j][k] = state[j-1][k];
                    }
                }
            }
        }
    }
    //返回计分
    if(lineCnt > 0)
    {
        this->scoreAll += lineCnt*15-5;
        emit add_score(scoreAll);
    }
}
示例#3
0
文件: updown.c 项目: aradreed/up-down
static void down_click_handler(ClickRecognizerRef recognizer, void *context) {
  if (state.direction == 2) {
  	add_score();
  	state.buttonPushed = true;
  }
  
  else {
  	state.isRunning = false;
  	state.direction = 0;
  }
}
示例#4
0
文件: score.c 项目: scanf/dangen
/* return the damege that should be subtracted from
 * the hit point of the enemy */
int
add_damage_score(int hit_point, int damage)
{
  /* sanity check */
  if (hit_point <= 0)
    return 0;
  if (damage <= 0)
    return 0;

  if (hit_point > damage)
  {
    add_score(damage);
  }
  else
  {
    damage = hit_point;
    add_score(damage - 1);
  }

  return damage;
}
示例#5
0
void on_collision(Laser* laser, Entity* them) {
    Entity* shooter = find_entity(laser->shooter_id);

    switch (them->type) {
        case ENTITY_TYPE_ASTEROID: {
            if (shooter && shooter->type == ENTITY_TYPE_PLAYER) {
                add_score(them->asteroid->score);
            }

            spawn_children(them->asteroid);

            destroy_entity(them);
            destroy_entity(laser->entity);

            break;
        }
        case ENTITY_TYPE_PLAYER: {
            if (shooter && shooter->type == ENTITY_TYPE_ENEMY) {
                damage_player(them->player);
                destroy_entity(laser->entity);
            }

            break;
        }
        case ENTITY_TYPE_ENEMY: {
            if (shooter && shooter->type == ENTITY_TYPE_PLAYER) {
                add_score(them->enemy->score);

                destroy_entity(laser->entity);
                kill_enemy();
            }

            break;
        }
    }
}
示例#6
0
//游戏开始、暂停、结束信号函数
void game_area_frame::start_game()
{
    if(this->isStart == true)
    {
        for(int i = 0; i < 20; i++)
            for(int j = 0; j < 10; j++)
                state[i][j] = 0;
    }
    this->isStart = true;
    this->next_area->setStart();
    this->isWaiting = false;
    this->set_NowTe();
    this->scoreAll = 0;
    emit add_score(scoreAll);
    timer.start(timeoutTime(), this);
    this->update();
    this->next_area->update();
}
示例#7
0
/*
 * play_level:
 *	Let the player play the current level
 */
void
play_level(void)
{
	COORD	*cp;

	move(My_pos.y, My_pos.x);
	addch(PLAYER);
	refresh();
	for (cp = Robots; cp < &Robots[MAXROBOTS]; cp++) {
		if (cp->y < 0)
			continue;
		move(cp->y, cp->x);
		addch(ROBOT);
	}
	refresh();
#ifdef DEBUG
	standout();
	move(Min.y, Min.x);
	addch(inch());
	move(Max.y, Max.x);
	addch(inch());
	standend();
#endif /* DEBUG */
	flushinp();
	while (!Dead && Num_robots > 0) {
		move(My_pos.y, My_pos.x);
		if (!jumping())
			refresh();
		get_move();
		if (Field[My_pos.y][My_pos.x] != 0)
			Dead = TRUE;
		if (!Dead)
			move_robots();
		if (Was_bonus) {
			move(Y_PROMPT, X_PROMPT);
			clrtoeol();
			move(Y_PROMPT + 1, X_PROMPT);
			clrtoeol();
			Was_bonus = FALSE;
		}
	}

	/*
	 * if the player didn't die, add on the possible bonuses
	 */

	if (!Dead) {
		Was_bonus = FALSE;

		if (Level == Start_level && Start_level > 1) {
			move(Y_PROMPT, X_PROMPT);
			printw("Advance bonus: %d", S_BONUS);
			refresh();
			add_score(S_BONUS);
			Was_bonus = TRUE;
		}

		if (Wait_bonus != 0) {
			if (!Was_bonus)
				move(Y_PROMPT, X_PROMPT);
			else
				move(Y_PROMPT + 1, X_PROMPT);
			printw("Wait bonus: %d", Wait_bonus);
			refresh();
			add_score(Wait_bonus);
			Was_bonus = TRUE;
		}
	}
}
示例#8
0
文件: main.c 项目: sn6uv/box-packing
int main() {
    int button_code;
    int pause_state = 0;
    int reset_state = 0;

    setup_gui();

    // Seed random num generator
    srand (time(NULL));

    box_fam = create_gen(gen_size);
    randomise_gen(box_fam);    

    ifit = -1;

    for (int i=0; i<ngen; i++) {
        // Score generation
        score_gen(box_fam);

        printf("gen %i\r", i);
        fflush(stdout);
        // Draw fittest of the fit
        jfit = fittest_cov(box_fam);
        if (ifit != jfit) {
            ifit = jfit;
            clear_window();
            draw_boarder();
            draw_cover(& box_fam[ifit]);
            draw_pause_button(pause_state);
            draw_reset_button(reset_state);
            flush_window();
            printf("gen %i, %f\n", i, nboxes*pow(box_fam[ifit].l,2));
            add_score(i, nboxes*pow(box_fam[ifit].l,2));
        } 
        if (window_redraw_required()) {
            clear_window();
            draw_boarder();
            draw_cover(& box_fam[ifit]);
            draw_pause_button(pause_state);
            draw_reset_button(reset_state);
            draw_scores();
            flush_window();
        }

        button_code = handle_button_presses();
        while (button_code != 0 || pause_state || reset_state) {
            if (pause_state || reset_state)
                button_code = blocking_handle_button_presses();

            switch (button_code) {
                case -1:
                    // Redraw Required
                    clear_window();
                    draw_boarder();
                    draw_cover(& box_fam[ifit]);
                    draw_pause_button(pause_state);
                    draw_reset_button(reset_state);
                    draw_scores();
                    flush_window();
                    break;
                case 1:
                    // Play/Pause Button
                    if (pause_state) {
                        printf("\rPlay!         \n");
                        pause_state = 0;
                    } else {
                        printf("\rPause!        \n");
                        pause_state = 1;
                    }

                    draw_pause_button(pause_state);
                    flush_window();
                    break;
                case 2:
                    // Reset/Start Button  
                    if (reset_state) {
                        printf("\rStart!             \n");
                        reset_state = 0;
                    } else {
                        printf("\rReset!             \n");
                        print_best();
                        i = 0;
                        randomise_gen(box_fam);
                        score_gen(box_fam);            
                        reset_state = 1;
                        reset_scores();
                        flush_window();
                    }
                    clear_window();
                    draw_boarder();
                    draw_cover(& box_fam[ifit]);

                    draw_pause_button(pause_state);
                    draw_reset_button(reset_state);
                    flush_window();
                    break;
                default:
                    printf("\rButton Error %i\n         ", button_code);
                    exit(button_code);
            }
            button_code = handle_button_presses();
        }

        // Evolve Generation
        new_gen(box_fam); 
    }
    // Clear last gen n line
    printf("                  \r");
    fflush(stdout);

    close_gui();
    print_best();

    printf("Press enter to close\n");
    while( getchar() != '\n' );
    return 0;
}
示例#9
0
int main(int argc, char *argv[]) {
    host_num = atoi(argv[1]);
    player_num = atoi(argv[2]);

    pid_t pid;

    for (int i=0; i<player_num; i++) score[i].id = i+1, score[i].value = 0;

    int maxfd = 0;
    for (int i=0; i<host_num; i++) {
        if (pipe(&fd[i][0]) < 0)
            err_sys("pipe error");
        if (pipe(&fd[i][2]) < 0)
            err_sys("pipe error");
        fd_r2w[fd[i][0]] = fd[i][3];
        if ((pid=fork()) < 0)
            err_sys("fork error");
        else if (pid == 0) {
            close(fd[i][0]);
            close(fd[i][3]);
            dup2(fd[i][1], STDOUT_FILENO);
            dup2(fd[i][2], STDIN_FILENO);
            char tmp[10];
            sprintf(tmp, "%d", i+1);
            if (execl("host", "./host", tmp, (char*)0) < 0)
                err_sys("execl error");
            exit(0);
        }
        close(fd[i][1]);
        close(fd[i][2]);
        if (fd[i][0] >= maxfd) maxfd = fd[i][0]+1;
    }
    int solution[4];
    next_permutation(0, 0, player_num, solution);

    fd_set master_set, working_set;
    FD_ZERO(&master_set);
    int now = 0;
    char buf[1000];
    int complete = 0;
    while (1) {
        if (now < host_num && now < cnt) {
            write(fd[now][3], comb[now], strlen(comb[now]));
            fsync(fd[now][3]);
            FD_SET(fd[now][0], &master_set);
            now++;
        }
        else {
            memcpy(&working_set, &master_set, sizeof(master_set));
            int ok;
            select(maxfd, &working_set, NULL, NULL, NULL);
            for (ok=0; ok<maxfd; ok++) {
                if(FD_ISSET(ok, &working_set)) {
                    add_score(ok);
                    complete++;
                    if (now < cnt) {
                        write(fd_r2w[ok], comb[now], strlen(comb[now]));
                        fsync(fd_r2w[ok]);
                        now++;
                    }
                    else {
                        FD_CLR(ok, &master_set);
                        if (complete == cnt) break;
                    }
                }
            }
            if (ok < maxfd) break;
        }
    }

    strcpy(buf, "-1 -1 -1 -1\n");
    for (int i=0; i<host_num ;i++) {
        write(fd[i][3], buf, strlen(buf));
        fsync(fd[i][3]);
    }

    qsort((void*)score, player_num, sizeof(Score), compare_score);
    place[score[0].id] = 1;
    for (int i=1; i<player_num; i++) {
        if (score[i].value == score[i-1].value)
            place[score[i].id] = place[score[i-1].id];
        else
            place[score[i].id] = i+1;
    }
    for (int i=1; i<=player_num; i++)
        printf("%d %d\n", i, place[i]);

    while (pid = waitpid(-1, NULL, 0))
        if (errno == ECHILD)
            break;
    return 0;
}
示例#10
0
文件: netcom.c 项目: QrshR/inf1060-he
int listen_for_connections(void) {
    struct sockaddr_in serveraddr, clientaddr;
    int request_sd;
    int numsocks = 0;
    int maxsocks = 10;
    int sock[maxsocks];
    int receive;
    int clientaddrlen = sizeof(struct sockaddr);
    fd_set readfds, fds;
    struct timeval time;
    time.tv_sec = 20;
    time.tv_usec = 0;

    //request-socket, lytter på innkommende forbindelser
    request_sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    //adresse struct
    memset((void*)  &serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = INADDR_ANY;

    if(listening_port != 0) {
        serveraddr.sin_port = htons(listening_port);
        printf("Listening for connections on port '%d'\n", listening_port);
    } else {
        serveraddr.sin_port = htons(9090); //default if no port is provided
        printf("Listening for connections on default port '9090'\n");
    }
    //bind adressen til socketen
    bind(request_sd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));

    //start lytting
    listen(request_sd, SOMAXCONN);

    FD_ZERO(&readfds);
    FD_ZERO(&fds);
    FD_SET(request_sd, &fds);
    FD_SET(0, &fds);
    numsocks++;

    for(;;) {
        readfds = fds;
        receive = select(maxsocks + 1, &readfds, NULL, NULL, &time);

        if(receive < 0) {
            perror("select encountered an error.\n");
            return -1;
        } else if(receive == 0) {
            //timeout, do nothing
        } else {
            int i;
            for(i = 0; i < FD_SETSIZE; i++) {
                if(FD_ISSET(i, &readfds)) {
                    if(i == 0) { //stdin look for ctrl-d
                        if(read(i, NULL, 10) == 0) {
                            for(i = 0; i < numsocks; i++) {
                                close(sock[i]);
                                FD_CLR(sock[i], &fds);
                            }
                            exit_server();
                        }
                    }
                    if(i == request_sd) {
                        if(numsocks < maxsocks) {
                            sock[numsocks] = accept(request_sd, (struct sockaddr *) &clientaddr,
                                                    (socklen_t *) &clientaddrlen);
                            FD_SET(sock[numsocks], &fds);
                            numsocks++;
                        } else {
                            //No more space for sockets
                            perror("Ran out of socket space.\n");
                            for(i = 0; i < numsocks; i++) {
                                close(sock[i]);
                                FD_CLR(sock[i], &fds);
                            }
                            exit_server();
                        }
                    } else {
                        //read first 4 bytes, and determine what kind of package is coming
                        char buf[4];
                        memset(buf, 0, 4);
                        if(read(i, buf, 4) == -1) {
                            perror("Error reading from client.\n");
                            return -1;
                        }
                        int size = bytes_to_int(buf);
                        byte msg_type = buf[2];

                        if(msg_type == SCORE_LIST) {
                            int score_packages = btotci(buf[3]);
                            if(score_packages > 0) {
                                score *scores[score_packages];
                                int count;
                                for(count = 0; count < score_packages; count++) {
                                    scores[count] = init_score();
                                }
                                int result = receive_score(i, score_packages, scores);
                                if(result != -1) {
                                    for(count = 0; count < score_packages; count++) {
                                        add_score(scores[count]);
                                    }
                                }
                                for(count = 0; count < score_packages; count++) {
                                    free(scores[count]);
                                }
                            } else if(score_packages < 0) {
                                //reply with abs(score_packages);
                                int num = abs(score_packages);
                                score *s[num];
                                int count;

                                count = get_scores(num, s);
                                if(send_score_list(i, s, count) < 0) {
                                    perror("Closing connection.\n");
                                    close(i);
                                    FD_CLR(i, &fds);
                                }
                            }
                        } else if(msg_type == SHUTDOWN_NOTIFICATION) {
                            //receive shutdown msg
                            char buf[size - 4]; //First 4 bytes allready read.
                            int result = receive_shutdown_notification(i, buf, size - 4);
                            if(result == 0) {
                                printf("Received shutdown notification: %s\n", buf);
                                close(i);
                                FD_CLR(i, &fds);
                            }
                        } else {
                            //error, unknown type, reply with shutdown notification
                            perror("Sending shutdown_notification.\n");
                            send_shutdown_notification(i, "Unknown msg_type, got: " + msg_type);
                            //close and remove socket criptor
                            close(i);
                            FD_CLR(i, &fds);
                        }
                    }
                }
            }
        }
    }
    int i;
    for(i = 0; i < maxsocks; i++) {
        close(sock[i]);
    }
    close(request_sd);
    return 0;
}
示例#11
0
/*
 * move_robots:
 *	Move the robots around
 */
void
move_robots(void)
{
	COORD	*rp;

#ifdef DEBUG
	move(Min.y, Min.x);
	addch(inch());
	move(Max.y, Max.x);
	addch(inch());
#endif /* DEBUG */
	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++) {
		if (rp->y < 0)
			continue;
		mvaddch(rp->y, rp->x, ' ');
		Field[rp->y][rp->x]--;
		rp->y += sign(My_pos.y - rp->y);
		rp->x += sign(My_pos.x - rp->x);
		if (rp->y <= 0)
			rp->y = 0;
		else if (rp->y >= Y_FIELDSIZE)
			rp->y = Y_FIELDSIZE - 1;
		if (rp->x <= 0)
			rp->x = 0;
		else if (rp->x >= X_FIELDSIZE)
			rp->x = X_FIELDSIZE - 1;
		Field[rp->y][rp->x]++;
	}

	Min.y = Y_FIELDSIZE;
	Min.x = X_FIELDSIZE;
	Max.y = 0;
	Max.x = 0;
	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++)
		if (rp->y < 0)
			continue;
		else if (rp->y == My_pos.y && rp->x == My_pos.x)
			Dead = TRUE;
		else if (Field[rp->y][rp->x] > 1) {
			mvaddch(rp->y, rp->x, HEAP);
			rp->y = -1;
			Num_robots--;
			if (Waiting)
				Wait_bonus++;
			add_score(ROB_SCORE);
		}
		else {
			mvaddch(rp->y, rp->x, ROBOT);
			if (rp->y < Min.y)
				Min.y = rp->y;
			if (rp->x < Min.x)
				Min.x = rp->x;
			if (rp->y > Max.y)
				Max.y = rp->y;
			if (rp->x > Max.x)
				Max.x = rp->x;
		}

#ifdef DEBUG
	standout();
	move(Min.y, Min.x);
	addch(inch());
	move(Max.y, Max.x);
	addch(inch());
	standend();
#endif /* DEBUG */
}