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; } }
//消行计分 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); } }
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; } }
/* 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; }
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; } } }
//游戏开始、暂停、结束信号函数 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(); }
/* * 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; } } }
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; }
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; }
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; }
/* * 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 */ }