FPGA-TankGame-new/TankGame.srcs/sources_1/new/game_logic_infinity.v

226 lines
6.7 KiB
Verilog

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 12/28/2020 08:31:42 PM
// Design Name:
// Module Name: game_logic_infinity
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module game_logic_infinity(
input clk,
input btn_return,
input btn_stop,
input enable_game_infinity,
input mytank1_state,
input mytank2_state,
input [ 3: 0 ] initial_num,
input [ 3: 0 ] scorea1,
input [ 3: 0 ] scorea2,
input [ 3: 0 ] scoreb1,
input [ 3: 0 ] scoreb2,
input [ 3: 0 ] scorec1,
input [ 3: 0 ] scorec2,
input [ 3: 0 ] scored1,
input [ 3: 0 ] scored2,
input item_addtime,
input item_invincible,
input which_player,
output reg [ 3: 0 ] HP1_value,
output reg [ 3: 0 ] HP2_value,
output reg [ 4: 0 ] timer,
output reg gameover_infinity,
output wire [ 15: 0 ] led_infinity,
output reg [ 7: 0 ] score_infinity, //[7:4] is player2 ,[3:0] is player1
output reg timeup
);
reg [ 31: 0 ] cnt;
reg [ 3: 0 ] score1;
reg [ 3: 0 ] score2;
reg add_flag;
reg item_flag;
reg mytank1_state_last, mytank2_state_last;
reg item_addtime_last;
initial begin
gameover_infinity <= 0;
cnt <= 0;
timer <= 0;
score_infinity <= 0;
score1 <= 0;
score2 <= 0;
add_flag <= 0;
item_flag <= 0;
HP1_value <= 3;
HP2_value <= 3;
timeup <= 0;
end
always @( posedge clk ) begin
if ( ~item_invincible && mytank1_state_last && ~mytank1_state ) begin
HP1_value <= HP1_value - 1;
end
else begin
HP1_value <= HP1_value;
end
if ( ~item_invincible && mytank2_state_last && ~mytank2_state ) begin
HP2_value <= HP2_value - 1;
end
else begin
HP2_value <= HP2_value;
end
if ( enable_game_infinity == 1'b0 ) begin
HP1_value <= 3;
HP2_value <= 3;
end
mytank1_state_last <= mytank1_state;
mytank2_state_last <= mytank2_state;
end
// always @( negedge mytank1_state ) begin
// if ( item_invincible == 0 ) begin
// HP1 <= HP1 - 1;
// end
// else begin
// HP1 <= HP1;
// end
// if ( enable_game_infinity == 1'b0 ) begin
// HP1 <= 2;
// end
// end
// always @( negedge mytank2_state ) begin
// if ( item_invincible == 0 ) begin
// HP2 <= HP2 - 1;
// end
// else begin
// HP2 <= HP2;
// end
// if ( enable_game_infinity == 1'b0 ) begin
// HP2 <= 2;
// end
// end
always @( posedge clk ) begin
if ( !enable_game_infinity ) begin
gameover_infinity <= 0;
cnt <= 0;
timer <= initial_num;
if ( btn_return ) begin
score1 <= 0;
score2 <= 0;
score_infinity <= 0;
timeup <= 0;
end
else begin
score_infinity[ 7: 4 ] <= score2[ 3: 0 ];
score_infinity[ 3: 0 ] <= score1[ 3: 0 ];
end
end
else begin
if ( timer == 0 || btn_stop || ( | HP1_value == 0 ) || ( | HP2_value == 0 ) ) begin
timer <= initial_num;
gameover_infinity <= 1;
timeup <= 1'b1;
end
else begin
if ( score1 < scorea1 + scoreb1 + scorec1 + scored1 ) begin
if ( add_flag == 0 && timer > 0 && timer < initial_num ) begin
timer <= timer + 3;
cnt <= 0;
add_flag = 1;
end
end
else begin
add_flag = 0;
end
if ( score2 < scorea2 + scoreb2 + scorec2 + scored2 ) begin
if ( add_flag == 0 && timer > 0 && timer < initial_num ) begin
timer <= timer + 3;
cnt <= 0;
add_flag = 1;
end
end
else begin
add_flag = 0;
end
score1 <= scorea1 + scoreb1 + scorec1 + scored1;
score2 <= scorea2 + scoreb2 + scorec2 + scored2;
if ( item_addtime == 1 ) begin
if ( item_flag == 0 && timer > 0 && timer < initial_num ) begin
begin
if ( timer == initial_num - 1 ) begin
timer <= timer + 1;
end
else if ( timer == initial_num - 2 ) begin
timer <= timer + 2;
end
else begin
timer <= timer + 3;
end
item_flag <= 1;
end
end
else begin
timer <= timer;
item_flag <= 1;
end
end
else begin
item_flag <= 0;
end
score_infinity[ 7: 4 ] <= score2[ 3: 0 ];
score_infinity[ 3: 0 ] <= score1[ 3: 0 ];
cnt <= cnt + 1;
if ( cnt >= 100_000_000 ) begin
timer <= timer - 1;
cnt <= 0;
end
if ( item_addtime && ~item_addtime_last ) begin
timer <= 4'b1111;
end
item_addtime_last <= item_addtime;
end
end
end
assign led_infinity[ 0 ] = enable_game_infinity ? ( timer > 0 ) : 0;
assign led_infinity[ 1 ] = enable_game_infinity ? ( timer > 1 ) : 0;
assign led_infinity[ 2 ] = enable_game_infinity ? ( timer > 2 ) : 0;
assign led_infinity[ 3 ] = enable_game_infinity ? ( timer > 3 ) : 0;
assign led_infinity[ 4 ] = enable_game_infinity ? ( timer > 4 ) : 0;
assign led_infinity[ 5 ] = enable_game_infinity ? ( timer > 5 ) : 0;
assign led_infinity[ 6 ] = enable_game_infinity ? ( timer > 6 ) : 0;
assign led_infinity[ 7 ] = enable_game_infinity ? ( timer > 7 ) : 0;
assign led_infinity [ 8 ] = enable_game_infinity ? ( timer > 8 ) : 0;
assign led_infinity [ 9 ] = enable_game_infinity ? ( timer > 9 ) : 0;
assign led_infinity [ 10 ] = enable_game_infinity ? ( timer > 10 ) : 0;
assign led_infinity [ 11 ] = enable_game_infinity ? ( timer > 11 ) : 0;
assign led_infinity [ 12 ] = enable_game_infinity ? ( timer > 12 ) : 0;
assign led_infinity [ 13 ] = enable_game_infinity ? ( timer > 13 ) : 0;
assign led_infinity [ 14 ] = enable_game_infinity ? ( timer > 14 ) : 0;
assign led_infinity [ 15 ] = enable_game_infinity ? ( timer > 15 ) : 0;
endmodule