├── 04-Uoc luong chi phi thuc hien du an theo UCP.pdf ├── 20222-CanBanThietKeCauTruc.pdf ├── 20222-Ch01-TongQuan.pdf ├── 20222-Ch02-MoHinhHoaChucNang.pdf ├── 20222-Ch03-MoHinhHoaCauTruc.pdf ├── 20222-Ch04-MoHinhHoaHanhVi.pdf ├── 20222-Ch05-ThietKeLop.pdf ├── 20222-ChuyenSangThietKe.pdf ├── 20222-KienTrucHeThong.pdf ├── 20222-ThietKeGiaoDien.pdf ├── 20222-ThietKeLuuTruCoDinh.pdf ├── 20242-Ch06-MauThietKe.pdf ├── CaseStudy ├── PattersonSuperstore_vi.pdf ├── all-external-resources │ ├── CRC_vi.odt │ ├── PattersonSuperstore.mdj │ ├── ca-su-dung-dac-ta.odt │ ├── costs-benefits.ods │ ├── dac-ta-phuong-thuc.odt │ ├── figure1-16.png │ ├── figure2-1.png │ ├── figure2-15.png │ ├── figure2-17.png │ ├── figure5-1.png │ ├── figure7-19.png │ ├── patterson-UCP.ods │ ├── samples.mdj │ └── thoa-thuan-thong-diep.odt ├── feedback.txt ├── pattersonsuperstorecase.pdf └── readme.txt ├── README.md ├── UML ├── examples.mdj └── uml-2.5.1.pdf ├── demo ├── dam │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ ├── App.java │ │ ├── Customer.java │ │ ├── CustomerDAM.java │ │ └── CustomerSchemaSql.java ├── dao │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ ├── App.java │ │ ├── Customer.java │ │ ├── CustomerDAO.java │ │ ├── CustomerSchemaSql.java │ │ └── H2CustomerDAO.java ├── guess-number-cpp │ ├── CMakeLists.txt │ ├── README.md │ ├── bitmaps │ │ ├── blackcat.bmp │ │ ├── blackcat.xpm │ │ ├── gomechan.bmp │ │ ├── gomechan.xpm │ │ ├── inspiration.bmp │ │ ├── inspiration.xpm │ │ ├── new.bmp │ │ └── new.xpm │ ├── conf.h │ ├── diagrams │ │ ├── class-structure-design.png │ │ ├── model.mdj │ │ ├── seq-create-newgame.png │ │ └── seq-guess-number.png │ ├── game_controller.cpp │ ├── game_controller.h │ ├── game_model.cpp │ ├── game_model.h │ ├── game_view.cpp │ ├── game_view.h │ └── main.cpp ├── guess-number-mv-cpp │ ├── CMakeLists.txt │ ├── README.md │ ├── bitmaps │ │ ├── blackcat.bmp │ │ ├── blackcat.xpm │ │ ├── gomechan.bmp │ │ ├── gomechan.xpm │ │ ├── inspiration.bmp │ │ ├── inspiration.xpm │ │ ├── new.bmp │ │ └── new.xpm │ ├── conf.h │ ├── diagrams │ │ ├── class-structure-design.png │ │ ├── model.mdj │ │ ├── seq-create-newgame.png │ │ ├── seq-guess-number.png │ │ └── seq-init-app.png │ ├── game_model.cpp │ ├── game_model.h │ ├── game_view.cpp │ ├── game_view.h │ ├── main.cpp │ └── observer.hpp ├── guess-number-observer-cpp │ ├── CMakeLists.txt │ ├── README.md │ ├── bitmaps │ │ ├── blackcat.bmp │ │ ├── blackcat.xpm │ │ ├── gomechan.bmp │ │ ├── gomechan.xpm │ │ ├── inspiration.bmp │ │ ├── inspiration.xpm │ │ ├── new.bmp │ │ └── new.xpm │ ├── conf.h │ ├── diagrams │ │ ├── class-structure-design.png │ │ ├── model.mdj │ │ ├── seq-create-newgame.png │ │ ├── seq-guess-number.png │ │ └── seq-init-app.png │ ├── game_controller.cpp │ ├── game_controller.h │ ├── game_model.cpp │ ├── game_model.h │ ├── game_view.cpp │ ├── game_view.h │ ├── main.cpp │ └── observer.h ├── it-class-example.gan ├── model2.mdj ├── model2clock │ ├── bin │ │ └── run │ ├── model2clock.iml │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── model2 │ │ │ ├── ClockAction.java │ │ │ └── ClockModel.java │ │ ├── resources │ │ ├── log4j2.xml │ │ └── struts.xml │ │ └── webapp │ │ ├── WEB-INF │ │ └── web.xml │ │ └── clock.jsp ├── mvc-clock │ ├── README.md │ ├── cpp │ │ ├── CMakeLists.txt │ │ ├── clock_controller.h │ │ ├── clock_model.h │ │ ├── clock_view.h │ │ ├── main.cpp │ │ └── main_window.h │ ├── diagram │ │ ├── clock-mvc.mdj │ │ ├── sequence-tick.png │ │ ├── struct-icon.png │ │ └── struct-rect.png │ └── java │ │ ├── bin │ │ └── run │ │ ├── build.gradle │ │ └── src │ │ └── main │ │ └── java │ │ ├── Application.java │ │ ├── ClockController.java │ │ ├── ClockModel.java │ │ ├── ClockView.java │ │ └── MainWindow.java └── spring-cardb │ ├── .gitignore │ ├── README.md │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── packt │ │ │ └── cardatabase │ │ │ ├── CardatabaseApplication.java │ │ │ └── domain │ │ │ ├── Car.java │ │ │ ├── CarRepository.java │ │ │ ├── Owner.java │ │ │ └── OwnerRepository.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── packt │ └── cardatabase │ └── CardatabaseApplicationTests.java ├── first-cut ├── Ch01-TongQuan.pdf ├── Ch02-MoiTruong&DuAn&YeuCau.pdf ├── Ch03-MoHinhHoaChucNang.pdf ├── Ch04-MoHinhHoaCauTruc.pdf ├── Ch05-MoHinhHoaHanhVi.pdf ├── Tk1-KienTrucTongQuan.pdf ├── Tk4-CoSoDuLieu.pdf └── Tk5.1-MauThietKe.pdf ├── old ├── 20212-Ch01-TongQuan.pdf └── 20212-Ch02-MoHinhHoaChucNang.pdf ├── qb ├── baitap-phantich-thietke.pdf ├── cauhoi-tracnghiem.pdf ├── it3120-2k3hk2-pub.pdf ├── it3120-pp-24-01.pdf ├── it3120E-2k4hk1a-pp.pdf ├── oosad-pp1.pdf ├── oosad-pp2-1.pdf └── oosad-pp2-2.pdf └── sdlc.pdf /04-Uoc luong chi phi thuc hien du an theo UCP.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/04-Uoc luong chi phi thuc hien du an theo UCP.pdf -------------------------------------------------------------------------------- /20222-CanBanThietKeCauTruc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-CanBanThietKeCauTruc.pdf -------------------------------------------------------------------------------- /20222-Ch01-TongQuan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-Ch01-TongQuan.pdf -------------------------------------------------------------------------------- /20222-Ch02-MoHinhHoaChucNang.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-Ch02-MoHinhHoaChucNang.pdf -------------------------------------------------------------------------------- /20222-Ch03-MoHinhHoaCauTruc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-Ch03-MoHinhHoaCauTruc.pdf -------------------------------------------------------------------------------- /20222-Ch04-MoHinhHoaHanhVi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-Ch04-MoHinhHoaHanhVi.pdf -------------------------------------------------------------------------------- /20222-Ch05-ThietKeLop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-Ch05-ThietKeLop.pdf -------------------------------------------------------------------------------- /20222-ChuyenSangThietKe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-ChuyenSangThietKe.pdf -------------------------------------------------------------------------------- /20222-KienTrucHeThong.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-KienTrucHeThong.pdf -------------------------------------------------------------------------------- /20222-ThietKeGiaoDien.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-ThietKeGiaoDien.pdf -------------------------------------------------------------------------------- /20222-ThietKeLuuTruCoDinh.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20222-ThietKeLuuTruCoDinh.pdf -------------------------------------------------------------------------------- /20242-Ch06-MauThietKe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/20242-Ch06-MauThietKe.pdf -------------------------------------------------------------------------------- /CaseStudy/PattersonSuperstore_vi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/PattersonSuperstore_vi.pdf -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/CRC_vi.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/CRC_vi.odt -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/ca-su-dung-dac-ta.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/ca-su-dung-dac-ta.odt -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/costs-benefits.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/costs-benefits.ods -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/dac-ta-phuong-thuc.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/dac-ta-phuong-thuc.odt -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure1-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure1-16.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure2-1.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure2-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure2-15.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure2-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure2-17.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure5-1.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/figure7-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/figure7-19.png -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/patterson-UCP.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/patterson-UCP.ods -------------------------------------------------------------------------------- /CaseStudy/all-external-resources/thoa-thuan-thong-diep.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/all-external-resources/thoa-thuan-thong-diep.odt -------------------------------------------------------------------------------- /CaseStudy/feedback.txt: -------------------------------------------------------------------------------- 1 | Các phản hồi chỉnh sửa nội dung tiếng Việt từ người dùng 2 | 3 | -------------------------------------------------------------------------------- /CaseStudy/pattersonsuperstorecase.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/CaseStudy/pattersonsuperstorecase.pdf -------------------------------------------------------------------------------- /CaseStudy/readme.txt: -------------------------------------------------------------------------------- 1 | Credits to Dennis, Wixon, Tegarden 2 | Thanks you very much for this amazing case study. 3 | 4 | The original version was downloaded from 5 | http://bcs.wiley.com/he-bcs/Books?action=resource&bcsId=9422&itemId=1118804678&resourceId=37750 6 | 7 | Các phản hồi chỉnh sửa nếu có xin vui lòng gửi bằng cách tạo Pull Requests cho tệp feedback.txt, xin chân thành cám ơn. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # it3120 - Phân tích và thiết kế hệ thống 2 | 3 | [Tài nguyên](https://drive.google.com/drive/folders/1xYM5U1KiwmyOF7lbpU6XoFXuWxvwxQt8) -------------------------------------------------------------------------------- /UML/uml-2.5.1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/UML/uml-2.5.1.pdf -------------------------------------------------------------------------------- /demo/dam/build.gradle: -------------------------------------------------------------------------------- 1 | version '1.0-SNAPSHOT' 2 | 3 | apply plugin: 'java' 4 | apply plugin: 'application' 5 | 6 | sourceCompatibility = 1.8 7 | 8 | mainClassName = "App" 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | 14 | dependencies { 15 | // https://mvnrepository.com/artifact/com.h2database/h2 16 | implementation group: 'com.h2database', name: 'h2', version: '1.4.200' 17 | } 18 | -------------------------------------------------------------------------------- /demo/dam/src/main/java/App.java: -------------------------------------------------------------------------------- 1 | import java.sql.Connection; 2 | import java.sql.SQLException; 3 | import java.sql.Statement; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.stream.Stream; 7 | 8 | import javax.sql.DataSource; 9 | 10 | import org.h2.jdbcx.JdbcDataSource; 11 | 12 | public class App { 13 | private static final String DB_URL = "jdbc:h2:~/tmp/h2db"; 14 | 15 | public static void main(final String[] args) throws Exception { 16 | final DataSource dataSource = createDataSource(); 17 | createSchema(dataSource); 18 | final CustomerDAM customerDAM = new CustomerDAM(dataSource); 19 | customerDAM.add(1, "Nguyen", "Van A"); 20 | customerDAM.add(2, "Tran", "Thi B"); 21 | customerDAM.add(3, "Bui", "Xuan C"); 22 | System.out.println("customerDAM.getAllCustomers(): "); 23 | try (Stream customerStream = customerDAM.getAll()) { 24 | customerStream.forEach((customer) -> System.out.println(customer)); 25 | } 26 | System.out.println("customerDAM.getCustomerById(2): " + customerDAM.getById(2)); 27 | final Customer customer = new Customer(4, "Vo", "Van D"); 28 | customerDAM.add(customer); 29 | System.out.println("customerDAM.getAllCustomers(): " + customerDAM.getAll()); 30 | customer.setFirstName("La"); 31 | customer.setLastName("Van F"); 32 | customerDAM.update(customer); 33 | System.out.println("customerDAM.getAllCustomers(): "); 34 | try (Stream customerStream = customerDAM.getAll()) { 35 | customerStream.forEach((cust) -> System.out.println(cust)); 36 | } 37 | customerDAM.delete(customer); 38 | System.out.println("customerDAM.getAllCustomers(): " + customerDAM.getAll()); 39 | deleteSchema(dataSource); 40 | } 41 | 42 | private static void deleteSchema(DataSource dataSource) throws SQLException { 43 | try (Connection connection = dataSource.getConnection(); 44 | Statement statement = connection.createStatement()) { 45 | statement.execute(CustomerSchemaSql.DELETE_SCHEMA_SQL); 46 | } 47 | } 48 | 49 | private static void createSchema(DataSource dataSource) throws SQLException { 50 | try (Connection connection = dataSource.getConnection(); 51 | Statement statement = connection.createStatement()) { 52 | statement.execute(CustomerSchemaSql.CREATE_SCHEMA_SQL); 53 | } 54 | } 55 | 56 | private static DataSource createDataSource() { 57 | JdbcDataSource dataSource = new JdbcDataSource(); 58 | dataSource.setURL(DB_URL); 59 | return dataSource; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/dam/src/main/java/Customer.java: -------------------------------------------------------------------------------- 1 | public class Customer { 2 | 3 | private int id; 4 | private String firstName; 5 | private String lastName; 6 | 7 | public Customer(final int id, final String firstName, final String lastName) { 8 | this.id = id; 9 | this.firstName = firstName; 10 | this.lastName = lastName; 11 | } 12 | 13 | public int getId() { 14 | return id; 15 | } 16 | 17 | public void setId(final int id) { 18 | this.id = id; 19 | } 20 | 21 | public String getFirstName() { 22 | return firstName; 23 | } 24 | 25 | public void setFirstName(final String firstName) { 26 | this.firstName = firstName; 27 | } 28 | 29 | public String getLastName() { 30 | return lastName; 31 | } 32 | 33 | public void setLastName(final String lastName) { 34 | this.lastName = lastName; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return "Customer{" + "id=" + getId() + ", firstName='" + getFirstName() + '\'' + ", lastName='" 40 | + getLastName() + '\'' + '}'; 41 | } 42 | 43 | @Override 44 | public boolean equals(final Object that) { 45 | boolean isEqual = false; 46 | if (this == that) { 47 | isEqual = true; 48 | } else if (that != null && getClass() == that.getClass()) { 49 | final Customer customer = (Customer) that; 50 | if (getId() == customer.getId()) { 51 | isEqual = true; 52 | } 53 | } 54 | return isEqual; 55 | } 56 | 57 | @Override 58 | public int hashCode() { 59 | return getId(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/dam/src/main/java/CustomerDAM.java: -------------------------------------------------------------------------------- 1 | import java.sql.Connection; 2 | import java.sql.PreparedStatement; 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | import java.util.Optional; 6 | import java.util.Spliterator; 7 | import java.util.Spliterators; 8 | import java.util.function.Consumer; 9 | import java.util.stream.Stream; 10 | import java.util.stream.StreamSupport; 11 | 12 | import javax.sql.DataSource; 13 | 14 | public class CustomerDAM { 15 | 16 | private final DataSource dataSource; 17 | 18 | public CustomerDAM(DataSource dataSource) { 19 | this.dataSource = dataSource; 20 | } 21 | 22 | public Stream getAll() throws Exception { 23 | Connection connection = getConnection(); 24 | PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMERS"); // NOSONAR 25 | ResultSet resultSet = statement.executeQuery(); // NOSONAR 26 | return StreamSupport.stream(new Spliterators.AbstractSpliterator(Long.MAX_VALUE, 27 | Spliterator.ORDERED) { 28 | 29 | @Override 30 | public boolean tryAdvance(Consumer action) { 31 | try { 32 | if (!resultSet.next()) { 33 | return false; 34 | } 35 | action.accept(createCustomer(resultSet)); 36 | return true; 37 | } catch (SQLException e) { 38 | throw new RuntimeException(e); // NOSONAR 39 | } 40 | } 41 | }, false).onClose(() -> mutedClose(connection, statement, resultSet)); 42 | } 43 | 44 | private Connection getConnection() throws SQLException { 45 | return dataSource.getConnection(); 46 | } 47 | 48 | private void mutedClose(Connection connection, PreparedStatement statement, ResultSet resultSet) { 49 | try { 50 | resultSet.close(); 51 | statement.close(); 52 | connection.close(); 53 | } catch (SQLException e) { 54 | System.out.println("Exception thrown " + e.getMessage()); 55 | } 56 | } 57 | 58 | private Customer createCustomer(ResultSet resultSet) throws SQLException { 59 | return new Customer(resultSet.getInt("ID"), 60 | resultSet.getString("FNAME"), 61 | resultSet.getString("LNAME")); 62 | } 63 | 64 | public Optional getById(int id) throws Exception { 65 | 66 | ResultSet resultSet = null; 67 | 68 | Connection connection = getConnection(); 69 | PreparedStatement statement = 70 | connection.prepareStatement("SELECT * FROM CUSTOMERS WHERE ID = ?"); 71 | 72 | statement.setInt(1, id); 73 | resultSet = statement.executeQuery(); 74 | if (resultSet.next()) { 75 | return Optional.of(createCustomer(resultSet)); 76 | } else { 77 | return Optional.empty(); 78 | } 79 | } 80 | 81 | public boolean add(Customer customer) throws Exception { 82 | if (getById(customer.getId()).isPresent()) { 83 | return false; 84 | } 85 | 86 | Connection connection = getConnection(); 87 | PreparedStatement statement = 88 | connection.prepareStatement("INSERT INTO CUSTOMERS VALUES (?,?,?)"); 89 | statement.setInt(1, customer.getId()); 90 | statement.setString(2, customer.getFirstName()); 91 | statement.setString(3, customer.getLastName()); 92 | statement.execute(); 93 | return true; 94 | } 95 | 96 | public boolean add(final int id, 97 | final String firstName, 98 | final String lastName) throws Exception { 99 | return add(new Customer(id, firstName, lastName)); 100 | } 101 | 102 | public boolean update(Customer customer) throws Exception { 103 | Connection connection = getConnection(); 104 | PreparedStatement statement = 105 | connection.prepareStatement("UPDATE CUSTOMERS SET FNAME = ?, LNAME = ? WHERE ID = ?"); 106 | statement.setString(1, customer.getFirstName()); 107 | statement.setString(2, customer.getLastName()); 108 | statement.setInt(3, customer.getId()); 109 | return statement.executeUpdate() > 0; 110 | } 111 | 112 | public boolean delete(Customer customer) throws Exception { 113 | Connection connection = getConnection(); 114 | PreparedStatement statement = 115 | connection.prepareStatement("DELETE FROM CUSTOMERS WHERE ID = ?"); 116 | statement.setInt(1, customer.getId()); 117 | return statement.executeUpdate() > 0; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /demo/dam/src/main/java/CustomerSchemaSql.java: -------------------------------------------------------------------------------- 1 | public final class CustomerSchemaSql { 2 | 3 | private CustomerSchemaSql() {} 4 | 5 | public static final String CREATE_SCHEMA_SQL = "CREATE TABLE CUSTOMERS (ID NUMBER, FNAME VARCHAR(100), " 6 | + "LNAME VARCHAR(100))"; 7 | 8 | public static final String DELETE_SCHEMA_SQL = "DROP TABLE CUSTOMERS"; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /demo/dao/build.gradle: -------------------------------------------------------------------------------- 1 | version '1.0-SNAPSHOT' 2 | 3 | apply plugin: 'java' 4 | apply plugin: 'application' 5 | 6 | sourceCompatibility = 1.8 7 | 8 | mainClassName = "App" 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | 14 | dependencies { 15 | // https://mvnrepository.com/artifact/com.h2database/h2 16 | implementation group: 'com.h2database', name: 'h2', version: '1.4.200' 17 | } 18 | -------------------------------------------------------------------------------- /demo/dao/src/main/java/App.java: -------------------------------------------------------------------------------- 1 | import java.sql.Connection; 2 | import java.sql.SQLException; 3 | import java.sql.Statement; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.stream.Stream; 7 | 8 | import javax.sql.DataSource; 9 | 10 | import org.h2.jdbcx.JdbcDataSource; 11 | 12 | public class App { 13 | private static final String DB_URL = "jdbc:h2:~/tmp/h2db"; 14 | 15 | public static void main(final String[] args) throws Exception { 16 | final DataSource dataSource = createDataSource(); 17 | createSchema(dataSource); 18 | final CustomerDAO customerDAO = new H2CustomerDAO(dataSource); 19 | customerDAO.add(1, "Nguyen", "Van A"); 20 | customerDAO.add(2, "Tran", "Thi B"); 21 | customerDAO.add(3, "Bui", "Xuan C"); 22 | System.out.println("customerDAO.getAllCustomers(): "); 23 | try (Stream customerStream = customerDAO.getAll()) { 24 | customerStream.forEach((customer) -> System.out.println(customer)); 25 | } 26 | System.out.println("customerDAO.getCustomerById(2): " + customerDAO.getById(2)); 27 | final Customer customer = new Customer(4, "Vo", "Van D"); 28 | customerDAO.add(customer); 29 | System.out.println("customerDAO.getAllCustomers(): " + customerDAO.getAll()); 30 | customer.setFirstName("La"); 31 | customer.setLastName("Van F"); 32 | customerDAO.update(customer); 33 | System.out.println("customerDAO.getAllCustomers(): "); 34 | try (Stream customerStream = customerDAO.getAll()) { 35 | customerStream.forEach((cust) -> System.out.println(cust)); 36 | } 37 | customerDAO.delete(customer); 38 | System.out.println("customerDAO.getAllCustomers(): " + customerDAO.getAll()); 39 | deleteSchema(dataSource); 40 | } 41 | 42 | private static void deleteSchema(DataSource dataSource) throws SQLException { 43 | try (Connection connection = dataSource.getConnection(); 44 | Statement statement = connection.createStatement()) { 45 | statement.execute(CustomerSchemaSql.DELETE_SCHEMA_SQL); 46 | } 47 | } 48 | 49 | private static void createSchema(DataSource dataSource) throws SQLException { 50 | try (Connection connection = dataSource.getConnection(); 51 | Statement statement = connection.createStatement()) { 52 | statement.execute(CustomerSchemaSql.CREATE_SCHEMA_SQL); 53 | } 54 | } 55 | 56 | private static DataSource createDataSource() { 57 | JdbcDataSource dataSource = new JdbcDataSource(); 58 | dataSource.setURL(DB_URL); 59 | return dataSource; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/dao/src/main/java/Customer.java: -------------------------------------------------------------------------------- 1 | public class Customer { 2 | 3 | private int id; 4 | private String firstName; 5 | private String lastName; 6 | 7 | public Customer(final int id, final String firstName, final String lastName) { 8 | this.id = id; 9 | this.firstName = firstName; 10 | this.lastName = lastName; 11 | } 12 | 13 | public int getId() { 14 | return id; 15 | } 16 | 17 | public void setId(final int id) { 18 | this.id = id; 19 | } 20 | 21 | public String getFirstName() { 22 | return firstName; 23 | } 24 | 25 | public void setFirstName(final String firstName) { 26 | this.firstName = firstName; 27 | } 28 | 29 | public String getLastName() { 30 | return lastName; 31 | } 32 | 33 | public void setLastName(final String lastName) { 34 | this.lastName = lastName; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return "Customer{" + "id=" + getId() + ", firstName='" + getFirstName() + '\'' + ", lastName='" 40 | + getLastName() + '\'' + '}'; 41 | } 42 | 43 | @Override 44 | public boolean equals(final Object that) { 45 | boolean isEqual = false; 46 | if (this == that) { 47 | isEqual = true; 48 | } else if (that != null && getClass() == that.getClass()) { 49 | final Customer customer = (Customer) that; 50 | if (getId() == customer.getId()) { 51 | isEqual = true; 52 | } 53 | } 54 | return isEqual; 55 | } 56 | 57 | @Override 58 | public int hashCode() { 59 | return getId(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/dao/src/main/java/CustomerDAO.java: -------------------------------------------------------------------------------- 1 | import java.util.Optional; 2 | import java.util.stream.Stream; 3 | 4 | public interface CustomerDAO { 5 | public Stream getAll() throws Exception; 6 | public Optional getById(int id) throws Exception; 7 | public boolean add(Customer customer) throws Exception; 8 | public boolean add(final int id, 9 | final String firstName, 10 | final String lastName) throws Exception; 11 | public boolean update(Customer customer) throws Exception; 12 | public boolean delete(Customer customer) throws Exception; 13 | } 14 | -------------------------------------------------------------------------------- /demo/dao/src/main/java/CustomerSchemaSql.java: -------------------------------------------------------------------------------- 1 | public final class CustomerSchemaSql { 2 | 3 | private CustomerSchemaSql() {} 4 | 5 | public static final String CREATE_SCHEMA_SQL = "CREATE TABLE CUSTOMERS (ID NUMBER, FNAME VARCHAR(100), " 6 | + "LNAME VARCHAR(100))"; 7 | 8 | public static final String DELETE_SCHEMA_SQL = "DROP TABLE CUSTOMERS"; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /demo/dao/src/main/java/H2CustomerDAO.java: -------------------------------------------------------------------------------- 1 | import java.sql.Connection; 2 | import java.sql.PreparedStatement; 3 | import java.sql.ResultSet; 4 | import java.sql.SQLException; 5 | import java.util.Optional; 6 | import java.util.Spliterator; 7 | import java.util.Spliterators; 8 | import java.util.function.Consumer; 9 | import java.util.stream.Stream; 10 | import java.util.stream.StreamSupport; 11 | 12 | import javax.sql.DataSource; 13 | 14 | public class H2CustomerDAO implements CustomerDAO { 15 | 16 | private final DataSource dataSource; 17 | 18 | public H2CustomerDAO(DataSource dataSource) { 19 | this.dataSource = dataSource; 20 | } 21 | 22 | public Stream getAll() throws Exception { 23 | Connection connection = getConnection(); 24 | PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMERS"); // NOSONAR 25 | ResultSet resultSet = statement.executeQuery(); // NOSONAR 26 | return StreamSupport.stream(new Spliterators.AbstractSpliterator(Long.MAX_VALUE, 27 | Spliterator.ORDERED) { 28 | 29 | @Override 30 | public boolean tryAdvance(Consumer action) { 31 | try { 32 | if (!resultSet.next()) { 33 | return false; 34 | } 35 | action.accept(createCustomer(resultSet)); 36 | return true; 37 | } catch (SQLException e) { 38 | throw new RuntimeException(e); // NOSONAR 39 | } 40 | } 41 | }, false).onClose(() -> mutedClose(connection, statement, resultSet)); 42 | } 43 | 44 | private Connection getConnection() throws SQLException { 45 | return dataSource.getConnection(); 46 | } 47 | 48 | private void mutedClose(Connection connection, PreparedStatement statement, ResultSet resultSet) { 49 | try { 50 | resultSet.close(); 51 | statement.close(); 52 | connection.close(); 53 | } catch (SQLException e) { 54 | System.out.println("Exception thrown " + e.getMessage()); 55 | } 56 | } 57 | 58 | private Customer createCustomer(ResultSet resultSet) throws SQLException { 59 | return new Customer(resultSet.getInt("ID"), 60 | resultSet.getString("FNAME"), 61 | resultSet.getString("LNAME")); 62 | } 63 | 64 | public Optional getById(int id) throws Exception { 65 | 66 | ResultSet resultSet = null; 67 | 68 | Connection connection = getConnection(); 69 | PreparedStatement statement = 70 | connection.prepareStatement("SELECT * FROM CUSTOMERS WHERE ID = ?"); 71 | 72 | statement.setInt(1, id); 73 | resultSet = statement.executeQuery(); 74 | if (resultSet.next()) { 75 | return Optional.of(createCustomer(resultSet)); 76 | } else { 77 | return Optional.empty(); 78 | } 79 | } 80 | 81 | public boolean add(Customer customer) throws Exception { 82 | if (getById(customer.getId()).isPresent()) { 83 | return false; 84 | } 85 | 86 | Connection connection = getConnection(); 87 | PreparedStatement statement = 88 | connection.prepareStatement("INSERT INTO CUSTOMERS VALUES (?,?,?)"); 89 | statement.setInt(1, customer.getId()); 90 | statement.setString(2, customer.getFirstName()); 91 | statement.setString(3, customer.getLastName()); 92 | statement.execute(); 93 | return true; 94 | } 95 | 96 | public boolean add(final int id, 97 | final String firstName, 98 | final String lastName) throws Exception { 99 | return add(new Customer(id, firstName, lastName)); 100 | } 101 | 102 | public boolean update(Customer customer) throws Exception { 103 | Connection connection = getConnection(); 104 | PreparedStatement statement = 105 | connection.prepareStatement("UPDATE CUSTOMERS SET FNAME = ?, LNAME = ? WHERE ID = ?"); 106 | statement.setString(1, customer.getFirstName()); 107 | statement.setString(2, customer.getLastName()); 108 | statement.setInt(3, customer.getId()); 109 | return statement.executeUpdate() > 0; 110 | } 111 | 112 | public boolean delete(Customer customer) throws Exception { 113 | Connection connection = getConnection(); 114 | PreparedStatement statement = 115 | connection.prepareStatement("DELETE FROM CUSTOMERS WHERE ID = ?"); 116 | statement.setInt(1, customer.getId()); 117 | return statement.executeUpdate() > 0; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /demo/guess-number-cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | project(MVCDemo-guess-number) 3 | find_package(wxWidgets 3.0 REQUIRED) 4 | 5 | include(${wxWidgets_USE_FILE}) 6 | 7 | if (CMAKE_BUILD_TYPE STREQUAL "Debug") 8 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall") 9 | add_definitions(-DDEBUG) 10 | endif() 11 | 12 | add_executable(guess_number main.cpp game_controller.cpp 13 | game_model.cpp game_view.cpp) 14 | target_link_libraries(guess_number ${wxWidgets_LIBRARIES}) -------------------------------------------------------------------------------- /demo/guess-number-cpp/README.md: -------------------------------------------------------------------------------- 1 | # Minh họa kiến trúc MVC 2 | 3 | Triển khai trò chơi đoán số theo kiến trúc MVC 4 | 5 | ## Các biểu đồ 6 | 7 | ### Biểu đồ lớp 8 | 9 | ![Biểu đồ lớp với các lớp được biểu diễn bằng các hình chữ nhật](diagrams/class-structure-design.png) 10 | 11 | 12 | ### Biểu đồ tuần tự 13 | 14 | ![Biểu đồ tuần tự trường hợp tạo Game mới (bấm nút New Game)](diagrams/seq-create-newgame.png) 15 | 16 | ![Biểu đồ tuần tự trường hợp đoán số (bấm nút với nhãn là giá trị số)](diagrams/seq-guess-number.png) -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/blackcat.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/bitmaps/blackcat.bmp -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/blackcat.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_blackcat_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "52 33 148 2 ", 5 | " c black", 6 | ". c #010101", 7 | "X c #020202", 8 | "o c gray1", 9 | "O c #040404", 10 | "+ c gray2", 11 | "@ c #060606", 12 | "# c #070707", 13 | "$ c gray3", 14 | "% c #090909", 15 | "& c gray4", 16 | "* c #0C0C0C", 17 | "= c gray6", 18 | "- c #111111", 19 | "; c gray7", 20 | ": c gray8", 21 | "> c #151515", 22 | ", c #161616", 23 | "< c #191919", 24 | "1 c gray10", 25 | "2 c #1B1B1B", 26 | "3 c gray11", 27 | "4 c gray12", 28 | "5 c gray13", 29 | "6 c #252525", 30 | "7 c gray15", 31 | "8 c #282828", 32 | "9 c gray16", 33 | "0 c #2C2C2C", 34 | "q c #323232", 35 | "w c gray20", 36 | "e c gray21", 37 | "r c #3A3A3A", 38 | "t c gray23", 39 | "y c #3C3C3C", 40 | "u c gray24", 41 | "i c #3F3F3F", 42 | "p c #414141", 43 | "a c gray26", 44 | "s c #434343", 45 | "d c #444444", 46 | "f c #464646", 47 | "g c gray29", 48 | "h c #4C4C4C", 49 | "j c gray30", 50 | "k c #4E4E4E", 51 | "l c gray31", 52 | "z c #515151", 53 | "x c gray32", 54 | "c c #555555", 55 | "v c #585858", 56 | "b c gray35", 57 | "n c #5B5B5B", 58 | "m c gray36", 59 | "M c #5F5F5F", 60 | "N c gray38", 61 | "B c #646464", 62 | "V c #686868", 63 | "C c gray42", 64 | "Z c #6C6C6C", 65 | "A c gray43", 66 | "S c gray44", 67 | "D c #717171", 68 | "F c gray47", 69 | "G c #797979", 70 | "H c gray48", 71 | "J c #7B7B7B", 72 | "K c #7C7C7C", 73 | "L c gray49", 74 | "P c #808080", 75 | "I c #818181", 76 | "U c gray51", 77 | "Y c #868686", 78 | "T c #888888", 79 | "R c #8B8B8B", 80 | "E c gray55", 81 | "W c gray56", 82 | "Q c #939393", 83 | "! c gray59", 84 | "~ c #979797", 85 | "^ c #989898", 86 | "/ c gray60", 87 | "( c #9A9A9A", 88 | ") c #9B9B9B", 89 | "_ c #9D9D9D", 90 | "` c gray62", 91 | "' c #9F9F9F", 92 | "] c gray63", 93 | "[ c #A2A2A2", 94 | "{ c gray64", 95 | "} c #A4A4A4", 96 | "| c #A5A5A5", 97 | " . c #A9A9A9", 98 | ".. c #AAAAAA", 99 | "X. c #ACACAC", 100 | "o. c #AEAEAE", 101 | "O. c #AFAFAF", 102 | "+. c #B1B1B1", 103 | "@. c gray70", 104 | "#. c #B6B6B6", 105 | "$. c gray72", 106 | "%. c #B9B9B9", 107 | "&. c #BBBBBB", 108 | "*. c #BCBCBC", 109 | "=. c #C0C0C0", 110 | "-. c #C1C1C1", 111 | ";. c gray76", 112 | ":. c #C6C6C6", 113 | ">. c gray78", 114 | ",. c #C8C8C8", 115 | "<. c #CDCDCD", 116 | "1. c #CECECE", 117 | "2. c gray81", 118 | "3. c #D0D0D0", 119 | "4. c gray82", 120 | "5. c gray84", 121 | "6. c #D7D7D7", 122 | "7. c #D8D8D8", 123 | "8. c gray85", 124 | "9. c #DADADA", 125 | "0. c gray87", 126 | "q. c gray88", 127 | "w. c gray89", 128 | "e. c #E4E4E4", 129 | "r. c gray90", 130 | "t. c #E7E7E7", 131 | "y. c gray91", 132 | "u. c gray92", 133 | "i. c #ECECEC", 134 | "p. c gray93", 135 | "a. c #EEEEEE", 136 | "s. c #EFEFEF", 137 | "d. c gray94", 138 | "f. c #F1F1F1", 139 | "g. c gray95", 140 | "h. c #F3F3F3", 141 | "j. c #F4F4F4", 142 | "k. c gray96", 143 | "l. c #F6F6F6", 144 | "z. c gray97", 145 | "x. c #F8F8F8", 146 | "c. c #F9F9F9", 147 | "v. c gray98", 148 | "b. c #FBFBFB", 149 | "n. c gray99", 150 | "m. c #FDFDFD", 151 | "M. c #FEFEFE", 152 | "N. c white", 153 | /* pixels */ 154 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 155 | "N.N.N.N.N.N.N.N.N.N.N.,.d O O n x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 156 | "N.N.N.N.N.N.N.N.N.N.&.O -.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 157 | "N.N.N.N.N.N.N.N.N.x.5 S | | l.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 158 | "N.N.N.N.N.N.N.N.N.#. F N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 159 | "N.N.N.N.N.N.N.N.N.K 0.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 160 | "N.N.N.N.N.N.N.N.N.B d.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 161 | "N.N.N.N.N.N.N.N.N.Z 3.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.N.N.N.N.N.N.N.N.N.N.", 162 | "N.N.N.N.N.N.N.N.N.W R N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.S o.N.N.N.N.N.N.N.N.N.N.", 163 | "N.N.N.N.N.N.N.N.N.<. 7 N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.d.U K N.N.N.N.N.N.N.N.N.N.", 164 | "N.N.N.N.N.N.N.N.N.N.8 ` N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.) * $ V N.N.N.N.N.N.N.N.N.", 165 | "N.N.N.N.N.N.N.N.N.N.~ - 7.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.~ o.N.N.N.N.N.N.N.N.", 166 | "N.N.N.N.N.N.N.N.N.N.x.8 < Z d a k B U [ ,.p.N.N.N.N.N.N.N.N.N.N.N.[ O d N.N.N.N.N.N.N.N.", 167 | "N.N.N.N.N.N.N.N.N.N.N.-.O > r M U [ *.<.5.<.| g ..N.N.N.N.N.N.N.", 168 | "N.N.N.N.N.N.N.N.N.N.N.N.W 0 N.N.N.N.N.N.N.", 169 | "N.N.N.N.N.N.N.N.N.N.N.N.x.3 a N.N.N.N.N.N.N.", 170 | "N.N.N.N.N.N.N.N.N.N.N.N.*. > k N e.N.N.N.N.N.N.N.", 171 | "N.N.N.N.N.N.N.N.N.N.N.N.V z l.N.N.N.N.N.N.N.N.N.N.", 172 | "N.N.N.N.N.N.N.N.N.N.N.N.< $ p.N.N.N.N.N.N.N.N.N.N.N.", 173 | "N.N.N.N.N.N.N.N.N.N.N.-. u N.N.N.N.N.N.N.N.N.N.N.N.", 174 | "N.N.N.N.N.N.N.N.N.N.N.n z N.N.N.N.N.N.N.N.N.N.N.N.", 175 | "N.N.N.N.N.N.N.N.N.N.3. a N.N.N.N.N.N.N.N.N.N.N.N.", 176 | "N.N.N.N.N.N.N.N.N.l.w < N.N.N.N.N.N.N.N.N.N.N.N.", 177 | "N.N.N.N.N.N.N.N.x.d 0 &.w.e.3.o.K a O 7.N.N.N.N.N.N.N.N.N.N.N.", 178 | "N.N.N.N.N.N.N.N.) $ r F 8 O 3.N.N.N.N.N.N.N.e * ~ y.d.Q O R N.N.N.N.N.N.N.N.N.N.N.", 179 | "N.N.N.N.N.N.N.N.u 5 | d.N.N.e R N.N.N.N.N.N.N.N.a +.N.N.N.N.[ O 7 x.N.N.N.N.N.N.N.N.N.N.", 180 | "N.N.N.N.N.N.N.d.O $ w.N.N.N.N.> k N.N.N.N.N.N.N.N.N.3 N N.N.N.N.N.N.Y [ N.N.N.N.N.N.N.N.N.N.", 181 | "N.N.N.N.N.N.N.:. z N.N.N.N.x.O - y.N.N.N.N.N.N.N.N.e. * e.N.N.N.N.N.N.N.U < y.N.N.N.N.N.N.N.N.N.", 182 | "N.N.N.N.N.N.N.o. ~ N.N.N.N.N.7 c N.N.N.N.N.N.N.N.N.+. S N.N.N.N.N.N.N.N.N.W g x.N.N.N.N.N.N.N.N.", 183 | "N.N.N.N.N.N.N.+.$ w.N.N.N.N.N.) 3 d.N.N.N.N.N.N.N.N.U 3.N.N.N.N.N.N.N.N.N.N.[ O k d.N.N.N.N.N.N.N.", 184 | "N.N.N.N.N.N.N.l.5.N.N.N.N.N.N.N.n a #.x.N.N.N.N.N.N.F ) N.N.N.N.N.N.N.N.N.N.N.-.< w x.N.N.N.N.N.N.", 185 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.F * ..N.N.N.N.N.N.:.$ M N.N.N.N.N.N.N.N.N.N.N.N.y.V k d.N.N.N.N.N.N.", 186 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.l.7.N.N.N.N.N.N.N.N.p.x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N." 187 | }; 188 | -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/gomechan.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/bitmaps/gomechan.bmp -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/gomechan.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_gomechan_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "59 33 213 2 ", 5 | " c #662220", 6 | ". c #6E3D3B", 7 | "X c #745C5B", 8 | "o c #66605F", 9 | "O c #6F6C6C", 10 | "+ c #B17C1A", 11 | "@ c #845729", 12 | "# c #A75035", 13 | "$ c #A5692C", 14 | "% c #B56A30", 15 | "& c #D87C28", 16 | "* c #C4723E", 17 | "= c #E57D2A", 18 | "- c #AA6F58", 19 | "; c #847875", 20 | ": c #846867", 21 | "> c #B37068", 22 | ", c #C67B45", 23 | "< c #AA8F2D", 24 | "1 c #B99825", 25 | "2 c #BFA034", 26 | "3 c #B18F16", 27 | "4 c #C39B16", 28 | "5 c #EA891D", 29 | "6 c #EC931A", 30 | "7 c #EF9C16", 31 | "8 c #DAAD0E", 32 | "9 c #D5A80E", 33 | "0 c #CDA51B", 34 | "q c #CCA416", 35 | "w c #D6A913", 36 | "e c #DCAF10", 37 | "r c #D1A81A", 38 | "t c #DDB217", 39 | "y c #E4B40D", 40 | "u c #EBBA0D", 41 | "i c #E8B70D", 42 | "p c #F5B40D", 43 | "a c #F4BE0A", 44 | "s c #F8BF0A", 45 | "d c #EDA716", 46 | "f c #F2AA11", 47 | "g c #F1A919", 48 | "h c #ECBA10", 49 | "j c #E2B619", 50 | "k c #E7B919", 51 | "l c #F4B919", 52 | "z c #CE933D", 53 | "x c #C98225", 54 | "c c #EC982A", 55 | "v c #E88F32", 56 | "b c #C7A327", 57 | "n c #CEA923", 58 | "m c #C8A62D", 59 | "M c #D3AD29", 60 | "N c #D6AE24", 61 | "B c #C3A53B", 62 | "V c #CAAA3B", 63 | "C c #C8A835", 64 | "Z c #D2AE31", 65 | "A c #D7B438", 66 | "S c #E5BC2C", 67 | "D c #F3B83B", 68 | "F c #EAB52F", 69 | "G c #F8C207", 70 | "H c #F7C20A", 71 | "J c #F8C209", 72 | "K c #F7C413", 73 | "L c #F7C61A", 74 | "P c #F8C71C", 75 | "I c #F8C71A", 76 | "U c #F7C825", 77 | "Y c #F8C923", 78 | "T c #F7CA2B", 79 | "R c #F8CA2C", 80 | "E c #F6C525", 81 | "W c #F7CD35", 82 | "Q c #F8CC33", 83 | "! c #F8CE3C", 84 | "~ c #968750", 85 | "^ c #B59A49", 86 | "/ c #BDA242", 87 | "( c #BDA658", 88 | ") c #A49A72", 89 | "_ c #BBAD7C", 90 | "` c #BEAD73", 91 | "' c #B8A669", 92 | "] c #C98556", 93 | "[ c #E79046", 94 | "{ c #C4A946", 95 | "} c #C8AE52", 96 | "| c #CEB357", 97 | " . c #F2B642", 98 | ".. c #E9A357", 99 | "X. c #F0AF59", 100 | "o. c #EEB55D", 101 | "O. c #ECA148", 102 | "+. c #C89F6C", 103 | "@. c #D0A168", 104 | "#. c #C6B269", 105 | "$. c #C3B171", 106 | "%. c #C8B87A", 107 | "&. c #D4B87F", 108 | "*. c #EFB26E", 109 | "=. c #DEC154", 110 | "-. c #EBC84B", 111 | ";. c #F3C745", 112 | ":. c #F8D24C", 113 | ">. c #F8D148", 114 | ",. c #EACA56", 115 | "<. c #F9D454", 116 | "1. c #F9D65B", 117 | "2. c #F9D85F", 118 | "3. c #F7D558", 119 | "4. c #DFC465", 120 | "5. c #D6C37A", 121 | "6. c #F5CD6C", 122 | "7. c #F9D965", 123 | "8. c #F4D56C", 124 | "9. c #FADA6A", 125 | "0. c #EFD67C", 126 | "q. c #FADD74", 127 | "w. c #F7DA78", 128 | "e. c #AAA38A", 129 | "r. c #BAB08B", 130 | "t. c #ADA997", 131 | "y. c #B2AE9C", 132 | "u. c #B1AD96", 133 | "i. c #BCB69B", 134 | "p. c #B6A18A", 135 | "a. c #A9A8A8", 136 | "s. c #B0AEAD", 137 | "d. c #B4B1A4", 138 | "f. c #BAB6A3", 139 | "g. c #BDB9A4", 140 | "h. c #B5B4AB", 141 | "j. c #B9B7AB", 142 | "k. c #BDB9AC", 143 | "l. c #B6B4B3", 144 | "z. c #BCBAB3", 145 | "x. c #BCBBB8", 146 | "c. c #C1B58C", 147 | "v. c #C6B988", 148 | "b. c #C7AC94", 149 | "n. c #C3BB9B", 150 | "m. c #CBB89D", 151 | "M. c #C6BFA3", 152 | "N. c #C1BEAC", 153 | "B. c #C9BAA2", 154 | "V. c #C1BFB5", 155 | "C. c #CFC288", 156 | "Z. c #CCC298", 157 | "A. c #DED09B", 158 | "S. c #D4C692", 159 | "D. c #F3C589", 160 | "F. c #F9DF81", 161 | "G. c #EADA9C", 162 | "H. c #E6D597", 163 | "J. c #F7D797", 164 | "K. c #FAE185", 165 | "L. c #FBE38C", 166 | "P. c #FAE594", 167 | "I. c #FAE69A", 168 | "U. c #F5E093", 169 | "Y. c #C7C0A6", 170 | "T. c #CBC3A5", 171 | "R. c #CCC6AB", 172 | "E. c #CFC9AC", 173 | "W. c #D3CAA3", 174 | "Q. c #DACFA4", 175 | "!. c #D1CAAB", 176 | "~. c #D8CFA8", 177 | "^. c #DAD0A5", 178 | "/. c #DCD3AC", 179 | "(. c #C5C2B3", 180 | "). c #C9C5B4", 181 | "_. c #C3C2BC", 182 | "`. c #CCC8B2", 183 | "'. c #D2CDB5", 184 | "]. c #D8D4BA", 185 | "[. c #E4D9AD", 186 | "{. c #E4D8A6", 187 | "}. c #E3DAB0", 188 | "|. c #E9DEB1", 189 | " X c #F4D8AE", 190 | ".X c #EEE0A5", 191 | "XX c #FCEBAC", 192 | "oX c #F9E8A6", 193 | "OX c #EDE2B5", 194 | "+X c #F2E6B4", 195 | "@X c #FCEDB3", 196 | "#X c #F6EABA", 197 | "$X c #FCEEBC", 198 | "%X c #F2E7B8", 199 | "&X c #FCF0BD", 200 | "*X c #C5C4C2", 201 | "=X c #CAC9C6", 202 | "-X c #CCCCCA", 203 | ";X c #D0CECC", 204 | ":X c #D2D1CD", 205 | ">X c #DAD3C8", 206 | ",X c #D4D4D3", 207 | ".@X&XOXf.,X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X*X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5Xz.Y.&X&XK.K H m :Xk.Q.&Xk.5X", 228 | "5X#.! XX/.z.r.G G Y P.$X$X/.k.5X5X5X5X5X5X5X5X5X5X5X5X5X5Xy.5X5X5X5X5X5X5X5X5X5X5X5X5X:XT.#X&XXX:.J G m z.g.#X&XG.=X5X", 229 | "5X,Xj P L.$XZ.) i H J <.@X$X$X(.5X5X5X5X5X5X5X5X5X5X5X5X_.OX-X5X5X5X5X5X5X5X5X5X5X5X5XR.$XXX7.K G G 1 t./.&Xw.E ' 5X5X", 230 | "5X5XM.i J :.XX$X_ b H J L q.$XN.5X5X5X5X5X5X5X5X5X5X5X,XQ.9.f.5X5X5X5X5X5X5X5X5X5X5X-X[.@XL H H y ^ W.&XU.T H 2 1X5X5X", 231 | "5X5X5Xc.u J K 6.@X$X5.a H H oX^.:X5X5X5X5X5X5X5X5X5X1Xi.3.H H.V.5X5X5X5X5X5X5X5X5X5Xj.$X9.G G S {.&XJ.D a s C ,X5X5X5X", 232 | "5X5X5X5Xc.u G p c X.J.9.H G :.&Xd.5X5X5X5X5X5X5X5X:XY.&X&Xg Y G.j.5X5X5X5X5X5X5X5X:XQ.@XK G Q oXD.[ 6 a a 2 -X5X5X5X5X", 233 | "5X5X5X5X5XY.t J a f 5 5 6 G H I./._.5X5X5X5X5X1XV.H.@X&X*.p G P I.T.=X5X5X5X5X5X5Xf.$X<.G G D = 5 p G H ^ ,X5X5X5X5X5X", 234 | "5X5X5X5X5X5X:X{ u G G s p s H T $Xn.1X5X5X5X*XW.8. .D.X.F G H G H 1.[.N.1X5X5X5XV.OXP.H s s f a G G q r.5X5X5X5X5X5X5X", 235 | "5X5X5X,XR.W.'.).) < w u G G G G 7.$Xt.5X1Xk. X .v , ] ! K H G t V m l q.^._.5X=XW.XXP H J G J e 3 ~ d.`.T.!._.5X5X5X5X", 236 | "5X5X5X,X[.$X$X$X4X$X+XH.q.! G G s L.#Xu.M.I.N b.9X0X0X].t H ( 8X0X0X>Xm Y G.t.!.@XT G G H H 3.H.#X&X$XXXP.K.k.5X5X5X5X", 237 | "5X5X5X5XV.{.U L L U Q ! O.v H G H K J.n.P.d B.0X0X0X6X9Xv.m 8X5X0X0X0X6XN P .XS.T G G G G H c v F I K H H B 1X5X5X5X5X", 238 | "5X5X5X5X5X=X#.y G G G G J K G G G G B XXl , 0X0X0X*Xa.O 5X_ s.x.o 0X0X0XZ.H R A.i G G H H J a G G G H 0 _ 1X5X5X5X5X5X", 239 | "5X5X5X5X5X5X5X-Xv.} n e u w S G G H C.<.5 &.0X0X0XX h.. =Xa.O s. 2X0X0X5Xi J F.V H G H w e 8 q C #.j.1X5X5X5X5X5X5X5X", 240 | "5X5X5X5X5X5X5X5X_.).E.Z.S.q.P G G q +Xl 7 C.0X0X0X- @ ; :Xe.> @ ; -X0X0X9Xw 7 >.` H G H T =.r.R.E.(.:X5X5X5X5X5X5X5X5X", 241 | "5X5X5X5X5X5X5X*X|.@XL.:.K G G H G 2 I.s G | 0X0X0X>X@.b.!.V 3X+.p.0X0X0X>Xf 5 R S.H G H H G K 1.@X&XN.5X5X5X5X5X5X5X5X", 242 | "5X5X5X5X5X5X5X5X=X%.V q 9 e 9 0 -.2 L.H ! -.1X0X0X0X0X6XZ a m.0X0X0X0X0XT.J.X.E ^.u A r 8 8 q b %.).2X5X5X5X5X5X5X5X5X", 243 | "5X5X5X5X5X5X5X5X5X5X5X5X-Xt.}.U.Y B P.K @X4X/.).6X9X'.Z G G i &.3X0X c #EC4C4E", 22 | ", c #EE5B4E", 23 | "< c #EC4F50", 24 | "1 c #EC5455", 25 | "2 c #ED585A", 26 | "3 c #EE6A6B", 27 | "4 c #EA6E71", 28 | "5 c #FC8C29", 29 | "6 c #FD9226", 30 | "7 c #FC952A", 31 | "8 c #F99D2E", 32 | "9 c #FA9936", 33 | "0 c #F6A431", 34 | "q c #F2AC34", 35 | "w c #EEB436", 36 | "e c #E4B43F", 37 | "r c #EDB53B", 38 | "t c #A7AB5F", 39 | "y c #ABAC5E", 40 | "u c #B6AD59", 41 | "i c #91A666", 42 | "p c #97A865", 43 | "a c #95A96B", 44 | "s c #90A66C", 45 | "d c #8BA57B", 46 | "f c #B2AD75", 47 | "g c #A1B37D", 48 | "h c #F8944C", 49 | "j c #D7B247", 50 | "k c #D4B249", 51 | "l c #C0AF53", 52 | "z c #FBA248", 53 | "x c #EAB747", 54 | "c c #EDBA4A", 55 | "v c #EFBE51", 56 | "b c #E4B65F", 57 | "n c #F1B656", 58 | "m c #D6A27F", 59 | "M c #FCAF62", 60 | "N c #F1C76D", 61 | "B c #EDC571", 62 | "V c #F1CB76", 63 | "C c #F2CC7A", 64 | "Z c #769FB2", 65 | "A c #7DA1A1", 66 | "S c #6699CE", 67 | "D c #699BCC", 68 | "F c #6D9CC6", 69 | "G c #7A82DD", 70 | "H c #6B97D1", 71 | "J c #6E9ED0", 72 | "K c #7D95D8", 73 | "L c #79A5D4", 74 | "P c #7DB1DF", 75 | "I c #89A581", 76 | "U c #93AB80", 77 | "Y c #A8AB94", 78 | "T c #A8B988", 79 | "R c #96A4BA", 80 | "E c #BFA2B8", 81 | "W c #F08486", 82 | "Q c #F08A8B", 83 | "! c #F18E81", 84 | "~ c #DAA581", 85 | "^ c #DEA884", 86 | "/ c #E2AB86", 87 | "( c #E5AE88", 88 | ") c #EDB48D", 89 | "_ c #F1B78F", 90 | "` c #F6BB92", 91 | "' c #F6BF99", 92 | "] c #EAAFAC", 93 | "[ c #F2A4A5", 94 | "{ c #F3B7B8", 95 | "} c #F2BBBB", 96 | "| c #F3B4B5", 97 | " . c #B5C39B", 98 | ".. c #9DC5BB", 99 | "X. c #C9C798", 100 | "o. c #F9C187", 101 | "O. c #F2D18B", 102 | "+. c #F6C39E", 103 | "@. c #F3D99C", 104 | "#. c #F2D697", 105 | "$. c #C9D4B8", 106 | "%. c #F6CAA6", 107 | "&. c #FAD3AC", 108 | "*. c #F4DBA3", 109 | "=. c #EED4B7", 110 | "-. c #F7D0B5", 111 | ";. c #FAD7B4", 112 | ":. c #F4E0B2", 113 | ">. c #9F9CC1", 114 | ",. c #A394C4", 115 | "<. c #80AAD6", 116 | "1. c #97BADD", 117 | "2. c #BAD4C9", 118 | "3. c #ABC7E3", 119 | "4. c #A6DEFF", 120 | "5. c #A9DFFF", 121 | "6. c #ABDAF4", 122 | "7. c #ADE0FF", 123 | "8. c #B3E2FE", 124 | "9. c #BAE5FE", 125 | "0. c #CECCC4", 126 | "q. c #CECDC9", 127 | "w. c #D3D2CE", 128 | "e. c #D6DECA", 129 | "r. c #D6D9C9", 130 | "t. c #CBC9DD", 131 | "y. c #C0D0DD", 132 | "u. c #D4D4D0", 133 | "i. c #D9D9D7", 134 | "p. c #DDDCD9", 135 | "a. c #F5C7C8", 136 | "s. c #ECDCCC", 137 | "d. c #F7DBC7", 138 | "f. c #F7DDCA", 139 | "g. c #ECDFD2", 140 | "h. c #F5D4D5", 141 | "j. c #F6D7D8", 142 | "k. c #F6DDDE", 143 | "l. c #F5E7C4", 144 | "z. c #F8E5CA", 145 | "x. c #EBE4DD", 146 | "c. c #E5E6DE", 147 | "v. c #F7E1D2", 148 | "b. c #F7E5D8", 149 | "n. c #F7EBDD", 150 | "m. c #F8ECD8", 151 | "M. c #C3D7EB", 152 | "N. c #C8DAEC", 153 | "B. c #D6D8E6", 154 | "V. c #E3DAE2", 155 | "C. c #C1E7FE", 156 | "Z. c #C5E9FD", 157 | "A. c #CCEBFD", 158 | "S. c #CCE7F5", 159 | "D. c #D5EEFD", 160 | "F. c #DDE8F3", 161 | "G. c #DDF1FC", 162 | "H. c #D6E6E3", 163 | "J. c #EAE9E4", 164 | "K. c #EDEDE9", 165 | "L. c #E8E7E1", 166 | "P. c #F6E2E3", 167 | "I. c #F7EBEC", 168 | "U. c #F2F2EE", 169 | "Y. c #F8F2EB", 170 | "T. c #ECF2F7", 171 | "R. c #E2F2FC", 172 | "E. c #ECF6FC", 173 | "W. c #F4F5F4", 174 | "Q. c #F8F6F3", 175 | "!. c #F8F8F6", 176 | "~. c #F1F7FA", 177 | "^. c #F8F7F8", 178 | "/. c #F6F9FB", 179 | "(. c #F8FAFB", 180 | /* pixels */ 181 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 182 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.N.1.3.E.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 183 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.W.(.(.(.(.(.(.(.(.3.S S D L /.(.(.(.(.(.(.(.(.(.(.(.(.(.", 184 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.W.J.J.J.J.J.W.W.(.(.(.(.(./.D S S S S N.(.(.(.(.(.(.(.(.(.(.(.(.(.", 185 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.(.E.H S S S S 6.Q.(.(.(.(.(.(.(.(.(.(.(.(.", 186 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(./.9.P S D S L T.(.(.(.(.(.(.(.(.(.(.(.(.(.", 187 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(.A.7.8.3.L 1.F.(.(.(.(.(.!.Y.m.(.(.(.(.(.(.", 188 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.a.P.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.7.7.~.(.(././.(.(.(.(.(.&.9 6 M Q.(.(.(.(.", 189 | "(.(.(.(.(.(.(.(.(.(.(.(.(.P.: O { (.(.(.(.W.w.i./.!.!.~.w.u.(.(.(.E.4.C.(.(.(.(.(.(.(.(.R.S.9 6 6 6 &.(.(.(.(.", 190 | "(.(.(.(.R.D.A.D.(.(.(.(.(.Q 1 (.(.(.(.W.q.i.(.(.(.(.q.u.(.(.(.G.4.A.(.(.(.(.(.(./.Z.4.6.7 6 6 6 %.(.(.(.(.", 191 | "(.(.(.8.4.4.4.4.G.(.(./.(.Q > (.(.(.(.W.q.i.(.W.!.(.q.u.(.(.(.E.8.R.(.(.(.(.(.E.9.7.8.G.o.6 6 z Y.(.(.(.(.", 192 | "(.(.(.9.Z.D.G.G.(.(.8.8.E.k.: o E G.(.(.(.W.q.i.(.@.m.(.q.u.(.(.(.(.(.(.(.(.(.(.~.9.4.C./.(.(.z.;.Y.!.(.(.(.(.", 193 | "(.(.(.(.(.(.(.(.(.(.A.4.8.(.I.a.V.4.8.(.(.(.~.0.i.Q.c V (.w.w.(.(.(.(.(.(./.I.h.h.B.4.9.(.(.(.(.(.(.(.(.(.(.(.(.", 194 | "(.(.(.(.(.(.(.(.(.(.(.D.D.(.(.(.(.Z.4.D.(.(.W.0.r.@.w r z.0.u.(.(.(.(.k.Q > + 4 } (.(.(.(.(.(.(.(.(.(.(.", 195 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.E.4.9.(.(.#.x r w w w w x c l.(.I.W O # $ $ @ O 2 h.(.(.(.(.(.(.(.(.(.", 196 | "(.(.(.(.(.(.(.W. .a g e.(.(.(.(.(.(.8.4.(.(.Q.V w w w w w r *.(.P.1 . = 5 6 6 6 6 6 ; @ O | (.(.(.(.(.(.(.(.", 197 | "(.(.(.(.(.(.(. .i i i a H.E.(.(.(.(.9.7.E.(.(.!.N w w w w *.(.I.> $ 5 6 7 8 0 q 0 8 6 6 = O { (.(.(.(.(.(.(.", 198 | "(.(.(.(.(.(.(.a i i i i ..5.8.R.(.(.Z.7.~.(.(.(.V w w w w :.!.3 o * 6 6 q w w w w w w q 8 6 ; + k.(.(.(.(.(.(.", 199 | "(.(.(.(.(.(.(.g i i i i 2.9.5.5.D.(./.E.(.(.(.(.v r O.N r O.| X . 6 7 w w x u y t u j w w 0 6 - 3 (.(.(.(.(.(.", 200 | "(.(.(.(.(.(.(.e.a i i T W.(.R.7.4.R.(.(.(.(.(.Q.C n.(.(.l.O.1 5 6 q w k i p i i i i u r B -.s.] 1 h.(.(.(.(.(.", 201 | "(.(.(.(.(.(.(.(.L.$.e.W.(.(.(.E.7.R.(.(.(.(.(.(.(.(.(.(.(.j. @ 6 8 w j i s A F F Z d s X.J.J.J.J.x.} (.(.(.(.(.", 202 | "(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.[ = 6 q w t i Z S H S S D U c.J.J.J.J.L.L./.(.(.(.(.", 203 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.W ; 7 w e i I S H G G K 2.V.J.J.J.J.J.J.J.J.U.(.(.(.", 204 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.P.b.b.b.b.b.b.b.b.b.b.b.b.b.j.m , h z n b f Y R >.,.,.t.K.J.J.J.J.J.J.J.J.J.J.W.(.(.", 205 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` x.J.J.J.J.J.J.J.J.J.J.J.K.(.(.", 206 | "(.(.(.(.(.(.(.(.(.(.(.(.(.Q.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g.J.J.J.J.J.J.J.J.J.J.J.I.(.(.", 207 | "(.(.(.(.(.(.(.(.(.(.(.(.(.b.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` %.c.L.J.J.L.J.J.J.J.J.K.(.(.(.", 208 | "(.(.(.(.(.(.(.(.(.(.(.(.Q.%.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' b.W.W.W.W.W.W.W.W./.(.(.(.", 209 | "(.(.(.(.(.(.(.(.(.(.(.(.-.` ` ` _ _ ` ` ` ` ` _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 210 | "(.(.(.(.(.(.(.(.(.(.(.v.` ` ` ` m ~ ` ` ` ` _ m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 211 | "(.(.(.(.(.(.(.(.(.(.I.' ` ` ` ` / m / ) ` ) ~ m _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 212 | "(.(.(.(.(.(.(.(.(.^.%.` ` ` ` ` _ / m m m m m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 213 | "(.(.(.(.(.(.(.(.(.z.` ` ` ` ` ` ` ` ) ^ ^ ^ ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(." 214 | }; 215 | -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/new.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/bitmaps/new.bmp -------------------------------------------------------------------------------- /demo/guess-number-cpp/bitmaps/new.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_new_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "16 16 31 1", 5 | ". c #7198D9", 6 | "2 c #DCE6F6", 7 | ", c #FFFFFF", 8 | "= c #9AB6E4", 9 | "6 c #EAF0FA", 10 | "w c #6992D7", 11 | "0 c #5886D2", 12 | "7 c #F7F9FD", 13 | "5 c #F0F5FC", 14 | "* c #A8C0E8", 15 | " c None", 16 | "8 c #FDFEFF", 17 | "% c #C4D5F0", 18 | "3 c #E2EAF8", 19 | "+ c #4377CD", 20 | "O c #487BCE", 21 | "; c #6B94D7", 22 | "- c #89A9DF", 23 | ": c #5584D1", 24 | "# c #3569BF", 25 | "@ c #3A70CA", 26 | "1 c #D2DFF4", 27 | "> c #3366BB", 28 | "$ c #2E5CA8", 29 | "9 c #FAFCFE", 30 | "4 c #F5F8FD", 31 | "q c #638ED5", 32 | "o c #5282D0", 33 | "& c #B8CCEC", 34 | "X c #376EC9", 35 | "< c #ACE95B", 36 | /* pixels */ 37 | " .XoO+@#$. ", 38 | " .%%&*=-O;: ", 39 | " >>>>%&*=O,=o ", 40 | " ><<>%%&*O,,=o ", 41 | ">>><<>>>%&OOo+@ ", 42 | "><<<<<<>1%&*=-@ ", 43 | "><<<<<<>21%&*=@ ", 44 | ">>><<>>>321%&*+ ", 45 | " ><<>456321%&O ", 46 | " >>>>7456321%o ", 47 | " .,8974563210 ", 48 | " .,,897456320 ", 49 | " .,,,8974563q ", 50 | " .,,,,897456w ", 51 | " .,,,,,89745w ", 52 | " ............ " 53 | }; 54 | -------------------------------------------------------------------------------- /demo/guess-number-cpp/conf.h: -------------------------------------------------------------------------------- 1 | #ifndef CONF_H_ 2 | #define CONF_H_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #define SZ 36 7 | 8 | #endif // CONF_H_ -------------------------------------------------------------------------------- /demo/guess-number-cpp/diagrams/class-structure-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/diagrams/class-structure-design.png -------------------------------------------------------------------------------- /demo/guess-number-cpp/diagrams/seq-create-newgame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/diagrams/seq-create-newgame.png -------------------------------------------------------------------------------- /demo/guess-number-cpp/diagrams/seq-guess-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-cpp/diagrams/seq-guess-number.png -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_controller.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "game_controller.h" 4 | #include "game_model.h" 5 | #include "game_view.h" 6 | 7 | GameController::GameController(GameModel *model_) 8 | : model(model_){ 9 | } 10 | void GameController::NewGame() { 11 | model->Init(); 12 | view->Render(); 13 | } 14 | void GameController::Guess(int number) { 15 | model->Submit(number); 16 | view->Render(); 17 | } 18 | void GameController::SetView(GameView *v) { 19 | view = v; 20 | view->Render(); 21 | } -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_controller.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_CONTROLLER_H_ 2 | #define GAME_CONTROLLER_H_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | class GameModel; 7 | class GameView; 8 | 9 | class GameController { 10 | public: 11 | GameController(GameModel *model_); 12 | void NewGame(); 13 | void Guess(int number); 14 | void SetView(GameView *v); 15 | private: 16 | GameModel *model; 17 | GameView *view; 18 | }; 19 | 20 | #endif // GAME_CONTROLLER_H_ -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_model.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "conf.h" 4 | 5 | #include "game_model.h" 6 | 7 | #ifdef DEBUG 8 | #include 9 | #endif 10 | 11 | #include 12 | #include 13 | 14 | GameModel::GameModel() { 15 | std::srand(std::time(NULL)); 16 | Init(); 17 | } 18 | 19 | void GameModel::Init() { 20 | secret = std::rand() % SZ + 1; 21 | #ifdef DEBUG 22 | std::cout << secret << std::endl; 23 | #endif // DEBUG 24 | for (int i = 0; i <= SZ; ++i) { 25 | slots[i] = NORMAL; 26 | } 27 | lifes = number_of_guesses; 28 | } 29 | 30 | void GameModel::Submit(int guess) { 31 | if (guess == secret) { 32 | Won(); 33 | return; 34 | } 35 | if (guess < secret) { 36 | Disable(1, guess); 37 | } else { 38 | Disable(guess, SZ); 39 | } 40 | --lifes; 41 | if (lifes < 1) { 42 | Failed(); 43 | } 44 | } 45 | 46 | int GameModel::GetLifes() { 47 | return lifes; 48 | } 49 | 50 | void GameModel::Won() { 51 | for (int i = 1; i <= SZ; ++i) { 52 | slots[i] = WRONG; 53 | } 54 | slots[secret] = WON; 55 | } 56 | 57 | void GameModel::Failed() { 58 | for (int i = 1; i <= SZ; ++i) { 59 | slots[i] = WRONG; 60 | } 61 | slots[secret] = FAILED; 62 | } 63 | 64 | void GameModel::Disable(int from, int to) { 65 | for (int i = from; i <= to; ++i) { 66 | slots[i] = WRONG; 67 | } 68 | } 69 | 70 | GameModel::State GameModel::GetState(int idx) { 71 | return slots[idx]; 72 | } -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_model.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_MODEL_HPP_ 2 | #define GAME_MODEL_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | 8 | #include 9 | #include 10 | 11 | class GameModel { 12 | public: 13 | enum State { 14 | NORMAL, 15 | WRONG, 16 | WON, 17 | FAILED 18 | }; 19 | GameModel(); 20 | void Init(); 21 | void Submit(int guess); 22 | State GetState(int idx); 23 | int GetLifes(); 24 | private: 25 | void Won(); 26 | void Failed(); 27 | void Disable(int from, int to); 28 | State slots[SZ + 1]; 29 | int secret; 30 | int lifes; 31 | const int number_of_guesses = 3; 32 | }; 33 | 34 | #endif // GAME_MODEL_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_view.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "bitmaps/blackcat.xpm" 4 | #include "bitmaps/inspiration.xpm" 5 | #include "bitmaps/gomechan.xpm" 6 | #include "conf.h" 7 | #include "game_controller.h" 8 | #include "game_model.h" 9 | #include "game_view.h" 10 | 11 | #include 12 | #include 13 | #include 14 | 15 | GameView::GameView(): wxFrame(nullptr, wxID_ANY, 16 | "Time Flies", wxDefaultPosition, {480, 320}) { 17 | tool_bar = this->CreateToolBar(wxTB_HORIZONTAL, wxID_ANY); 18 | btn_new_game = new wxButton( tool_bar, wxID_ANY, wxT("New Game"), 19 | wxDefaultPosition, wxDefaultSize, 0 ); 20 | tool_bar->AddControl(btn_new_game); 21 | btn_new_game->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { 22 | controller->NewGame(); 23 | }); 24 | 25 | bmp_won = new wxBitmap(img_gomechan_xpm); 26 | bmp_failed = new wxBitmap(img_blackcat_xpm); 27 | bmp_progress = new wxBitmap(img_inspiration_xpm); 28 | 29 | tool_bar->AddSeparator(); 30 | lbl_indicator = new wxStaticText(tool_bar, wxID_ANY, 31 | wxT("///"), wxDefaultPosition, {30, 30}, 0); 32 | lbl_indicator->Wrap(-1); 33 | lbl_indicator->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, 34 | wxFONTWEIGHT_BOLD, false, wxEmptyString)); 35 | tool_bar->AddControl(lbl_indicator); 36 | tool_bar->AddSeparator(); 37 | bmp_out_come = new wxStaticBitmap(tool_bar, wxID_ANY, 38 | wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); 39 | tool_bar->AddControl(bmp_out_come); 40 | tool_bar->Realize(); 41 | 42 | wxWrapSizer* sizer; 43 | sizer = new wxWrapSizer( wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS ); 44 | 45 | for (int i = 1; i <= SZ; ++i) { 46 | std::stringstream ss; 47 | ss << i; 48 | buttons[i] = new wxButton( this, wxID_ANY, 49 | ss.str(), wxDefaultPosition, {70, 30}, 0 ); 50 | buttons[i]->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, 51 | wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, 52 | false, wxEmptyString)); 53 | buttons[i]->Bind(wxEVT_BUTTON, [&, i](wxCommandEvent& event) { 54 | controller->Guess(i); 55 | }); 56 | sizer->Add(buttons[i], 0, wxALL, 5 ); 57 | } 58 | 59 | this->SetSizer(sizer); 60 | this->Layout(); 61 | this->Centre(wxBOTH); 62 | } 63 | 64 | void GameView::SetController(GameController *c) { 65 | controller = c; 66 | c->SetView(this); 67 | } 68 | 69 | void GameView::SetModel(GameModel *m) { 70 | model = m; 71 | } 72 | 73 | void GameView::Render() { 74 | int ended = 0; 75 | for (int i = 1; i <= SZ; ++i) { 76 | switch(model->GetState(i)) { 77 | case GameModel::NORMAL: 78 | buttons[i]->Enable(true); 79 | buttons[i]->SetBackgroundColour( 80 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 81 | break; 82 | case GameModel::WRONG: 83 | buttons[i]->Enable(false); 84 | buttons[i]->SetBackgroundColour( 85 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 86 | break; 87 | case GameModel::WON: 88 | ended = 1; 89 | bmp_out_come->SetBitmap(*bmp_won); 90 | buttons[i]->Enable(false); 91 | buttons[i]->SetBackgroundColour(wxColour(10, 246, 10)); 92 | break; 93 | case GameModel::FAILED: 94 | ended = 2; 95 | bmp_out_come->SetBitmap(*bmp_failed); 96 | buttons[i]->Enable(false); 97 | buttons[i]->SetBackgroundColour(wxColour(246, 10, 10)); 98 | break; 99 | } 100 | } 101 | int n = model->GetLifes(); 102 | std::stringstream ss; 103 | for (int i = 0; i < n; ++i) { 104 | ss << "/"; 105 | } 106 | lbl_indicator->SetLabel(ss.str()); 107 | if (!ended) { 108 | bmp_out_come->SetBitmap(*bmp_progress); 109 | } 110 | } -------------------------------------------------------------------------------- /demo/guess-number-cpp/game_view.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_VIEW_HPP_ 2 | #define GAME_VIEW_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | 8 | #include 9 | 10 | class GameController; 11 | class GameModel; 12 | 13 | class GameView: public wxFrame { 14 | public: 15 | GameView(); 16 | void SetController(GameController *c); 17 | void SetModel(GameModel *m); 18 | void Render(); 19 | private: 20 | wxButton *buttons[SZ + 1]; 21 | wxToolBar* tool_bar; 22 | wxButton* btn_new_game; 23 | wxStaticText* lbl_indicator; 24 | wxStaticBitmap* bmp_out_come; 25 | wxBitmap *bmp_won; 26 | wxBitmap *bmp_failed; 27 | wxBitmap *bmp_progress; 28 | GameModel *model; 29 | GameController *controller; 30 | }; 31 | 32 | #endif // GAME_VIEW_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-cpp/main.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "game_controller.h" 4 | #include "game_model.h" 5 | #include "game_view.h" 6 | 7 | class Application : public wxApp { 8 | bool OnInit() override { 9 | view = new GameView(); 10 | model = new GameModel(); 11 | controller = new GameController(model); 12 | view->SetModel(model); 13 | view->SetController(controller); 14 | view->Show(); 15 | return true; 16 | } 17 | int OnExit() override { 18 | delete model; 19 | 20 | // TODO: view should be freed automatically by wxwidgets?? 21 | // delete view; 22 | 23 | delete controller; 24 | return wxApp::OnExit(); 25 | } 26 | private: 27 | GameView *view; 28 | GameModel *model; 29 | GameController *controller; 30 | }; 31 | 32 | wxIMPLEMENT_APP(Application); -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | project(MVCDemo-guess-number) 3 | find_package(wxWidgets 3.0 REQUIRED) 4 | 5 | include(${wxWidgets_USE_FILE}) 6 | 7 | if (CMAKE_BUILD_TYPE STREQUAL "Debug") 8 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall") 9 | add_definitions(-DDEBUG) 10 | endif() 11 | 12 | add_executable(guess_number main.cpp game_model.cpp game_view.cpp) 13 | target_link_libraries(guess_number ${wxWidgets_LIBRARIES}) -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/README.md: -------------------------------------------------------------------------------- 1 | # Kiến trúc Document-View? 2 | 3 | Giản lược triển khai MVC với C++, chỉ giữ lại Model và View / Tích hợp View với Controller. 4 | 5 | ## Các biểu đồ 6 | 7 | ### Biểu đồ lớp 8 | 9 | ![Biểu đồ lớp với các lớp được biểu diễn bằng các hình chữ nhật](diagrams/class-structure-design.png) 10 | 11 | Quan hệ giữa các thành phần 12 | 13 | ### Biểu đồ tuần tự 14 | 15 | ![Biểu đồ tuần tự trường hợp tạo Game mới (bấm nút New Game)](diagrams/seq-create-newgame.png) 16 | 17 | Tạo game mới 18 | 19 | ![Biểu đồ tuần tự trường hợp đoán số (bấm nút với nhãn là giá trị số)](diagrams/seq-guess-number.png) 20 | 21 | Đoán số 22 | 23 | ![Biểu đồ tuần tự khởi tạo các đối tượng](diagrams/seq-init-app.png) 24 | 25 | Khởi tạo các đối tượng -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/blackcat.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/bitmaps/blackcat.bmp -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/blackcat.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_blackcat_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "52 33 148 2 ", 5 | " c black", 6 | ". c #010101", 7 | "X c #020202", 8 | "o c gray1", 9 | "O c #040404", 10 | "+ c gray2", 11 | "@ c #060606", 12 | "# c #070707", 13 | "$ c gray3", 14 | "% c #090909", 15 | "& c gray4", 16 | "* c #0C0C0C", 17 | "= c gray6", 18 | "- c #111111", 19 | "; c gray7", 20 | ": c gray8", 21 | "> c #151515", 22 | ", c #161616", 23 | "< c #191919", 24 | "1 c gray10", 25 | "2 c #1B1B1B", 26 | "3 c gray11", 27 | "4 c gray12", 28 | "5 c gray13", 29 | "6 c #252525", 30 | "7 c gray15", 31 | "8 c #282828", 32 | "9 c gray16", 33 | "0 c #2C2C2C", 34 | "q c #323232", 35 | "w c gray20", 36 | "e c gray21", 37 | "r c #3A3A3A", 38 | "t c gray23", 39 | "y c #3C3C3C", 40 | "u c gray24", 41 | "i c #3F3F3F", 42 | "p c #414141", 43 | "a c gray26", 44 | "s c #434343", 45 | "d c #444444", 46 | "f c #464646", 47 | "g c gray29", 48 | "h c #4C4C4C", 49 | "j c gray30", 50 | "k c #4E4E4E", 51 | "l c gray31", 52 | "z c #515151", 53 | "x c gray32", 54 | "c c #555555", 55 | "v c #585858", 56 | "b c gray35", 57 | "n c #5B5B5B", 58 | "m c gray36", 59 | "M c #5F5F5F", 60 | "N c gray38", 61 | "B c #646464", 62 | "V c #686868", 63 | "C c gray42", 64 | "Z c #6C6C6C", 65 | "A c gray43", 66 | "S c gray44", 67 | "D c #717171", 68 | "F c gray47", 69 | "G c #797979", 70 | "H c gray48", 71 | "J c #7B7B7B", 72 | "K c #7C7C7C", 73 | "L c gray49", 74 | "P c #808080", 75 | "I c #818181", 76 | "U c gray51", 77 | "Y c #868686", 78 | "T c #888888", 79 | "R c #8B8B8B", 80 | "E c gray55", 81 | "W c gray56", 82 | "Q c #939393", 83 | "! c gray59", 84 | "~ c #979797", 85 | "^ c #989898", 86 | "/ c gray60", 87 | "( c #9A9A9A", 88 | ") c #9B9B9B", 89 | "_ c #9D9D9D", 90 | "` c gray62", 91 | "' c #9F9F9F", 92 | "] c gray63", 93 | "[ c #A2A2A2", 94 | "{ c gray64", 95 | "} c #A4A4A4", 96 | "| c #A5A5A5", 97 | " . c #A9A9A9", 98 | ".. c #AAAAAA", 99 | "X. c #ACACAC", 100 | "o. c #AEAEAE", 101 | "O. c #AFAFAF", 102 | "+. c #B1B1B1", 103 | "@. c gray70", 104 | "#. c #B6B6B6", 105 | "$. c gray72", 106 | "%. c #B9B9B9", 107 | "&. c #BBBBBB", 108 | "*. c #BCBCBC", 109 | "=. c #C0C0C0", 110 | "-. c #C1C1C1", 111 | ";. c gray76", 112 | ":. c #C6C6C6", 113 | ">. c gray78", 114 | ",. c #C8C8C8", 115 | "<. c #CDCDCD", 116 | "1. c #CECECE", 117 | "2. c gray81", 118 | "3. c #D0D0D0", 119 | "4. c gray82", 120 | "5. c gray84", 121 | "6. c #D7D7D7", 122 | "7. c #D8D8D8", 123 | "8. c gray85", 124 | "9. c #DADADA", 125 | "0. c gray87", 126 | "q. c gray88", 127 | "w. c gray89", 128 | "e. c #E4E4E4", 129 | "r. c gray90", 130 | "t. c #E7E7E7", 131 | "y. c gray91", 132 | "u. c gray92", 133 | "i. c #ECECEC", 134 | "p. c gray93", 135 | "a. c #EEEEEE", 136 | "s. c #EFEFEF", 137 | "d. c gray94", 138 | "f. c #F1F1F1", 139 | "g. c gray95", 140 | "h. c #F3F3F3", 141 | "j. c #F4F4F4", 142 | "k. c gray96", 143 | "l. c #F6F6F6", 144 | "z. c gray97", 145 | "x. c #F8F8F8", 146 | "c. c #F9F9F9", 147 | "v. c gray98", 148 | "b. c #FBFBFB", 149 | "n. c gray99", 150 | "m. c #FDFDFD", 151 | "M. c #FEFEFE", 152 | "N. c white", 153 | /* pixels */ 154 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 155 | "N.N.N.N.N.N.N.N.N.N.N.,.d O O n x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 156 | "N.N.N.N.N.N.N.N.N.N.&.O -.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 157 | "N.N.N.N.N.N.N.N.N.x.5 S | | l.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 158 | "N.N.N.N.N.N.N.N.N.#. F N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 159 | "N.N.N.N.N.N.N.N.N.K 0.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 160 | "N.N.N.N.N.N.N.N.N.B d.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 161 | "N.N.N.N.N.N.N.N.N.Z 3.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.N.N.N.N.N.N.N.N.N.N.", 162 | "N.N.N.N.N.N.N.N.N.W R N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.S o.N.N.N.N.N.N.N.N.N.N.", 163 | "N.N.N.N.N.N.N.N.N.<. 7 N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.d.U K N.N.N.N.N.N.N.N.N.N.", 164 | "N.N.N.N.N.N.N.N.N.N.8 ` N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.) * $ V N.N.N.N.N.N.N.N.N.", 165 | "N.N.N.N.N.N.N.N.N.N.~ - 7.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.~ o.N.N.N.N.N.N.N.N.", 166 | "N.N.N.N.N.N.N.N.N.N.x.8 < Z d a k B U [ ,.p.N.N.N.N.N.N.N.N.N.N.N.[ O d N.N.N.N.N.N.N.N.", 167 | "N.N.N.N.N.N.N.N.N.N.N.-.O > r M U [ *.<.5.<.| g ..N.N.N.N.N.N.N.", 168 | "N.N.N.N.N.N.N.N.N.N.N.N.W 0 N.N.N.N.N.N.N.", 169 | "N.N.N.N.N.N.N.N.N.N.N.N.x.3 a N.N.N.N.N.N.N.", 170 | "N.N.N.N.N.N.N.N.N.N.N.N.*. > k N e.N.N.N.N.N.N.N.", 171 | "N.N.N.N.N.N.N.N.N.N.N.N.V z l.N.N.N.N.N.N.N.N.N.N.", 172 | "N.N.N.N.N.N.N.N.N.N.N.N.< $ p.N.N.N.N.N.N.N.N.N.N.N.", 173 | "N.N.N.N.N.N.N.N.N.N.N.-. u N.N.N.N.N.N.N.N.N.N.N.N.", 174 | "N.N.N.N.N.N.N.N.N.N.N.n z N.N.N.N.N.N.N.N.N.N.N.N.", 175 | "N.N.N.N.N.N.N.N.N.N.3. a N.N.N.N.N.N.N.N.N.N.N.N.", 176 | "N.N.N.N.N.N.N.N.N.l.w < N.N.N.N.N.N.N.N.N.N.N.N.", 177 | "N.N.N.N.N.N.N.N.x.d 0 &.w.e.3.o.K a O 7.N.N.N.N.N.N.N.N.N.N.N.", 178 | "N.N.N.N.N.N.N.N.) $ r F 8 O 3.N.N.N.N.N.N.N.e * ~ y.d.Q O R N.N.N.N.N.N.N.N.N.N.N.", 179 | "N.N.N.N.N.N.N.N.u 5 | d.N.N.e R N.N.N.N.N.N.N.N.a +.N.N.N.N.[ O 7 x.N.N.N.N.N.N.N.N.N.N.", 180 | "N.N.N.N.N.N.N.d.O $ w.N.N.N.N.> k N.N.N.N.N.N.N.N.N.3 N N.N.N.N.N.N.Y [ N.N.N.N.N.N.N.N.N.N.", 181 | "N.N.N.N.N.N.N.:. z N.N.N.N.x.O - y.N.N.N.N.N.N.N.N.e. * e.N.N.N.N.N.N.N.U < y.N.N.N.N.N.N.N.N.N.", 182 | "N.N.N.N.N.N.N.o. ~ N.N.N.N.N.7 c N.N.N.N.N.N.N.N.N.+. S N.N.N.N.N.N.N.N.N.W g x.N.N.N.N.N.N.N.N.", 183 | "N.N.N.N.N.N.N.+.$ w.N.N.N.N.N.) 3 d.N.N.N.N.N.N.N.N.U 3.N.N.N.N.N.N.N.N.N.N.[ O k d.N.N.N.N.N.N.N.", 184 | "N.N.N.N.N.N.N.l.5.N.N.N.N.N.N.N.n a #.x.N.N.N.N.N.N.F ) N.N.N.N.N.N.N.N.N.N.N.-.< w x.N.N.N.N.N.N.", 185 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.F * ..N.N.N.N.N.N.:.$ M N.N.N.N.N.N.N.N.N.N.N.N.y.V k d.N.N.N.N.N.N.", 186 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.l.7.N.N.N.N.N.N.N.N.p.x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N." 187 | }; 188 | -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/gomechan.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/bitmaps/gomechan.bmp -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/gomechan.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_gomechan_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "59 33 213 2 ", 5 | " c #662220", 6 | ". c #6E3D3B", 7 | "X c #745C5B", 8 | "o c #66605F", 9 | "O c #6F6C6C", 10 | "+ c #B17C1A", 11 | "@ c #845729", 12 | "# c #A75035", 13 | "$ c #A5692C", 14 | "% c #B56A30", 15 | "& c #D87C28", 16 | "* c #C4723E", 17 | "= c #E57D2A", 18 | "- c #AA6F58", 19 | "; c #847875", 20 | ": c #846867", 21 | "> c #B37068", 22 | ", c #C67B45", 23 | "< c #AA8F2D", 24 | "1 c #B99825", 25 | "2 c #BFA034", 26 | "3 c #B18F16", 27 | "4 c #C39B16", 28 | "5 c #EA891D", 29 | "6 c #EC931A", 30 | "7 c #EF9C16", 31 | "8 c #DAAD0E", 32 | "9 c #D5A80E", 33 | "0 c #CDA51B", 34 | "q c #CCA416", 35 | "w c #D6A913", 36 | "e c #DCAF10", 37 | "r c #D1A81A", 38 | "t c #DDB217", 39 | "y c #E4B40D", 40 | "u c #EBBA0D", 41 | "i c #E8B70D", 42 | "p c #F5B40D", 43 | "a c #F4BE0A", 44 | "s c #F8BF0A", 45 | "d c #EDA716", 46 | "f c #F2AA11", 47 | "g c #F1A919", 48 | "h c #ECBA10", 49 | "j c #E2B619", 50 | "k c #E7B919", 51 | "l c #F4B919", 52 | "z c #CE933D", 53 | "x c #C98225", 54 | "c c #EC982A", 55 | "v c #E88F32", 56 | "b c #C7A327", 57 | "n c #CEA923", 58 | "m c #C8A62D", 59 | "M c #D3AD29", 60 | "N c #D6AE24", 61 | "B c #C3A53B", 62 | "V c #CAAA3B", 63 | "C c #C8A835", 64 | "Z c #D2AE31", 65 | "A c #D7B438", 66 | "S c #E5BC2C", 67 | "D c #F3B83B", 68 | "F c #EAB52F", 69 | "G c #F8C207", 70 | "H c #F7C20A", 71 | "J c #F8C209", 72 | "K c #F7C413", 73 | "L c #F7C61A", 74 | "P c #F8C71C", 75 | "I c #F8C71A", 76 | "U c #F7C825", 77 | "Y c #F8C923", 78 | "T c #F7CA2B", 79 | "R c #F8CA2C", 80 | "E c #F6C525", 81 | "W c #F7CD35", 82 | "Q c #F8CC33", 83 | "! c #F8CE3C", 84 | "~ c #968750", 85 | "^ c #B59A49", 86 | "/ c #BDA242", 87 | "( c #BDA658", 88 | ") c #A49A72", 89 | "_ c #BBAD7C", 90 | "` c #BEAD73", 91 | "' c #B8A669", 92 | "] c #C98556", 93 | "[ c #E79046", 94 | "{ c #C4A946", 95 | "} c #C8AE52", 96 | "| c #CEB357", 97 | " . c #F2B642", 98 | ".. c #E9A357", 99 | "X. c #F0AF59", 100 | "o. c #EEB55D", 101 | "O. c #ECA148", 102 | "+. c #C89F6C", 103 | "@. c #D0A168", 104 | "#. c #C6B269", 105 | "$. c #C3B171", 106 | "%. c #C8B87A", 107 | "&. c #D4B87F", 108 | "*. c #EFB26E", 109 | "=. c #DEC154", 110 | "-. c #EBC84B", 111 | ";. c #F3C745", 112 | ":. c #F8D24C", 113 | ">. c #F8D148", 114 | ",. c #EACA56", 115 | "<. c #F9D454", 116 | "1. c #F9D65B", 117 | "2. c #F9D85F", 118 | "3. c #F7D558", 119 | "4. c #DFC465", 120 | "5. c #D6C37A", 121 | "6. c #F5CD6C", 122 | "7. c #F9D965", 123 | "8. c #F4D56C", 124 | "9. c #FADA6A", 125 | "0. c #EFD67C", 126 | "q. c #FADD74", 127 | "w. c #F7DA78", 128 | "e. c #AAA38A", 129 | "r. c #BAB08B", 130 | "t. c #ADA997", 131 | "y. c #B2AE9C", 132 | "u. c #B1AD96", 133 | "i. c #BCB69B", 134 | "p. c #B6A18A", 135 | "a. c #A9A8A8", 136 | "s. c #B0AEAD", 137 | "d. c #B4B1A4", 138 | "f. c #BAB6A3", 139 | "g. c #BDB9A4", 140 | "h. c #B5B4AB", 141 | "j. c #B9B7AB", 142 | "k. c #BDB9AC", 143 | "l. c #B6B4B3", 144 | "z. c #BCBAB3", 145 | "x. c #BCBBB8", 146 | "c. c #C1B58C", 147 | "v. c #C6B988", 148 | "b. c #C7AC94", 149 | "n. c #C3BB9B", 150 | "m. c #CBB89D", 151 | "M. c #C6BFA3", 152 | "N. c #C1BEAC", 153 | "B. c #C9BAA2", 154 | "V. c #C1BFB5", 155 | "C. c #CFC288", 156 | "Z. c #CCC298", 157 | "A. c #DED09B", 158 | "S. c #D4C692", 159 | "D. c #F3C589", 160 | "F. c #F9DF81", 161 | "G. c #EADA9C", 162 | "H. c #E6D597", 163 | "J. c #F7D797", 164 | "K. c #FAE185", 165 | "L. c #FBE38C", 166 | "P. c #FAE594", 167 | "I. c #FAE69A", 168 | "U. c #F5E093", 169 | "Y. c #C7C0A6", 170 | "T. c #CBC3A5", 171 | "R. c #CCC6AB", 172 | "E. c #CFC9AC", 173 | "W. c #D3CAA3", 174 | "Q. c #DACFA4", 175 | "!. c #D1CAAB", 176 | "~. c #D8CFA8", 177 | "^. c #DAD0A5", 178 | "/. c #DCD3AC", 179 | "(. c #C5C2B3", 180 | "). c #C9C5B4", 181 | "_. c #C3C2BC", 182 | "`. c #CCC8B2", 183 | "'. c #D2CDB5", 184 | "]. c #D8D4BA", 185 | "[. c #E4D9AD", 186 | "{. c #E4D8A6", 187 | "}. c #E3DAB0", 188 | "|. c #E9DEB1", 189 | " X c #F4D8AE", 190 | ".X c #EEE0A5", 191 | "XX c #FCEBAC", 192 | "oX c #F9E8A6", 193 | "OX c #EDE2B5", 194 | "+X c #F2E6B4", 195 | "@X c #FCEDB3", 196 | "#X c #F6EABA", 197 | "$X c #FCEEBC", 198 | "%X c #F2E7B8", 199 | "&X c #FCF0BD", 200 | "*X c #C5C4C2", 201 | "=X c #CAC9C6", 202 | "-X c #CCCCCA", 203 | ";X c #D0CECC", 204 | ":X c #D2D1CD", 205 | ">X c #DAD3C8", 206 | ",X c #D4D4D3", 207 | ".@X&XOXf.,X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X*X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5Xz.Y.&X&XK.K H m :Xk.Q.&Xk.5X", 228 | "5X#.! XX/.z.r.G G Y P.$X$X/.k.5X5X5X5X5X5X5X5X5X5X5X5X5X5Xy.5X5X5X5X5X5X5X5X5X5X5X5X5X:XT.#X&XXX:.J G m z.g.#X&XG.=X5X", 229 | "5X,Xj P L.$XZ.) i H J <.@X$X$X(.5X5X5X5X5X5X5X5X5X5X5X5X_.OX-X5X5X5X5X5X5X5X5X5X5X5X5XR.$XXX7.K G G 1 t./.&Xw.E ' 5X5X", 230 | "5X5XM.i J :.XX$X_ b H J L q.$XN.5X5X5X5X5X5X5X5X5X5X5X,XQ.9.f.5X5X5X5X5X5X5X5X5X5X5X-X[.@XL H H y ^ W.&XU.T H 2 1X5X5X", 231 | "5X5X5Xc.u J K 6.@X$X5.a H H oX^.:X5X5X5X5X5X5X5X5X5X1Xi.3.H H.V.5X5X5X5X5X5X5X5X5X5Xj.$X9.G G S {.&XJ.D a s C ,X5X5X5X", 232 | "5X5X5X5Xc.u G p c X.J.9.H G :.&Xd.5X5X5X5X5X5X5X5X:XY.&X&Xg Y G.j.5X5X5X5X5X5X5X5X:XQ.@XK G Q oXD.[ 6 a a 2 -X5X5X5X5X", 233 | "5X5X5X5X5XY.t J a f 5 5 6 G H I./._.5X5X5X5X5X1XV.H.@X&X*.p G P I.T.=X5X5X5X5X5X5Xf.$X<.G G D = 5 p G H ^ ,X5X5X5X5X5X", 234 | "5X5X5X5X5X5X:X{ u G G s p s H T $Xn.1X5X5X5X*XW.8. .D.X.F G H G H 1.[.N.1X5X5X5XV.OXP.H s s f a G G q r.5X5X5X5X5X5X5X", 235 | "5X5X5X,XR.W.'.).) < w u G G G G 7.$Xt.5X1Xk. X .v , ] ! K H G t V m l q.^._.5X=XW.XXP H J G J e 3 ~ d.`.T.!._.5X5X5X5X", 236 | "5X5X5X,X[.$X$X$X4X$X+XH.q.! G G s L.#Xu.M.I.N b.9X0X0X].t H ( 8X0X0X>Xm Y G.t.!.@XT G G H H 3.H.#X&X$XXXP.K.k.5X5X5X5X", 237 | "5X5X5X5XV.{.U L L U Q ! O.v H G H K J.n.P.d B.0X0X0X6X9Xv.m 8X5X0X0X0X6XN P .XS.T G G G G H c v F I K H H B 1X5X5X5X5X", 238 | "5X5X5X5X5X=X#.y G G G G J K G G G G B XXl , 0X0X0X*Xa.O 5X_ s.x.o 0X0X0XZ.H R A.i G G H H J a G G G H 0 _ 1X5X5X5X5X5X", 239 | "5X5X5X5X5X5X5X-Xv.} n e u w S G G H C.<.5 &.0X0X0XX h.. =Xa.O s. 2X0X0X5Xi J F.V H G H w e 8 q C #.j.1X5X5X5X5X5X5X5X", 240 | "5X5X5X5X5X5X5X5X_.).E.Z.S.q.P G G q +Xl 7 C.0X0X0X- @ ; :Xe.> @ ; -X0X0X9Xw 7 >.` H G H T =.r.R.E.(.:X5X5X5X5X5X5X5X5X", 241 | "5X5X5X5X5X5X5X*X|.@XL.:.K G G H G 2 I.s G | 0X0X0X>X@.b.!.V 3X+.p.0X0X0X>Xf 5 R S.H G H H G K 1.@X&XN.5X5X5X5X5X5X5X5X", 242 | "5X5X5X5X5X5X5X5X=X%.V q 9 e 9 0 -.2 L.H ! -.1X0X0X0X0X6XZ a m.0X0X0X0X0XT.J.X.E ^.u A r 8 8 q b %.).2X5X5X5X5X5X5X5X5X", 243 | "5X5X5X5X5X5X5X5X5X5X5X5X-Xt.}.U.Y B P.K @X4X/.).6X9X'.Z G G i &.3X0X c #EC4C4E", 22 | ", c #EE5B4E", 23 | "< c #EC4F50", 24 | "1 c #EC5455", 25 | "2 c #ED585A", 26 | "3 c #EE6A6B", 27 | "4 c #EA6E71", 28 | "5 c #FC8C29", 29 | "6 c #FD9226", 30 | "7 c #FC952A", 31 | "8 c #F99D2E", 32 | "9 c #FA9936", 33 | "0 c #F6A431", 34 | "q c #F2AC34", 35 | "w c #EEB436", 36 | "e c #E4B43F", 37 | "r c #EDB53B", 38 | "t c #A7AB5F", 39 | "y c #ABAC5E", 40 | "u c #B6AD59", 41 | "i c #91A666", 42 | "p c #97A865", 43 | "a c #95A96B", 44 | "s c #90A66C", 45 | "d c #8BA57B", 46 | "f c #B2AD75", 47 | "g c #A1B37D", 48 | "h c #F8944C", 49 | "j c #D7B247", 50 | "k c #D4B249", 51 | "l c #C0AF53", 52 | "z c #FBA248", 53 | "x c #EAB747", 54 | "c c #EDBA4A", 55 | "v c #EFBE51", 56 | "b c #E4B65F", 57 | "n c #F1B656", 58 | "m c #D6A27F", 59 | "M c #FCAF62", 60 | "N c #F1C76D", 61 | "B c #EDC571", 62 | "V c #F1CB76", 63 | "C c #F2CC7A", 64 | "Z c #769FB2", 65 | "A c #7DA1A1", 66 | "S c #6699CE", 67 | "D c #699BCC", 68 | "F c #6D9CC6", 69 | "G c #7A82DD", 70 | "H c #6B97D1", 71 | "J c #6E9ED0", 72 | "K c #7D95D8", 73 | "L c #79A5D4", 74 | "P c #7DB1DF", 75 | "I c #89A581", 76 | "U c #93AB80", 77 | "Y c #A8AB94", 78 | "T c #A8B988", 79 | "R c #96A4BA", 80 | "E c #BFA2B8", 81 | "W c #F08486", 82 | "Q c #F08A8B", 83 | "! c #F18E81", 84 | "~ c #DAA581", 85 | "^ c #DEA884", 86 | "/ c #E2AB86", 87 | "( c #E5AE88", 88 | ") c #EDB48D", 89 | "_ c #F1B78F", 90 | "` c #F6BB92", 91 | "' c #F6BF99", 92 | "] c #EAAFAC", 93 | "[ c #F2A4A5", 94 | "{ c #F3B7B8", 95 | "} c #F2BBBB", 96 | "| c #F3B4B5", 97 | " . c #B5C39B", 98 | ".. c #9DC5BB", 99 | "X. c #C9C798", 100 | "o. c #F9C187", 101 | "O. c #F2D18B", 102 | "+. c #F6C39E", 103 | "@. c #F3D99C", 104 | "#. c #F2D697", 105 | "$. c #C9D4B8", 106 | "%. c #F6CAA6", 107 | "&. c #FAD3AC", 108 | "*. c #F4DBA3", 109 | "=. c #EED4B7", 110 | "-. c #F7D0B5", 111 | ";. c #FAD7B4", 112 | ":. c #F4E0B2", 113 | ">. c #9F9CC1", 114 | ",. c #A394C4", 115 | "<. c #80AAD6", 116 | "1. c #97BADD", 117 | "2. c #BAD4C9", 118 | "3. c #ABC7E3", 119 | "4. c #A6DEFF", 120 | "5. c #A9DFFF", 121 | "6. c #ABDAF4", 122 | "7. c #ADE0FF", 123 | "8. c #B3E2FE", 124 | "9. c #BAE5FE", 125 | "0. c #CECCC4", 126 | "q. c #CECDC9", 127 | "w. c #D3D2CE", 128 | "e. c #D6DECA", 129 | "r. c #D6D9C9", 130 | "t. c #CBC9DD", 131 | "y. c #C0D0DD", 132 | "u. c #D4D4D0", 133 | "i. c #D9D9D7", 134 | "p. c #DDDCD9", 135 | "a. c #F5C7C8", 136 | "s. c #ECDCCC", 137 | "d. c #F7DBC7", 138 | "f. c #F7DDCA", 139 | "g. c #ECDFD2", 140 | "h. c #F5D4D5", 141 | "j. c #F6D7D8", 142 | "k. c #F6DDDE", 143 | "l. c #F5E7C4", 144 | "z. c #F8E5CA", 145 | "x. c #EBE4DD", 146 | "c. c #E5E6DE", 147 | "v. c #F7E1D2", 148 | "b. c #F7E5D8", 149 | "n. c #F7EBDD", 150 | "m. c #F8ECD8", 151 | "M. c #C3D7EB", 152 | "N. c #C8DAEC", 153 | "B. c #D6D8E6", 154 | "V. c #E3DAE2", 155 | "C. c #C1E7FE", 156 | "Z. c #C5E9FD", 157 | "A. c #CCEBFD", 158 | "S. c #CCE7F5", 159 | "D. c #D5EEFD", 160 | "F. c #DDE8F3", 161 | "G. c #DDF1FC", 162 | "H. c #D6E6E3", 163 | "J. c #EAE9E4", 164 | "K. c #EDEDE9", 165 | "L. c #E8E7E1", 166 | "P. c #F6E2E3", 167 | "I. c #F7EBEC", 168 | "U. c #F2F2EE", 169 | "Y. c #F8F2EB", 170 | "T. c #ECF2F7", 171 | "R. c #E2F2FC", 172 | "E. c #ECF6FC", 173 | "W. c #F4F5F4", 174 | "Q. c #F8F6F3", 175 | "!. c #F8F8F6", 176 | "~. c #F1F7FA", 177 | "^. c #F8F7F8", 178 | "/. c #F6F9FB", 179 | "(. c #F8FAFB", 180 | /* pixels */ 181 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 182 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.N.1.3.E.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 183 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.W.(.(.(.(.(.(.(.(.3.S S D L /.(.(.(.(.(.(.(.(.(.(.(.(.(.", 184 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.W.J.J.J.J.J.W.W.(.(.(.(.(./.D S S S S N.(.(.(.(.(.(.(.(.(.(.(.(.(.", 185 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.(.E.H S S S S 6.Q.(.(.(.(.(.(.(.(.(.(.(.(.", 186 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(./.9.P S D S L T.(.(.(.(.(.(.(.(.(.(.(.(.(.", 187 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(.A.7.8.3.L 1.F.(.(.(.(.(.!.Y.m.(.(.(.(.(.(.", 188 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.a.P.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.7.7.~.(.(././.(.(.(.(.(.&.9 6 M Q.(.(.(.(.", 189 | "(.(.(.(.(.(.(.(.(.(.(.(.(.P.: O { (.(.(.(.W.w.i./.!.!.~.w.u.(.(.(.E.4.C.(.(.(.(.(.(.(.(.R.S.9 6 6 6 &.(.(.(.(.", 190 | "(.(.(.(.R.D.A.D.(.(.(.(.(.Q 1 (.(.(.(.W.q.i.(.(.(.(.q.u.(.(.(.G.4.A.(.(.(.(.(.(./.Z.4.6.7 6 6 6 %.(.(.(.(.", 191 | "(.(.(.8.4.4.4.4.G.(.(./.(.Q > (.(.(.(.W.q.i.(.W.!.(.q.u.(.(.(.E.8.R.(.(.(.(.(.E.9.7.8.G.o.6 6 z Y.(.(.(.(.", 192 | "(.(.(.9.Z.D.G.G.(.(.8.8.E.k.: o E G.(.(.(.W.q.i.(.@.m.(.q.u.(.(.(.(.(.(.(.(.(.(.~.9.4.C./.(.(.z.;.Y.!.(.(.(.(.", 193 | "(.(.(.(.(.(.(.(.(.(.A.4.8.(.I.a.V.4.8.(.(.(.~.0.i.Q.c V (.w.w.(.(.(.(.(.(./.I.h.h.B.4.9.(.(.(.(.(.(.(.(.(.(.(.(.", 194 | "(.(.(.(.(.(.(.(.(.(.(.D.D.(.(.(.(.Z.4.D.(.(.W.0.r.@.w r z.0.u.(.(.(.(.k.Q > + 4 } (.(.(.(.(.(.(.(.(.(.(.", 195 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.E.4.9.(.(.#.x r w w w w x c l.(.I.W O # $ $ @ O 2 h.(.(.(.(.(.(.(.(.(.", 196 | "(.(.(.(.(.(.(.W. .a g e.(.(.(.(.(.(.8.4.(.(.Q.V w w w w w r *.(.P.1 . = 5 6 6 6 6 6 ; @ O | (.(.(.(.(.(.(.(.", 197 | "(.(.(.(.(.(.(. .i i i a H.E.(.(.(.(.9.7.E.(.(.!.N w w w w *.(.I.> $ 5 6 7 8 0 q 0 8 6 6 = O { (.(.(.(.(.(.(.", 198 | "(.(.(.(.(.(.(.a i i i i ..5.8.R.(.(.Z.7.~.(.(.(.V w w w w :.!.3 o * 6 6 q w w w w w w q 8 6 ; + k.(.(.(.(.(.(.", 199 | "(.(.(.(.(.(.(.g i i i i 2.9.5.5.D.(./.E.(.(.(.(.v r O.N r O.| X . 6 7 w w x u y t u j w w 0 6 - 3 (.(.(.(.(.(.", 200 | "(.(.(.(.(.(.(.e.a i i T W.(.R.7.4.R.(.(.(.(.(.Q.C n.(.(.l.O.1 5 6 q w k i p i i i i u r B -.s.] 1 h.(.(.(.(.(.", 201 | "(.(.(.(.(.(.(.(.L.$.e.W.(.(.(.E.7.R.(.(.(.(.(.(.(.(.(.(.(.j. @ 6 8 w j i s A F F Z d s X.J.J.J.J.x.} (.(.(.(.(.", 202 | "(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.[ = 6 q w t i Z S H S S D U c.J.J.J.J.L.L./.(.(.(.(.", 203 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.W ; 7 w e i I S H G G K 2.V.J.J.J.J.J.J.J.J.U.(.(.(.", 204 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.P.b.b.b.b.b.b.b.b.b.b.b.b.b.j.m , h z n b f Y R >.,.,.t.K.J.J.J.J.J.J.J.J.J.J.W.(.(.", 205 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` x.J.J.J.J.J.J.J.J.J.J.J.K.(.(.", 206 | "(.(.(.(.(.(.(.(.(.(.(.(.(.Q.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g.J.J.J.J.J.J.J.J.J.J.J.I.(.(.", 207 | "(.(.(.(.(.(.(.(.(.(.(.(.(.b.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` %.c.L.J.J.L.J.J.J.J.J.K.(.(.(.", 208 | "(.(.(.(.(.(.(.(.(.(.(.(.Q.%.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' b.W.W.W.W.W.W.W.W./.(.(.(.", 209 | "(.(.(.(.(.(.(.(.(.(.(.(.-.` ` ` _ _ ` ` ` ` ` _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 210 | "(.(.(.(.(.(.(.(.(.(.(.v.` ` ` ` m ~ ` ` ` ` _ m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 211 | "(.(.(.(.(.(.(.(.(.(.I.' ` ` ` ` / m / ) ` ) ~ m _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 212 | "(.(.(.(.(.(.(.(.(.^.%.` ` ` ` ` _ / m m m m m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 213 | "(.(.(.(.(.(.(.(.(.z.` ` ` ` ` ` ` ` ) ^ ^ ^ ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(." 214 | }; 215 | -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/new.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/bitmaps/new.bmp -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/bitmaps/new.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_new_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "16 16 31 1", 5 | ". c #7198D9", 6 | "2 c #DCE6F6", 7 | ", c #FFFFFF", 8 | "= c #9AB6E4", 9 | "6 c #EAF0FA", 10 | "w c #6992D7", 11 | "0 c #5886D2", 12 | "7 c #F7F9FD", 13 | "5 c #F0F5FC", 14 | "* c #A8C0E8", 15 | " c None", 16 | "8 c #FDFEFF", 17 | "% c #C4D5F0", 18 | "3 c #E2EAF8", 19 | "+ c #4377CD", 20 | "O c #487BCE", 21 | "; c #6B94D7", 22 | "- c #89A9DF", 23 | ": c #5584D1", 24 | "# c #3569BF", 25 | "@ c #3A70CA", 26 | "1 c #D2DFF4", 27 | "> c #3366BB", 28 | "$ c #2E5CA8", 29 | "9 c #FAFCFE", 30 | "4 c #F5F8FD", 31 | "q c #638ED5", 32 | "o c #5282D0", 33 | "& c #B8CCEC", 34 | "X c #376EC9", 35 | "< c #ACE95B", 36 | /* pixels */ 37 | " .XoO+@#$. ", 38 | " .%%&*=-O;: ", 39 | " >>>>%&*=O,=o ", 40 | " ><<>%%&*O,,=o ", 41 | ">>><<>>>%&OOo+@ ", 42 | "><<<<<<>1%&*=-@ ", 43 | "><<<<<<>21%&*=@ ", 44 | ">>><<>>>321%&*+ ", 45 | " ><<>456321%&O ", 46 | " >>>>7456321%o ", 47 | " .,8974563210 ", 48 | " .,,897456320 ", 49 | " .,,,8974563q ", 50 | " .,,,,897456w ", 51 | " .,,,,,89745w ", 52 | " ............ " 53 | }; 54 | -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/conf.h: -------------------------------------------------------------------------------- 1 | #ifndef CONF_H_ 2 | #define CONF_H_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #define SZ 36 7 | 8 | #endif // CONF_H_ -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/diagrams/class-structure-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/diagrams/class-structure-design.png -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/diagrams/seq-create-newgame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/diagrams/seq-create-newgame.png -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/diagrams/seq-guess-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/diagrams/seq-guess-number.png -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/diagrams/seq-init-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-mv-cpp/diagrams/seq-init-app.png -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/game_model.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "conf.h" 4 | 5 | #include "game_model.h" 6 | #include "observer.hpp" 7 | 8 | #ifdef DEBUG 9 | #include 10 | #endif 11 | 12 | #include 13 | #include 14 | 15 | GameModel::GameModel() { 16 | std::srand(std::time(NULL)); 17 | Init(); 18 | } 19 | 20 | void GameModel::Init() { 21 | secret = std::rand() % SZ + 1; 22 | #ifdef DEBUG 23 | std::cout << secret << std::endl; 24 | #endif // DEBUG 25 | for (int i = 0; i <= SZ; ++i) { 26 | slots[i] = NORMAL; 27 | } 28 | lifes = number_of_guesses; 29 | Notify(); 30 | } 31 | 32 | void GameModel::Submit(int guess) { 33 | if (guess == secret) { 34 | Won(); 35 | Notify(); 36 | return; 37 | } 38 | if (guess < secret) { 39 | Disable(1, guess); 40 | } else { 41 | Disable(guess, SZ); 42 | } 43 | --lifes; 44 | if (lifes < 1) { 45 | Failed(); 46 | } 47 | Notify(); 48 | } 49 | 50 | int GameModel::GetLifes() { 51 | return lifes; 52 | } 53 | 54 | void GameModel::Won() { 55 | for (int i = 1; i <= SZ; ++i) { 56 | slots[i] = WRONG; 57 | } 58 | slots[secret] = WON; 59 | } 60 | 61 | void GameModel::Failed() { 62 | for (int i = 1; i <= SZ; ++i) { 63 | slots[i] = WRONG; 64 | } 65 | slots[secret] = FAILED; 66 | } 67 | 68 | void GameModel::Disable(int from, int to) { 69 | for (int i = from; i <= to; ++i) { 70 | slots[i] = WRONG; 71 | } 72 | } 73 | 74 | GameModel::State GameModel::GetState(int idx) { 75 | return slots[idx]; 76 | } 77 | 78 | void GameModel::Notify() { 79 | for (auto it = observers.begin(); it != observers.end(); ++it) { 80 | it->first->Update(this); 81 | } 82 | } 83 | 84 | void GameModel::Attach(Observer *o) { 85 | observers[o] = 1; 86 | o->SetModel(this); 87 | Notify(); 88 | } 89 | 90 | void GameModel::Detach(Observer *o) { 91 | auto it = observers.find(o); 92 | if (it != observers.end()) { 93 | observers.erase(it); 94 | } 95 | } -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/game_model.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_MODEL_HPP_ 2 | #define GAME_MODEL_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class Observer; 13 | 14 | class GameModel { 15 | public: 16 | enum State { 17 | NORMAL, 18 | WRONG, 19 | WON, 20 | FAILED 21 | }; 22 | GameModel(); 23 | void Init(); 24 | void Submit(int guess); 25 | State GetState(int idx); 26 | int GetLifes(); 27 | void Notify(); 28 | void Attach(Observer *o); 29 | void Detach(Observer *o); 30 | private: 31 | void Won(); 32 | void Failed(); 33 | void Disable(int from, int to); 34 | State slots[SZ + 1]; 35 | int secret; 36 | int lifes; 37 | const int number_of_guesses = 3; 38 | std::map observers; 39 | }; 40 | 41 | #endif // GAME_MODEL_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/game_view.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "bitmaps/blackcat.xpm" 4 | #include "bitmaps/inspiration.xpm" 5 | #include "bitmaps/gomechan.xpm" 6 | #include "conf.h" 7 | #include "game_model.h" 8 | #include "game_view.h" 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | GameView::GameView(): wxFrame(nullptr, wxID_ANY, 15 | "Time Flies", wxDefaultPosition, {480, 320}) { 16 | tool_bar = this->CreateToolBar(wxTB_HORIZONTAL, wxID_ANY); 17 | btn_new_game = new wxButton( tool_bar, wxID_ANY, wxT("New Game"), 18 | wxDefaultPosition, wxDefaultSize, 0 ); 19 | tool_bar->AddControl(btn_new_game); 20 | btn_new_game->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { 21 | model->Init(); 22 | }); 23 | 24 | bmp_won = new wxBitmap(img_gomechan_xpm); 25 | bmp_failed = new wxBitmap(img_blackcat_xpm); 26 | bmp_progress = new wxBitmap(img_inspiration_xpm); 27 | 28 | tool_bar->AddSeparator(); 29 | lbl_indicator = new wxStaticText(tool_bar, wxID_ANY, 30 | wxT("///"), wxDefaultPosition, {30, 30}, 0); 31 | lbl_indicator->Wrap(-1); 32 | lbl_indicator->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, 33 | wxFONTWEIGHT_BOLD, false, wxEmptyString)); 34 | tool_bar->AddControl(lbl_indicator); 35 | tool_bar->AddSeparator(); 36 | bmp_out_come = new wxStaticBitmap(tool_bar, wxID_ANY, 37 | wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); 38 | tool_bar->AddControl(bmp_out_come); 39 | tool_bar->Realize(); 40 | 41 | wxWrapSizer* sizer; 42 | sizer = new wxWrapSizer( wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS ); 43 | 44 | for (int i = 1; i <= SZ; ++i) { 45 | std::stringstream ss; 46 | ss << i; 47 | buttons[i] = new wxButton( this, wxID_ANY, 48 | ss.str(), wxDefaultPosition, {70, 30}, 0 ); 49 | buttons[i]->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, 50 | wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, 51 | false, wxEmptyString)); 52 | buttons[i]->Bind(wxEVT_BUTTON, [&, i](wxCommandEvent& event) { 53 | model->Submit(i); 54 | }); 55 | sizer->Add(buttons[i], 0, wxALL, 5 ); 56 | } 57 | 58 | this->SetSizer(sizer); 59 | this->Layout(); 60 | this->Centre(wxBOTH); 61 | } 62 | 63 | void GameView::Update(GameModel *model) { 64 | int ended = 0; 65 | for (int i = 1; i <= SZ; ++i) { 66 | switch(model->GetState(i)) { 67 | case GameModel::NORMAL: 68 | buttons[i]->Enable(true); 69 | buttons[i]->SetBackgroundColour( 70 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 71 | break; 72 | case GameModel::WRONG: 73 | buttons[i]->Enable(false); 74 | buttons[i]->SetBackgroundColour( 75 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 76 | break; 77 | case GameModel::WON: 78 | ended = 1; 79 | bmp_out_come->SetBitmap(*bmp_won); 80 | buttons[i]->Enable(false); 81 | buttons[i]->SetBackgroundColour(wxColour(10, 246, 10)); 82 | break; 83 | case GameModel::FAILED: 84 | ended = 2; 85 | bmp_out_come->SetBitmap(*bmp_failed); 86 | buttons[i]->Enable(false); 87 | buttons[i]->SetBackgroundColour(wxColour(246, 10, 10)); 88 | break; 89 | } 90 | } 91 | int n = model->GetLifes(); 92 | std::stringstream ss; 93 | for (int i = 0; i < n; ++i) { 94 | ss << "/"; 95 | } 96 | lbl_indicator->SetLabel(ss.str()); 97 | if (!ended) { 98 | bmp_out_come->SetBitmap(*bmp_progress); 99 | } 100 | } -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/game_view.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_VIEW_HPP_ 2 | #define GAME_VIEW_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | #include "observer.hpp" 8 | 9 | #include 10 | 11 | class GameModel; 12 | 13 | class GameView: public wxFrame, public Observer { 14 | public: 15 | GameView(); 16 | void Update(GameModel *model) override; 17 | private: 18 | wxButton *buttons[SZ + 1]; 19 | wxToolBar* tool_bar; 20 | wxButton* btn_new_game; 21 | wxStaticText* lbl_indicator; 22 | wxStaticBitmap* bmp_out_come; 23 | wxBitmap *bmp_won; 24 | wxBitmap *bmp_failed; 25 | wxBitmap *bmp_progress; 26 | }; 27 | 28 | #endif // GAME_VIEW_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/main.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "game_model.h" 4 | #include "game_view.h" 5 | 6 | class Application : public wxApp { 7 | bool OnInit() override { 8 | view = new GameView(); 9 | model = new GameModel(); 10 | model->Attach(view); 11 | view->Show(); 12 | return true; 13 | } 14 | int OnExit() override { 15 | delete model; 16 | 17 | // TODO: view should be freed automatically by wxwidgets?? 18 | // delete view; 19 | 20 | return wxApp::OnExit(); 21 | } 22 | private: 23 | GameView *view; 24 | GameModel *model; 25 | }; 26 | 27 | wxIMPLEMENT_APP(Application); -------------------------------------------------------------------------------- /demo/guess-number-mv-cpp/observer.hpp: -------------------------------------------------------------------------------- 1 | #ifndef OBSERVER_HPP_ 2 | #define OBSERVER_HPP_ 3 | 4 | class GameModel; 5 | 6 | class Observer { 7 | public: 8 | virtual void Update(GameModel *model) = 0; 9 | void SetModel(GameModel *m) { 10 | model = m; 11 | } 12 | protected: 13 | GameModel *model; 14 | }; 15 | 16 | #endif // OBSERVER_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | project(MVCDemo-guess-number) 3 | find_package(wxWidgets 3.0 REQUIRED) 4 | 5 | include(${wxWidgets_USE_FILE}) 6 | 7 | if (CMAKE_BUILD_TYPE STREQUAL "Debug") 8 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall") 9 | add_definitions(-DDEBUG) 10 | endif() 11 | 12 | add_executable(guess_number main.cpp game_controller.cpp 13 | game_model.cpp game_view.cpp) 14 | target_link_libraries(guess_number ${wxWidgets_LIBRARIES}) -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/README.md: -------------------------------------------------------------------------------- 1 | # Minh họa kiến trúc MVC 2 | 3 | Triển khai trò chơi đoán số theo kiến trúc MVC 4 | 5 | ## Các biểu đồ 6 | 7 | ### Biểu đồ lớp 8 | 9 | ![Biểu đồ lớp với các lớp được biểu diễn bằng các hình chữ nhật](diagrams/class-structure-design.png) 10 | 11 | Quan hệ giữa các thành phần 12 | 13 | ### Biểu đồ tuần tự 14 | 15 | ![Biểu đồ tuần tự trường hợp tạo Game mới (bấm nút New Game)](diagrams/seq-create-newgame.png) 16 | 17 | Tạo game mới 18 | 19 | ![Biểu đồ tuần tự trường hợp đoán số (bấm nút với nhãn là giá trị số)](diagrams/seq-guess-number.png) 20 | 21 | Đoán số 22 | 23 | ![Biểu đồ tuần tự khởi tạo các đối tượng](diagrams/seq-init-app.png) 24 | 25 | Khởi tạo các đối tượng -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/blackcat.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/bitmaps/blackcat.bmp -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/blackcat.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_blackcat_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "52 33 148 2 ", 5 | " c black", 6 | ". c #010101", 7 | "X c #020202", 8 | "o c gray1", 9 | "O c #040404", 10 | "+ c gray2", 11 | "@ c #060606", 12 | "# c #070707", 13 | "$ c gray3", 14 | "% c #090909", 15 | "& c gray4", 16 | "* c #0C0C0C", 17 | "= c gray6", 18 | "- c #111111", 19 | "; c gray7", 20 | ": c gray8", 21 | "> c #151515", 22 | ", c #161616", 23 | "< c #191919", 24 | "1 c gray10", 25 | "2 c #1B1B1B", 26 | "3 c gray11", 27 | "4 c gray12", 28 | "5 c gray13", 29 | "6 c #252525", 30 | "7 c gray15", 31 | "8 c #282828", 32 | "9 c gray16", 33 | "0 c #2C2C2C", 34 | "q c #323232", 35 | "w c gray20", 36 | "e c gray21", 37 | "r c #3A3A3A", 38 | "t c gray23", 39 | "y c #3C3C3C", 40 | "u c gray24", 41 | "i c #3F3F3F", 42 | "p c #414141", 43 | "a c gray26", 44 | "s c #434343", 45 | "d c #444444", 46 | "f c #464646", 47 | "g c gray29", 48 | "h c #4C4C4C", 49 | "j c gray30", 50 | "k c #4E4E4E", 51 | "l c gray31", 52 | "z c #515151", 53 | "x c gray32", 54 | "c c #555555", 55 | "v c #585858", 56 | "b c gray35", 57 | "n c #5B5B5B", 58 | "m c gray36", 59 | "M c #5F5F5F", 60 | "N c gray38", 61 | "B c #646464", 62 | "V c #686868", 63 | "C c gray42", 64 | "Z c #6C6C6C", 65 | "A c gray43", 66 | "S c gray44", 67 | "D c #717171", 68 | "F c gray47", 69 | "G c #797979", 70 | "H c gray48", 71 | "J c #7B7B7B", 72 | "K c #7C7C7C", 73 | "L c gray49", 74 | "P c #808080", 75 | "I c #818181", 76 | "U c gray51", 77 | "Y c #868686", 78 | "T c #888888", 79 | "R c #8B8B8B", 80 | "E c gray55", 81 | "W c gray56", 82 | "Q c #939393", 83 | "! c gray59", 84 | "~ c #979797", 85 | "^ c #989898", 86 | "/ c gray60", 87 | "( c #9A9A9A", 88 | ") c #9B9B9B", 89 | "_ c #9D9D9D", 90 | "` c gray62", 91 | "' c #9F9F9F", 92 | "] c gray63", 93 | "[ c #A2A2A2", 94 | "{ c gray64", 95 | "} c #A4A4A4", 96 | "| c #A5A5A5", 97 | " . c #A9A9A9", 98 | ".. c #AAAAAA", 99 | "X. c #ACACAC", 100 | "o. c #AEAEAE", 101 | "O. c #AFAFAF", 102 | "+. c #B1B1B1", 103 | "@. c gray70", 104 | "#. c #B6B6B6", 105 | "$. c gray72", 106 | "%. c #B9B9B9", 107 | "&. c #BBBBBB", 108 | "*. c #BCBCBC", 109 | "=. c #C0C0C0", 110 | "-. c #C1C1C1", 111 | ";. c gray76", 112 | ":. c #C6C6C6", 113 | ">. c gray78", 114 | ",. c #C8C8C8", 115 | "<. c #CDCDCD", 116 | "1. c #CECECE", 117 | "2. c gray81", 118 | "3. c #D0D0D0", 119 | "4. c gray82", 120 | "5. c gray84", 121 | "6. c #D7D7D7", 122 | "7. c #D8D8D8", 123 | "8. c gray85", 124 | "9. c #DADADA", 125 | "0. c gray87", 126 | "q. c gray88", 127 | "w. c gray89", 128 | "e. c #E4E4E4", 129 | "r. c gray90", 130 | "t. c #E7E7E7", 131 | "y. c gray91", 132 | "u. c gray92", 133 | "i. c #ECECEC", 134 | "p. c gray93", 135 | "a. c #EEEEEE", 136 | "s. c #EFEFEF", 137 | "d. c gray94", 138 | "f. c #F1F1F1", 139 | "g. c gray95", 140 | "h. c #F3F3F3", 141 | "j. c #F4F4F4", 142 | "k. c gray96", 143 | "l. c #F6F6F6", 144 | "z. c gray97", 145 | "x. c #F8F8F8", 146 | "c. c #F9F9F9", 147 | "v. c gray98", 148 | "b. c #FBFBFB", 149 | "n. c gray99", 150 | "m. c #FDFDFD", 151 | "M. c #FEFEFE", 152 | "N. c white", 153 | /* pixels */ 154 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 155 | "N.N.N.N.N.N.N.N.N.N.N.,.d O O n x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 156 | "N.N.N.N.N.N.N.N.N.N.&.O -.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 157 | "N.N.N.N.N.N.N.N.N.x.5 S | | l.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 158 | "N.N.N.N.N.N.N.N.N.#. F N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 159 | "N.N.N.N.N.N.N.N.N.K 0.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 160 | "N.N.N.N.N.N.N.N.N.B d.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", 161 | "N.N.N.N.N.N.N.N.N.Z 3.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.N.N.N.N.N.N.N.N.N.N.", 162 | "N.N.N.N.N.N.N.N.N.W R N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.S o.N.N.N.N.N.N.N.N.N.N.", 163 | "N.N.N.N.N.N.N.N.N.<. 7 N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.d.U K N.N.N.N.N.N.N.N.N.N.", 164 | "N.N.N.N.N.N.N.N.N.N.8 ` N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.) * $ V N.N.N.N.N.N.N.N.N.", 165 | "N.N.N.N.N.N.N.N.N.N.~ - 7.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.~ o.N.N.N.N.N.N.N.N.", 166 | "N.N.N.N.N.N.N.N.N.N.x.8 < Z d a k B U [ ,.p.N.N.N.N.N.N.N.N.N.N.N.[ O d N.N.N.N.N.N.N.N.", 167 | "N.N.N.N.N.N.N.N.N.N.N.-.O > r M U [ *.<.5.<.| g ..N.N.N.N.N.N.N.", 168 | "N.N.N.N.N.N.N.N.N.N.N.N.W 0 N.N.N.N.N.N.N.", 169 | "N.N.N.N.N.N.N.N.N.N.N.N.x.3 a N.N.N.N.N.N.N.", 170 | "N.N.N.N.N.N.N.N.N.N.N.N.*. > k N e.N.N.N.N.N.N.N.", 171 | "N.N.N.N.N.N.N.N.N.N.N.N.V z l.N.N.N.N.N.N.N.N.N.N.", 172 | "N.N.N.N.N.N.N.N.N.N.N.N.< $ p.N.N.N.N.N.N.N.N.N.N.N.", 173 | "N.N.N.N.N.N.N.N.N.N.N.-. u N.N.N.N.N.N.N.N.N.N.N.N.", 174 | "N.N.N.N.N.N.N.N.N.N.N.n z N.N.N.N.N.N.N.N.N.N.N.N.", 175 | "N.N.N.N.N.N.N.N.N.N.3. a N.N.N.N.N.N.N.N.N.N.N.N.", 176 | "N.N.N.N.N.N.N.N.N.l.w < N.N.N.N.N.N.N.N.N.N.N.N.", 177 | "N.N.N.N.N.N.N.N.x.d 0 &.w.e.3.o.K a O 7.N.N.N.N.N.N.N.N.N.N.N.", 178 | "N.N.N.N.N.N.N.N.) $ r F 8 O 3.N.N.N.N.N.N.N.e * ~ y.d.Q O R N.N.N.N.N.N.N.N.N.N.N.", 179 | "N.N.N.N.N.N.N.N.u 5 | d.N.N.e R N.N.N.N.N.N.N.N.a +.N.N.N.N.[ O 7 x.N.N.N.N.N.N.N.N.N.N.", 180 | "N.N.N.N.N.N.N.d.O $ w.N.N.N.N.> k N.N.N.N.N.N.N.N.N.3 N N.N.N.N.N.N.Y [ N.N.N.N.N.N.N.N.N.N.", 181 | "N.N.N.N.N.N.N.:. z N.N.N.N.x.O - y.N.N.N.N.N.N.N.N.e. * e.N.N.N.N.N.N.N.U < y.N.N.N.N.N.N.N.N.N.", 182 | "N.N.N.N.N.N.N.o. ~ N.N.N.N.N.7 c N.N.N.N.N.N.N.N.N.+. S N.N.N.N.N.N.N.N.N.W g x.N.N.N.N.N.N.N.N.", 183 | "N.N.N.N.N.N.N.+.$ w.N.N.N.N.N.) 3 d.N.N.N.N.N.N.N.N.U 3.N.N.N.N.N.N.N.N.N.N.[ O k d.N.N.N.N.N.N.N.", 184 | "N.N.N.N.N.N.N.l.5.N.N.N.N.N.N.N.n a #.x.N.N.N.N.N.N.F ) N.N.N.N.N.N.N.N.N.N.N.-.< w x.N.N.N.N.N.N.", 185 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.x.F * ..N.N.N.N.N.N.:.$ M N.N.N.N.N.N.N.N.N.N.N.N.y.V k d.N.N.N.N.N.N.", 186 | "N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.l.7.N.N.N.N.N.N.N.N.p.x.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N." 187 | }; 188 | -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/gomechan.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/bitmaps/gomechan.bmp -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/gomechan.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_gomechan_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "59 33 213 2 ", 5 | " c #662220", 6 | ". c #6E3D3B", 7 | "X c #745C5B", 8 | "o c #66605F", 9 | "O c #6F6C6C", 10 | "+ c #B17C1A", 11 | "@ c #845729", 12 | "# c #A75035", 13 | "$ c #A5692C", 14 | "% c #B56A30", 15 | "& c #D87C28", 16 | "* c #C4723E", 17 | "= c #E57D2A", 18 | "- c #AA6F58", 19 | "; c #847875", 20 | ": c #846867", 21 | "> c #B37068", 22 | ", c #C67B45", 23 | "< c #AA8F2D", 24 | "1 c #B99825", 25 | "2 c #BFA034", 26 | "3 c #B18F16", 27 | "4 c #C39B16", 28 | "5 c #EA891D", 29 | "6 c #EC931A", 30 | "7 c #EF9C16", 31 | "8 c #DAAD0E", 32 | "9 c #D5A80E", 33 | "0 c #CDA51B", 34 | "q c #CCA416", 35 | "w c #D6A913", 36 | "e c #DCAF10", 37 | "r c #D1A81A", 38 | "t c #DDB217", 39 | "y c #E4B40D", 40 | "u c #EBBA0D", 41 | "i c #E8B70D", 42 | "p c #F5B40D", 43 | "a c #F4BE0A", 44 | "s c #F8BF0A", 45 | "d c #EDA716", 46 | "f c #F2AA11", 47 | "g c #F1A919", 48 | "h c #ECBA10", 49 | "j c #E2B619", 50 | "k c #E7B919", 51 | "l c #F4B919", 52 | "z c #CE933D", 53 | "x c #C98225", 54 | "c c #EC982A", 55 | "v c #E88F32", 56 | "b c #C7A327", 57 | "n c #CEA923", 58 | "m c #C8A62D", 59 | "M c #D3AD29", 60 | "N c #D6AE24", 61 | "B c #C3A53B", 62 | "V c #CAAA3B", 63 | "C c #C8A835", 64 | "Z c #D2AE31", 65 | "A c #D7B438", 66 | "S c #E5BC2C", 67 | "D c #F3B83B", 68 | "F c #EAB52F", 69 | "G c #F8C207", 70 | "H c #F7C20A", 71 | "J c #F8C209", 72 | "K c #F7C413", 73 | "L c #F7C61A", 74 | "P c #F8C71C", 75 | "I c #F8C71A", 76 | "U c #F7C825", 77 | "Y c #F8C923", 78 | "T c #F7CA2B", 79 | "R c #F8CA2C", 80 | "E c #F6C525", 81 | "W c #F7CD35", 82 | "Q c #F8CC33", 83 | "! c #F8CE3C", 84 | "~ c #968750", 85 | "^ c #B59A49", 86 | "/ c #BDA242", 87 | "( c #BDA658", 88 | ") c #A49A72", 89 | "_ c #BBAD7C", 90 | "` c #BEAD73", 91 | "' c #B8A669", 92 | "] c #C98556", 93 | "[ c #E79046", 94 | "{ c #C4A946", 95 | "} c #C8AE52", 96 | "| c #CEB357", 97 | " . c #F2B642", 98 | ".. c #E9A357", 99 | "X. c #F0AF59", 100 | "o. c #EEB55D", 101 | "O. c #ECA148", 102 | "+. c #C89F6C", 103 | "@. c #D0A168", 104 | "#. c #C6B269", 105 | "$. c #C3B171", 106 | "%. c #C8B87A", 107 | "&. c #D4B87F", 108 | "*. c #EFB26E", 109 | "=. c #DEC154", 110 | "-. c #EBC84B", 111 | ";. c #F3C745", 112 | ":. c #F8D24C", 113 | ">. c #F8D148", 114 | ",. c #EACA56", 115 | "<. c #F9D454", 116 | "1. c #F9D65B", 117 | "2. c #F9D85F", 118 | "3. c #F7D558", 119 | "4. c #DFC465", 120 | "5. c #D6C37A", 121 | "6. c #F5CD6C", 122 | "7. c #F9D965", 123 | "8. c #F4D56C", 124 | "9. c #FADA6A", 125 | "0. c #EFD67C", 126 | "q. c #FADD74", 127 | "w. c #F7DA78", 128 | "e. c #AAA38A", 129 | "r. c #BAB08B", 130 | "t. c #ADA997", 131 | "y. c #B2AE9C", 132 | "u. c #B1AD96", 133 | "i. c #BCB69B", 134 | "p. c #B6A18A", 135 | "a. c #A9A8A8", 136 | "s. c #B0AEAD", 137 | "d. c #B4B1A4", 138 | "f. c #BAB6A3", 139 | "g. c #BDB9A4", 140 | "h. c #B5B4AB", 141 | "j. c #B9B7AB", 142 | "k. c #BDB9AC", 143 | "l. c #B6B4B3", 144 | "z. c #BCBAB3", 145 | "x. c #BCBBB8", 146 | "c. c #C1B58C", 147 | "v. c #C6B988", 148 | "b. c #C7AC94", 149 | "n. c #C3BB9B", 150 | "m. c #CBB89D", 151 | "M. c #C6BFA3", 152 | "N. c #C1BEAC", 153 | "B. c #C9BAA2", 154 | "V. c #C1BFB5", 155 | "C. c #CFC288", 156 | "Z. c #CCC298", 157 | "A. c #DED09B", 158 | "S. c #D4C692", 159 | "D. c #F3C589", 160 | "F. c #F9DF81", 161 | "G. c #EADA9C", 162 | "H. c #E6D597", 163 | "J. c #F7D797", 164 | "K. c #FAE185", 165 | "L. c #FBE38C", 166 | "P. c #FAE594", 167 | "I. c #FAE69A", 168 | "U. c #F5E093", 169 | "Y. c #C7C0A6", 170 | "T. c #CBC3A5", 171 | "R. c #CCC6AB", 172 | "E. c #CFC9AC", 173 | "W. c #D3CAA3", 174 | "Q. c #DACFA4", 175 | "!. c #D1CAAB", 176 | "~. c #D8CFA8", 177 | "^. c #DAD0A5", 178 | "/. c #DCD3AC", 179 | "(. c #C5C2B3", 180 | "). c #C9C5B4", 181 | "_. c #C3C2BC", 182 | "`. c #CCC8B2", 183 | "'. c #D2CDB5", 184 | "]. c #D8D4BA", 185 | "[. c #E4D9AD", 186 | "{. c #E4D8A6", 187 | "}. c #E3DAB0", 188 | "|. c #E9DEB1", 189 | " X c #F4D8AE", 190 | ".X c #EEE0A5", 191 | "XX c #FCEBAC", 192 | "oX c #F9E8A6", 193 | "OX c #EDE2B5", 194 | "+X c #F2E6B4", 195 | "@X c #FCEDB3", 196 | "#X c #F6EABA", 197 | "$X c #FCEEBC", 198 | "%X c #F2E7B8", 199 | "&X c #FCF0BD", 200 | "*X c #C5C4C2", 201 | "=X c #CAC9C6", 202 | "-X c #CCCCCA", 203 | ";X c #D0CECC", 204 | ":X c #D2D1CD", 205 | ">X c #DAD3C8", 206 | ",X c #D4D4D3", 207 | ".@X&XOXf.,X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X*X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5Xz.Y.&X&XK.K H m :Xk.Q.&Xk.5X", 228 | "5X#.! XX/.z.r.G G Y P.$X$X/.k.5X5X5X5X5X5X5X5X5X5X5X5X5X5Xy.5X5X5X5X5X5X5X5X5X5X5X5X5X:XT.#X&XXX:.J G m z.g.#X&XG.=X5X", 229 | "5X,Xj P L.$XZ.) i H J <.@X$X$X(.5X5X5X5X5X5X5X5X5X5X5X5X_.OX-X5X5X5X5X5X5X5X5X5X5X5X5XR.$XXX7.K G G 1 t./.&Xw.E ' 5X5X", 230 | "5X5XM.i J :.XX$X_ b H J L q.$XN.5X5X5X5X5X5X5X5X5X5X5X,XQ.9.f.5X5X5X5X5X5X5X5X5X5X5X-X[.@XL H H y ^ W.&XU.T H 2 1X5X5X", 231 | "5X5X5Xc.u J K 6.@X$X5.a H H oX^.:X5X5X5X5X5X5X5X5X5X1Xi.3.H H.V.5X5X5X5X5X5X5X5X5X5Xj.$X9.G G S {.&XJ.D a s C ,X5X5X5X", 232 | "5X5X5X5Xc.u G p c X.J.9.H G :.&Xd.5X5X5X5X5X5X5X5X:XY.&X&Xg Y G.j.5X5X5X5X5X5X5X5X:XQ.@XK G Q oXD.[ 6 a a 2 -X5X5X5X5X", 233 | "5X5X5X5X5XY.t J a f 5 5 6 G H I./._.5X5X5X5X5X1XV.H.@X&X*.p G P I.T.=X5X5X5X5X5X5Xf.$X<.G G D = 5 p G H ^ ,X5X5X5X5X5X", 234 | "5X5X5X5X5X5X:X{ u G G s p s H T $Xn.1X5X5X5X*XW.8. .D.X.F G H G H 1.[.N.1X5X5X5XV.OXP.H s s f a G G q r.5X5X5X5X5X5X5X", 235 | "5X5X5X,XR.W.'.).) < w u G G G G 7.$Xt.5X1Xk. X .v , ] ! K H G t V m l q.^._.5X=XW.XXP H J G J e 3 ~ d.`.T.!._.5X5X5X5X", 236 | "5X5X5X,X[.$X$X$X4X$X+XH.q.! G G s L.#Xu.M.I.N b.9X0X0X].t H ( 8X0X0X>Xm Y G.t.!.@XT G G H H 3.H.#X&X$XXXP.K.k.5X5X5X5X", 237 | "5X5X5X5XV.{.U L L U Q ! O.v H G H K J.n.P.d B.0X0X0X6X9Xv.m 8X5X0X0X0X6XN P .XS.T G G G G H c v F I K H H B 1X5X5X5X5X", 238 | "5X5X5X5X5X=X#.y G G G G J K G G G G B XXl , 0X0X0X*Xa.O 5X_ s.x.o 0X0X0XZ.H R A.i G G H H J a G G G H 0 _ 1X5X5X5X5X5X", 239 | "5X5X5X5X5X5X5X-Xv.} n e u w S G G H C.<.5 &.0X0X0XX h.. =Xa.O s. 2X0X0X5Xi J F.V H G H w e 8 q C #.j.1X5X5X5X5X5X5X5X", 240 | "5X5X5X5X5X5X5X5X_.).E.Z.S.q.P G G q +Xl 7 C.0X0X0X- @ ; :Xe.> @ ; -X0X0X9Xw 7 >.` H G H T =.r.R.E.(.:X5X5X5X5X5X5X5X5X", 241 | "5X5X5X5X5X5X5X*X|.@XL.:.K G G H G 2 I.s G | 0X0X0X>X@.b.!.V 3X+.p.0X0X0X>Xf 5 R S.H G H H G K 1.@X&XN.5X5X5X5X5X5X5X5X", 242 | "5X5X5X5X5X5X5X5X=X%.V q 9 e 9 0 -.2 L.H ! -.1X0X0X0X0X6XZ a m.0X0X0X0X0XT.J.X.E ^.u A r 8 8 q b %.).2X5X5X5X5X5X5X5X5X", 243 | "5X5X5X5X5X5X5X5X5X5X5X5X-Xt.}.U.Y B P.K @X4X/.).6X9X'.Z G G i &.3X0X c #EC4C4E", 22 | ", c #EE5B4E", 23 | "< c #EC4F50", 24 | "1 c #EC5455", 25 | "2 c #ED585A", 26 | "3 c #EE6A6B", 27 | "4 c #EA6E71", 28 | "5 c #FC8C29", 29 | "6 c #FD9226", 30 | "7 c #FC952A", 31 | "8 c #F99D2E", 32 | "9 c #FA9936", 33 | "0 c #F6A431", 34 | "q c #F2AC34", 35 | "w c #EEB436", 36 | "e c #E4B43F", 37 | "r c #EDB53B", 38 | "t c #A7AB5F", 39 | "y c #ABAC5E", 40 | "u c #B6AD59", 41 | "i c #91A666", 42 | "p c #97A865", 43 | "a c #95A96B", 44 | "s c #90A66C", 45 | "d c #8BA57B", 46 | "f c #B2AD75", 47 | "g c #A1B37D", 48 | "h c #F8944C", 49 | "j c #D7B247", 50 | "k c #D4B249", 51 | "l c #C0AF53", 52 | "z c #FBA248", 53 | "x c #EAB747", 54 | "c c #EDBA4A", 55 | "v c #EFBE51", 56 | "b c #E4B65F", 57 | "n c #F1B656", 58 | "m c #D6A27F", 59 | "M c #FCAF62", 60 | "N c #F1C76D", 61 | "B c #EDC571", 62 | "V c #F1CB76", 63 | "C c #F2CC7A", 64 | "Z c #769FB2", 65 | "A c #7DA1A1", 66 | "S c #6699CE", 67 | "D c #699BCC", 68 | "F c #6D9CC6", 69 | "G c #7A82DD", 70 | "H c #6B97D1", 71 | "J c #6E9ED0", 72 | "K c #7D95D8", 73 | "L c #79A5D4", 74 | "P c #7DB1DF", 75 | "I c #89A581", 76 | "U c #93AB80", 77 | "Y c #A8AB94", 78 | "T c #A8B988", 79 | "R c #96A4BA", 80 | "E c #BFA2B8", 81 | "W c #F08486", 82 | "Q c #F08A8B", 83 | "! c #F18E81", 84 | "~ c #DAA581", 85 | "^ c #DEA884", 86 | "/ c #E2AB86", 87 | "( c #E5AE88", 88 | ") c #EDB48D", 89 | "_ c #F1B78F", 90 | "` c #F6BB92", 91 | "' c #F6BF99", 92 | "] c #EAAFAC", 93 | "[ c #F2A4A5", 94 | "{ c #F3B7B8", 95 | "} c #F2BBBB", 96 | "| c #F3B4B5", 97 | " . c #B5C39B", 98 | ".. c #9DC5BB", 99 | "X. c #C9C798", 100 | "o. c #F9C187", 101 | "O. c #F2D18B", 102 | "+. c #F6C39E", 103 | "@. c #F3D99C", 104 | "#. c #F2D697", 105 | "$. c #C9D4B8", 106 | "%. c #F6CAA6", 107 | "&. c #FAD3AC", 108 | "*. c #F4DBA3", 109 | "=. c #EED4B7", 110 | "-. c #F7D0B5", 111 | ";. c #FAD7B4", 112 | ":. c #F4E0B2", 113 | ">. c #9F9CC1", 114 | ",. c #A394C4", 115 | "<. c #80AAD6", 116 | "1. c #97BADD", 117 | "2. c #BAD4C9", 118 | "3. c #ABC7E3", 119 | "4. c #A6DEFF", 120 | "5. c #A9DFFF", 121 | "6. c #ABDAF4", 122 | "7. c #ADE0FF", 123 | "8. c #B3E2FE", 124 | "9. c #BAE5FE", 125 | "0. c #CECCC4", 126 | "q. c #CECDC9", 127 | "w. c #D3D2CE", 128 | "e. c #D6DECA", 129 | "r. c #D6D9C9", 130 | "t. c #CBC9DD", 131 | "y. c #C0D0DD", 132 | "u. c #D4D4D0", 133 | "i. c #D9D9D7", 134 | "p. c #DDDCD9", 135 | "a. c #F5C7C8", 136 | "s. c #ECDCCC", 137 | "d. c #F7DBC7", 138 | "f. c #F7DDCA", 139 | "g. c #ECDFD2", 140 | "h. c #F5D4D5", 141 | "j. c #F6D7D8", 142 | "k. c #F6DDDE", 143 | "l. c #F5E7C4", 144 | "z. c #F8E5CA", 145 | "x. c #EBE4DD", 146 | "c. c #E5E6DE", 147 | "v. c #F7E1D2", 148 | "b. c #F7E5D8", 149 | "n. c #F7EBDD", 150 | "m. c #F8ECD8", 151 | "M. c #C3D7EB", 152 | "N. c #C8DAEC", 153 | "B. c #D6D8E6", 154 | "V. c #E3DAE2", 155 | "C. c #C1E7FE", 156 | "Z. c #C5E9FD", 157 | "A. c #CCEBFD", 158 | "S. c #CCE7F5", 159 | "D. c #D5EEFD", 160 | "F. c #DDE8F3", 161 | "G. c #DDF1FC", 162 | "H. c #D6E6E3", 163 | "J. c #EAE9E4", 164 | "K. c #EDEDE9", 165 | "L. c #E8E7E1", 166 | "P. c #F6E2E3", 167 | "I. c #F7EBEC", 168 | "U. c #F2F2EE", 169 | "Y. c #F8F2EB", 170 | "T. c #ECF2F7", 171 | "R. c #E2F2FC", 172 | "E. c #ECF6FC", 173 | "W. c #F4F5F4", 174 | "Q. c #F8F6F3", 175 | "!. c #F8F8F6", 176 | "~. c #F1F7FA", 177 | "^. c #F8F7F8", 178 | "/. c #F6F9FB", 179 | "(. c #F8FAFB", 180 | /* pixels */ 181 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 182 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.N.1.3.E.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", 183 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.W.(.(.(.(.(.(.(.(.3.S S D L /.(.(.(.(.(.(.(.(.(.(.(.(.(.", 184 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.W.J.J.J.J.J.W.W.(.(.(.(.(./.D S S S S N.(.(.(.(.(.(.(.(.(.(.(.(.(.", 185 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.(.E.H S S S S 6.Q.(.(.(.(.(.(.(.(.(.(.(.(.", 186 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(./.9.P S D S L T.(.(.(.(.(.(.(.(.(.(.(.(.(.", 187 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.K.J.J.J.J.J.J.J.J.J.J.(.(.(.A.7.8.3.L 1.F.(.(.(.(.(.!.Y.m.(.(.(.(.(.(.", 188 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.W.a.P.(.(.(.(.W.J.J.J.J.J.J.J.J.J.W.(.(.(.7.7.~.(.(././.(.(.(.(.(.&.9 6 M Q.(.(.(.(.", 189 | "(.(.(.(.(.(.(.(.(.(.(.(.(.P.: O { (.(.(.(.W.w.i./.!.!.~.w.u.(.(.(.E.4.C.(.(.(.(.(.(.(.(.R.S.9 6 6 6 &.(.(.(.(.", 190 | "(.(.(.(.R.D.A.D.(.(.(.(.(.Q 1 (.(.(.(.W.q.i.(.(.(.(.q.u.(.(.(.G.4.A.(.(.(.(.(.(./.Z.4.6.7 6 6 6 %.(.(.(.(.", 191 | "(.(.(.8.4.4.4.4.G.(.(./.(.Q > (.(.(.(.W.q.i.(.W.!.(.q.u.(.(.(.E.8.R.(.(.(.(.(.E.9.7.8.G.o.6 6 z Y.(.(.(.(.", 192 | "(.(.(.9.Z.D.G.G.(.(.8.8.E.k.: o E G.(.(.(.W.q.i.(.@.m.(.q.u.(.(.(.(.(.(.(.(.(.(.~.9.4.C./.(.(.z.;.Y.!.(.(.(.(.", 193 | "(.(.(.(.(.(.(.(.(.(.A.4.8.(.I.a.V.4.8.(.(.(.~.0.i.Q.c V (.w.w.(.(.(.(.(.(./.I.h.h.B.4.9.(.(.(.(.(.(.(.(.(.(.(.(.", 194 | "(.(.(.(.(.(.(.(.(.(.(.D.D.(.(.(.(.Z.4.D.(.(.W.0.r.@.w r z.0.u.(.(.(.(.k.Q > + 4 } (.(.(.(.(.(.(.(.(.(.(.", 195 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.E.4.9.(.(.#.x r w w w w x c l.(.I.W O # $ $ @ O 2 h.(.(.(.(.(.(.(.(.(.", 196 | "(.(.(.(.(.(.(.W. .a g e.(.(.(.(.(.(.8.4.(.(.Q.V w w w w w r *.(.P.1 . = 5 6 6 6 6 6 ; @ O | (.(.(.(.(.(.(.(.", 197 | "(.(.(.(.(.(.(. .i i i a H.E.(.(.(.(.9.7.E.(.(.!.N w w w w *.(.I.> $ 5 6 7 8 0 q 0 8 6 6 = O { (.(.(.(.(.(.(.", 198 | "(.(.(.(.(.(.(.a i i i i ..5.8.R.(.(.Z.7.~.(.(.(.V w w w w :.!.3 o * 6 6 q w w w w w w q 8 6 ; + k.(.(.(.(.(.(.", 199 | "(.(.(.(.(.(.(.g i i i i 2.9.5.5.D.(./.E.(.(.(.(.v r O.N r O.| X . 6 7 w w x u y t u j w w 0 6 - 3 (.(.(.(.(.(.", 200 | "(.(.(.(.(.(.(.e.a i i T W.(.R.7.4.R.(.(.(.(.(.Q.C n.(.(.l.O.1 5 6 q w k i p i i i i u r B -.s.] 1 h.(.(.(.(.(.", 201 | "(.(.(.(.(.(.(.(.L.$.e.W.(.(.(.E.7.R.(.(.(.(.(.(.(.(.(.(.(.j. @ 6 8 w j i s A F F Z d s X.J.J.J.J.x.} (.(.(.(.(.", 202 | "(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.[ = 6 q w t i Z S H S S D U c.J.J.J.J.L.L./.(.(.(.(.", 203 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.W ; 7 w e i I S H G G K 2.V.J.J.J.J.J.J.J.J.U.(.(.(.", 204 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.P.b.b.b.b.b.b.b.b.b.b.b.b.b.j.m , h z n b f Y R >.,.,.t.K.J.J.J.J.J.J.J.J.J.J.W.(.(.", 205 | "(.(.(.(.(.(.(.(.(.(.(.(.(.(.' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` x.J.J.J.J.J.J.J.J.J.J.J.K.(.(.", 206 | "(.(.(.(.(.(.(.(.(.(.(.(.(.Q.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g.J.J.J.J.J.J.J.J.J.J.J.I.(.(.", 207 | "(.(.(.(.(.(.(.(.(.(.(.(.(.b.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` %.c.L.J.J.L.J.J.J.J.J.K.(.(.(.", 208 | "(.(.(.(.(.(.(.(.(.(.(.(.Q.%.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' b.W.W.W.W.W.W.W.W./.(.(.(.", 209 | "(.(.(.(.(.(.(.(.(.(.(.(.-.` ` ` _ _ ` ` ` ` ` _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 210 | "(.(.(.(.(.(.(.(.(.(.(.v.` ` ` ` m ~ ` ` ` ` _ m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 211 | "(.(.(.(.(.(.(.(.(.(.I.' ` ` ` ` / m / ) ` ) ~ m _ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 212 | "(.(.(.(.(.(.(.(.(.^.%.` ` ` ` ` _ / m m m m m / ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(.", 213 | "(.(.(.(.(.(.(.(.(.z.` ` ` ` ` ` ` ` ) ^ ^ ^ ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` f.(.(.(.(.(.(.(.(.(.(.(.(." 214 | }; 215 | -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/new.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/bitmaps/new.bmp -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/bitmaps/new.xpm: -------------------------------------------------------------------------------- 1 | /* XPM */ 2 | static const char *const img_new_xpm[] = { 3 | /* columns rows colors chars-per-pixel */ 4 | "16 16 31 1", 5 | ". c #7198D9", 6 | "2 c #DCE6F6", 7 | ", c #FFFFFF", 8 | "= c #9AB6E4", 9 | "6 c #EAF0FA", 10 | "w c #6992D7", 11 | "0 c #5886D2", 12 | "7 c #F7F9FD", 13 | "5 c #F0F5FC", 14 | "* c #A8C0E8", 15 | " c None", 16 | "8 c #FDFEFF", 17 | "% c #C4D5F0", 18 | "3 c #E2EAF8", 19 | "+ c #4377CD", 20 | "O c #487BCE", 21 | "; c #6B94D7", 22 | "- c #89A9DF", 23 | ": c #5584D1", 24 | "# c #3569BF", 25 | "@ c #3A70CA", 26 | "1 c #D2DFF4", 27 | "> c #3366BB", 28 | "$ c #2E5CA8", 29 | "9 c #FAFCFE", 30 | "4 c #F5F8FD", 31 | "q c #638ED5", 32 | "o c #5282D0", 33 | "& c #B8CCEC", 34 | "X c #376EC9", 35 | "< c #ACE95B", 36 | /* pixels */ 37 | " .XoO+@#$. ", 38 | " .%%&*=-O;: ", 39 | " >>>>%&*=O,=o ", 40 | " ><<>%%&*O,,=o ", 41 | ">>><<>>>%&OOo+@ ", 42 | "><<<<<<>1%&*=-@ ", 43 | "><<<<<<>21%&*=@ ", 44 | ">>><<>>>321%&*+ ", 45 | " ><<>456321%&O ", 46 | " >>>>7456321%o ", 47 | " .,8974563210 ", 48 | " .,,897456320 ", 49 | " .,,,8974563q ", 50 | " .,,,,897456w ", 51 | " .,,,,,89745w ", 52 | " ............ " 53 | }; 54 | -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/conf.h: -------------------------------------------------------------------------------- 1 | #ifndef CONF_H_ 2 | #define CONF_H_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #define SZ 36 7 | 8 | #endif // CONF_H_ -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/diagrams/class-structure-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/diagrams/class-structure-design.png -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/diagrams/seq-create-newgame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/diagrams/seq-create-newgame.png -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/diagrams/seq-guess-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/diagrams/seq-guess-number.png -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/diagrams/seq-init-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/guess-number-observer-cpp/diagrams/seq-init-app.png -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_controller.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "game_controller.h" 4 | #include "game_model.h" 5 | #include "game_view.h" 6 | 7 | GameController::GameController(GameModel *model_) 8 | : model(model_){ 9 | } 10 | 11 | void GameController::NewGame() { 12 | model->Init(); 13 | } 14 | 15 | void GameController::Guess(int number) { 16 | model->Submit(number); 17 | } -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_controller.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_CONTROLLER_H_ 2 | #define GAME_CONTROLLER_H_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | class GameModel; 7 | 8 | class GameController { 9 | public: 10 | GameController(GameModel *model_); 11 | void NewGame(); 12 | void Guess(int number); 13 | private: 14 | GameModel *model; 15 | }; 16 | 17 | #endif // GAME_CONTROLLER_H_ -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_model.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "conf.h" 4 | 5 | #include "game_model.h" 6 | #include "observer.h" 7 | 8 | #ifdef DEBUG 9 | #include 10 | #endif 11 | 12 | #include 13 | #include 14 | 15 | GameModel::GameModel() { 16 | std::srand(std::time(NULL)); 17 | Init(); 18 | } 19 | 20 | void GameModel::Init() { 21 | secret = std::rand() % SZ + 1; 22 | #ifdef DEBUG 23 | std::cout << secret << std::endl; 24 | #endif // DEBUG 25 | for (int i = 0; i <= SZ; ++i) { 26 | slots[i] = NORMAL; 27 | } 28 | lifes = number_of_guesses; 29 | Notify(); 30 | } 31 | 32 | void GameModel::Submit(int guess) { 33 | if (guess == secret) { 34 | Won(); 35 | Notify(); 36 | return; 37 | } 38 | if (guess < secret) { 39 | Disable(1, guess); 40 | } else { 41 | Disable(guess, SZ); 42 | } 43 | --lifes; 44 | if (lifes < 1) { 45 | Failed(); 46 | } 47 | Notify(); 48 | } 49 | 50 | int GameModel::GetLifes() { 51 | return lifes; 52 | } 53 | 54 | void GameModel::Won() { 55 | for (int i = 1; i <= SZ; ++i) { 56 | slots[i] = WRONG; 57 | } 58 | slots[secret] = WON; 59 | } 60 | 61 | void GameModel::Failed() { 62 | for (int i = 1; i <= SZ; ++i) { 63 | slots[i] = WRONG; 64 | } 65 | slots[secret] = FAILED; 66 | } 67 | 68 | void GameModel::Disable(int from, int to) { 69 | for (int i = from; i <= to; ++i) { 70 | slots[i] = WRONG; 71 | } 72 | } 73 | 74 | GameModel::State GameModel::GetState(int idx) { 75 | return slots[idx]; 76 | } 77 | 78 | void GameModel::Notify() { 79 | for (auto it = observers.begin(); it != observers.end(); ++it) { 80 | it->first->Update(this); 81 | } 82 | } 83 | 84 | void GameModel::Attach(Observer *o) { 85 | observers[o] = 1; 86 | Notify(); 87 | } 88 | 89 | void GameModel::Detach(Observer *o) { 90 | auto it = observers.find(o); 91 | if (it != observers.end()) { 92 | observers.erase(it); 93 | } 94 | } -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_model.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_MODEL_HPP_ 2 | #define GAME_MODEL_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | class Observer; 13 | 14 | class GameModel { 15 | public: 16 | enum State { 17 | NORMAL, 18 | WRONG, 19 | WON, 20 | FAILED 21 | }; 22 | GameModel(); 23 | void Init(); 24 | void Submit(int guess); 25 | State GetState(int idx); 26 | int GetLifes(); 27 | void Notify(); 28 | void Attach(Observer *o); 29 | void Detach(Observer *o); 30 | private: 31 | void Won(); 32 | void Failed(); 33 | void Disable(int from, int to); 34 | State slots[SZ + 1]; 35 | int secret; 36 | int lifes; 37 | const int number_of_guesses = 3; 38 | std::map observers; 39 | }; 40 | 41 | #endif // GAME_MODEL_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_view.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "bitmaps/blackcat.xpm" 4 | #include "bitmaps/inspiration.xpm" 5 | #include "bitmaps/gomechan.xpm" 6 | #include "conf.h" 7 | #include "game_controller.h" 8 | #include "game_model.h" 9 | #include "game_view.h" 10 | 11 | #include 12 | #include 13 | #include 14 | 15 | GameView::GameView(): wxFrame(nullptr, wxID_ANY, 16 | "Time Flies", wxDefaultPosition, {480, 320}) { 17 | tool_bar = this->CreateToolBar(wxTB_HORIZONTAL, wxID_ANY); 18 | btn_new_game = new wxButton( tool_bar, wxID_ANY, wxT("New Game"), 19 | wxDefaultPosition, wxDefaultSize, 0 ); 20 | tool_bar->AddControl(btn_new_game); 21 | btn_new_game->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { 22 | controller->NewGame(); 23 | }); 24 | 25 | bmp_won = new wxBitmap(img_gomechan_xpm); 26 | bmp_failed = new wxBitmap(img_blackcat_xpm); 27 | bmp_progress = new wxBitmap(img_inspiration_xpm); 28 | 29 | tool_bar->AddSeparator(); 30 | lbl_indicator = new wxStaticText(tool_bar, wxID_ANY, 31 | wxT("///"), wxDefaultPosition, {30, 30}, 0); 32 | lbl_indicator->Wrap(-1); 33 | lbl_indicator->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, 34 | wxFONTWEIGHT_BOLD, false, wxEmptyString)); 35 | tool_bar->AddControl(lbl_indicator); 36 | tool_bar->AddSeparator(); 37 | bmp_out_come = new wxStaticBitmap(tool_bar, wxID_ANY, 38 | wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); 39 | tool_bar->AddControl(bmp_out_come); 40 | tool_bar->Realize(); 41 | 42 | wxWrapSizer* sizer; 43 | sizer = new wxWrapSizer( wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS ); 44 | 45 | for (int i = 1; i <= SZ; ++i) { 46 | std::stringstream ss; 47 | ss << i; 48 | buttons[i] = new wxButton( this, wxID_ANY, 49 | ss.str(), wxDefaultPosition, {70, 30}, 0 ); 50 | buttons[i]->SetFont(wxFont(18, wxFONTFAMILY_DEFAULT, 51 | wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, 52 | false, wxEmptyString)); 53 | buttons[i]->Bind(wxEVT_BUTTON, [&, i](wxCommandEvent& event) { 54 | controller->Guess(i); 55 | }); 56 | sizer->Add(buttons[i], 0, wxALL, 5 ); 57 | } 58 | 59 | this->SetSizer(sizer); 60 | this->Layout(); 61 | this->Centre(wxBOTH); 62 | } 63 | 64 | void GameView::SetController(GameController *c) { 65 | controller = c; 66 | } 67 | 68 | void GameView::Update(GameModel *model) { 69 | int ended = 0; 70 | for (int i = 1; i <= SZ; ++i) { 71 | switch(model->GetState(i)) { 72 | case GameModel::NORMAL: 73 | buttons[i]->Enable(true); 74 | buttons[i]->SetBackgroundColour( 75 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 76 | break; 77 | case GameModel::WRONG: 78 | buttons[i]->Enable(false); 79 | buttons[i]->SetBackgroundColour( 80 | wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); 81 | break; 82 | case GameModel::WON: 83 | ended = 1; 84 | bmp_out_come->SetBitmap(*bmp_won); 85 | buttons[i]->Enable(false); 86 | buttons[i]->SetBackgroundColour(wxColour(10, 246, 10)); 87 | break; 88 | case GameModel::FAILED: 89 | ended = 2; 90 | bmp_out_come->SetBitmap(*bmp_failed); 91 | buttons[i]->Enable(false); 92 | buttons[i]->SetBackgroundColour(wxColour(246, 10, 10)); 93 | break; 94 | } 95 | } 96 | int n = model->GetLifes(); 97 | std::stringstream ss; 98 | for (int i = 0; i < n; ++i) { 99 | ss << "/"; 100 | } 101 | lbl_indicator->SetLabel(ss.str()); 102 | if (!ended) { 103 | bmp_out_come->SetBitmap(*bmp_progress); 104 | } 105 | } -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/game_view.h: -------------------------------------------------------------------------------- 1 | #ifndef GAME_VIEW_HPP_ 2 | #define GAME_VIEW_HPP_ 3 | 4 | /* (C) Nguyen Ba Ngoc 2022 */ 5 | 6 | #include "conf.h" 7 | #include "observer.h" 8 | 9 | #include 10 | 11 | class GameController; 12 | class GameModel; 13 | 14 | class GameView: public wxFrame, public Observer { 15 | public: 16 | GameView(); 17 | void SetController(GameController *c); 18 | void Update(GameModel *model) override; 19 | private: 20 | wxButton *buttons[SZ + 1]; 21 | wxToolBar* tool_bar; 22 | wxButton* btn_new_game; 23 | wxStaticText* lbl_indicator; 24 | wxStaticBitmap* bmp_out_come; 25 | wxBitmap *bmp_won; 26 | wxBitmap *bmp_failed; 27 | wxBitmap *bmp_progress; 28 | GameController *controller; 29 | }; 30 | 31 | #endif // GAME_VIEW_HPP_ -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/main.cpp: -------------------------------------------------------------------------------- 1 | /* (C) Nguyen Ba Ngoc 2022 */ 2 | 3 | #include "game_controller.h" 4 | #include "game_model.h" 5 | #include "game_view.h" 6 | 7 | class Application : public wxApp { 8 | bool OnInit() override { 9 | view = new GameView(); 10 | model = new GameModel(); 11 | controller = new GameController(model); 12 | model->Attach(view); 13 | view->SetController(controller); 14 | view->Show(); 15 | return true; 16 | } 17 | int OnExit() override { 18 | delete model; 19 | 20 | // TODO: view should be freed automatically by wxwidgets?? 21 | // delete view; 22 | 23 | delete controller; 24 | return wxApp::OnExit(); 25 | } 26 | private: 27 | GameView *view; 28 | GameModel *model; 29 | GameController *controller; 30 | }; 31 | 32 | wxIMPLEMENT_APP(Application); -------------------------------------------------------------------------------- /demo/guess-number-observer-cpp/observer.h: -------------------------------------------------------------------------------- 1 | #ifndef OBSERVER_H_ 2 | #define OBSERVER_H_ 3 | 4 | class GameModel; 5 | 6 | class Observer { 7 | public: 8 | virtual void Update(GameModel *model) = 0; 9 | }; 10 | 11 | #endif // OBSERVER_H_ -------------------------------------------------------------------------------- /demo/it-class-example.gan: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /demo/model2clock/bin/run: -------------------------------------------------------------------------------- 1 | mvn jetty:run -Djetty.http.port=8889 2 | localhost:8889/model2clock/clock -------------------------------------------------------------------------------- /demo/model2clock/model2clock.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /demo/model2clock/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.example 8 | model2clock 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 7 13 | 7 14 | 2.5.31 15 | 9.4.8.v20171121 16 | 2.17.1 17 | 18 | war 19 | 20 | model2clock 21 | 22 | 23 | org.eclipse.jetty 24 | jetty-maven-plugin 25 | ${jetty.version} 26 | 27 | 28 | 29 | /${build.finalName} 30 | 31 | CTRL+C 32 | 8999 33 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.apache.struts 45 | struts2-core 46 | ${struts2.version} 47 | 48 | 49 | 50 | org.apache.struts 51 | struts2-config-browser-plugin 52 | ${struts2.version} 53 | 54 | 55 | 56 | org.apache.logging.log4j 57 | log4j-core 58 | ${log4j2.version} 59 | 60 | 61 | 62 | org.apache.logging.log4j 63 | log4j-api 64 | ${log4j2.version} 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | org.apache.struts 73 | struts2-core 74 | ${struts2.version} 75 | 76 | 77 | 78 | 79 | org.apache.logging.log4j 80 | log4j-core 81 | ${log4j2.version} 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/java/model2/ClockAction.java: -------------------------------------------------------------------------------- 1 | package model2; 2 | 3 | import static com.opensymphony.xwork2.Action.SUCCESS; 4 | 5 | public class ClockAction { 6 | private ClockModel clockModel; 7 | public String execute() { 8 | clockModel = new ClockModel() ; 9 | 10 | return SUCCESS; 11 | } 12 | public ClockModel getClockModel() { 13 | return clockModel; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/java/model2/ClockModel.java: -------------------------------------------------------------------------------- 1 | package model2; 2 | 3 | import java.util.Calendar; 4 | 5 | public class ClockModel { 6 | private long hours, minutes, seconds; 7 | public long getHours() { 8 | return hours; 9 | } 10 | public long getMinutes() { 11 | return minutes; 12 | } 13 | public long getSeconds() { 14 | return seconds; 15 | } 16 | public ClockModel() { 17 | Calendar now = Calendar.getInstance(); 18 | hours = now.get(Calendar.HOUR); 19 | minutes = now.get(Calendar.MINUTE); 20 | seconds = now.get(Calendar.SECOND); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/resources/struts.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | /clock.jsp 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | Model2 clock 7 | 8 | 9 | struts2 10 | org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 11 | 12 | 13 | 14 | struts2 15 | /* 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/model2clock/src/main/webapp/clock.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" 2 | import = "java.util.*" 3 | %> 4 | <%@ taglib prefix="s" uri="/struts-tags" %> 5 | 6 | 7 | 8 | <% 9 | response.setIntHeader("Refresh", 1); 10 | %> 11 | 12 | 14 | 15 | 16 | 93 | 94 | -------------------------------------------------------------------------------- /demo/mvc-clock/README.md: -------------------------------------------------------------------------------- 1 | # Minh họa kiến trúc MVC 2 | 3 | ## Các biểu đồ 4 | 5 | ### Biểu đồ lớp 6 | 7 | ![Biểu đồ lớp với các lớp được biểu diễn bằng các hình chữ nhật](diagram/struct-rect.png) 8 | 9 | 10 | ![Biểu đồ lớp với các lớp được biểu diễn bằng các biểu tượng](diagram/struct-icon.png) 11 | 12 | ### Biểu đồ tuần tự 13 | 14 | ![Biểu đồ tuần tự trường hợp bấm nút Tick](diagram/sequence-tick.png) -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | project(cpp-mvc-clock) 3 | find_package(wxWidgets 3.0 REQUIRED) 4 | include(${wxWidgets_USE_FILE}) 5 | add_executable(clock main.cpp) 6 | target_link_libraries(clock ${wxWidgets_LIBRARIES}) -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/clock_controller.h: -------------------------------------------------------------------------------- 1 | #ifndef CLOCK_CONTROLLER_H_ 2 | #define CLOCK_CONTROLLER_H_ 3 | 4 | /* 5 | (C) Nguyen Ba Ngoc 2022 6 | */ 7 | 8 | #include "clock_view.h" 9 | #include "clock_model.h" 10 | 11 | class ClockController { 12 | private: 13 | ClockView *view = nullptr; 14 | ClockModel *model = nullptr; 15 | public: 16 | ClockController(ClockView *my_view, ClockModel *my_model): 17 | view(my_view), model(my_model) { 18 | } 19 | void Tick() { 20 | model->Advance(); 21 | view->Refresh(); 22 | } 23 | void Reset() { 24 | model->Init(); 25 | view->Refresh(); 26 | } 27 | }; 28 | 29 | #endif // CLOCK_CONTROLLER_H_ -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/clock_model.h: -------------------------------------------------------------------------------- 1 | #ifndef CLOCK_MODEL_H_ 2 | #define CLOCK_MODEL_H_ 3 | 4 | /* 5 | (C) Nguyen Ba Ngoc 2022 6 | */ 7 | 8 | #include 9 | 10 | class ClockModel { 11 | private: 12 | int seconds; 13 | public: 14 | ClockModel() { 15 | Init(); 16 | } 17 | int GetHour() { 18 | int h = seconds / 3600; 19 | if (h > 12) { 20 | h %= 12; 21 | } 22 | return h; 23 | } 24 | int GetMinute() { 25 | return (seconds % 3600) / 60; 26 | } 27 | int GetSecond() { 28 | return seconds % 60; 29 | } 30 | void Advance() { 31 | ++seconds; 32 | } 33 | void Init() { 34 | time_t cur; 35 | struct tm *loc; 36 | time(&cur); 37 | loc = localtime(&cur); 38 | seconds = loc->tm_hour * 3600 + loc->tm_min * 60 + loc->tm_sec; 39 | } 40 | }; 41 | 42 | #endif // CLOCK_MODEL_H_ -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/clock_view.h: -------------------------------------------------------------------------------- 1 | #ifndef CLOCK_VIEW_H_ 2 | #define CLOCK_VIEW_H_ 3 | 4 | /* 5 | (C) Nguyen Ba Ngoc 2022 6 | */ 7 | 8 | #include 9 | #include 10 | 11 | #include "clock_model.h" 12 | 13 | class ClockView: public wxPanel { 14 | private: 15 | ClockModel *model = nullptr; 16 | public: 17 | ClockView(wxWindow *parent, 18 | ClockModel *my_model = nullptr, 19 | wxWindowID winid = wxID_ANY, 20 | const wxPoint& pos = wxDefaultPosition, 21 | const wxSize& size = wxDefaultSize, 22 | long style = wxTAB_TRAVERSAL | wxNO_BORDER, 23 | const wxString& name = wxPanelNameStr): 24 | model(my_model), wxPanel(parent, winid, pos, size, style, name) { 25 | Bind(wxEVT_PAINT, [&](wxPaintEvent& event) { 26 | wxPaintDC dc(this); 27 | dc.DrawCircle(180, 100, 80); 28 | double hour_angle = 2 * M_PI * (model->GetHour() - 3) / 12; 29 | double minute_angle = 2 * M_PI * (model->GetMinute() - 15) / 60; 30 | double second_angle = 2 * M_PI * (model->GetSecond() - 15) / 60; 31 | dc.DrawLine(180, 100, 32 | 180 + (int)(30 * std::cos(hour_angle)), 33 | 100 + (int)(30 * std::sin(hour_angle))); 34 | dc.DrawLine(180, 100, 35 | 180 + (int)(46 * std::cos(minute_angle)), 36 | 100 + (int)(46 * std::sin(minute_angle))); 37 | dc.DrawLine(180, 100, 38 | 180 + (int)(46 * std::cos(second_angle)), 39 | 100 + (int)(46 * std::sin(second_angle))); 40 | }); 41 | } 42 | }; 43 | 44 | #endif // CLOCK_VIEW_H_ -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | #include "main_window.h" 2 | 3 | class Application : public wxApp { 4 | bool OnInit() override { 5 | (new MainWindow())->Show(); 6 | return true; 7 | } 8 | }; 9 | 10 | wxIMPLEMENT_APP(Application); -------------------------------------------------------------------------------- /demo/mvc-clock/cpp/main_window.h: -------------------------------------------------------------------------------- 1 | #ifndef MAIN_WINDOW_H_ 2 | #define MAIN_WINDOW_H_ 3 | 4 | #include 5 | 6 | #include "clock_view.h" 7 | #include "clock_controller.h" 8 | 9 | class MainWindow : public wxFrame { 10 | public: 11 | MainWindow(): wxFrame(nullptr, wxID_ANY, "Clock MVC", wxDefaultPosition, {400, 320}) { 12 | button_tick->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { 13 | controller->Tick(); 14 | }); 15 | 16 | button_reset->Bind(wxEVT_BUTTON, [&](wxCommandEvent& event) { 17 | controller->Reset(); 18 | }); 19 | } 20 | ~MainWindow() { 21 | delete model; 22 | delete controller; 23 | } 24 | 25 | private: 26 | ClockModel *model = new ClockModel(); 27 | ClockView* view = new ClockView(this, model, wxID_ANY, {10, 10}, {380, 200}); 28 | ClockController *controller = new ClockController(view, model); 29 | wxPanel* control = new wxPanel(this, wxID_ANY, {10, 220}, {380, 60}); 30 | wxButton* button_tick = new wxButton(control, wxID_ANY, "Tick", {80, 10}); 31 | wxButton* button_reset = new wxButton(control, wxID_ANY, "Reset", {200, 10}); 32 | }; 33 | 34 | #endif // MAIN_WINDOW_H_ -------------------------------------------------------------------------------- /demo/mvc-clock/diagram/sequence-tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/mvc-clock/diagram/sequence-tick.png -------------------------------------------------------------------------------- /demo/mvc-clock/diagram/struct-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/mvc-clock/diagram/struct-icon.png -------------------------------------------------------------------------------- /demo/mvc-clock/diagram/struct-rect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/demo/mvc-clock/diagram/struct-rect.png -------------------------------------------------------------------------------- /demo/mvc-clock/java/bin/run: -------------------------------------------------------------------------------- 1 | gradle run 2 | -------------------------------------------------------------------------------- /demo/mvc-clock/java/build.gradle: -------------------------------------------------------------------------------- 1 | version '1.0-SNAPSHOT' 2 | 3 | apply plugin: 'java' 4 | apply plugin: 'application' 5 | 6 | sourceCompatibility = 1.8 7 | 8 | mainClassName = "Application" 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | -------------------------------------------------------------------------------- /demo/mvc-clock/java/src/main/java/Application.java: -------------------------------------------------------------------------------- 1 | public class Application { 2 | private ClockView view; 3 | private ClockModel model; 4 | private ClockController controller; 5 | MainWindow window; 6 | 7 | public Application() { 8 | model= new ClockModel(); 9 | view= new ClockView(model); 10 | controller = new ClockController(model, view); 11 | window = new MainWindow(view); 12 | window.setController(controller); 13 | } 14 | 15 | public void show() { 16 | window.setVisible(true); 17 | } 18 | 19 | public static void main(String[] args) { 20 | Application app = new Application(); 21 | app.show(); 22 | } 23 | } -------------------------------------------------------------------------------- /demo/mvc-clock/java/src/main/java/ClockController.java: -------------------------------------------------------------------------------- 1 | import java.awt.* ; 2 | import java.awt.event.* ; 3 | import javax.swing.* ; 4 | 5 | public class ClockController extends JFrame { 6 | private ClockView view; 7 | private ClockModel model; 8 | 9 | public ClockController(ClockModel m, ClockView v) { 10 | model = m; 11 | view = v; 12 | } 13 | 14 | public void tick() { 15 | model.advance(); 16 | view.repaint(); 17 | } 18 | 19 | public void reset() { 20 | model.init(); 21 | view.repaint(); 22 | } 23 | } -------------------------------------------------------------------------------- /demo/mvc-clock/java/src/main/java/ClockModel.java: -------------------------------------------------------------------------------- 1 | import java.time.LocalTime; 2 | 3 | public class ClockModel { 4 | private int time; 5 | 6 | public void init() { 7 | LocalTime local = LocalTime.now(); 8 | time = local.getHour() * 3600 + local.getMinute() * 60 9 | + local.getSecond(); 10 | } 11 | public ClockModel() { 12 | init(); 13 | } 14 | public int getHours() { 15 | int hour = time / 3600; 16 | if (hour >= 12) { 17 | hour %= 12; 18 | } 19 | return hour; 20 | } 21 | public int getMinutes() { 22 | return (time % 3600) / 60; 23 | } 24 | public int getSeconds() { 25 | return time % 60; 26 | } 27 | public void advance() { 28 | ++time; 29 | } 30 | } -------------------------------------------------------------------------------- /demo/mvc-clock/java/src/main/java/ClockView.java: -------------------------------------------------------------------------------- 1 | import java.awt.* ; 2 | import java.awt.geom.*; 3 | import javax.swing.* ; 4 | 5 | public class ClockView extends JPanel { 6 | private ClockModel model; 7 | 8 | public ClockView(ClockModel m) { 9 | model = m; 10 | } 11 | 12 | private void paintClock(Graphics g) { 13 | Graphics2D g2= (Graphics2D)g; 14 | int hours = model.getHours(); 15 | int minutes= model.getMinutes(); 16 | int seconds = model.getSeconds(); 17 | Shape e= new Ellipse2D.Double(100, 20, 160, 160); 18 | g2.draw(e); 19 | double hourAngle = 2 * Math.PI * (hours - 3) / 12; 20 | double minuteAngle = 2 * Math.PI * (minutes - 15) / 60; 21 | double secondAngle = 2 * Math.PI * (seconds - 15) / 60; 22 | Line2D.Double hour_line = 23 | new Line2D.Double(180, 100, 24 | 180 + (int) (30 * Math.cos(hourAngle)), 25 | 100 + (int) (30 * Math.sin(hourAngle))); 26 | Line2D.Double minute_line = 27 | new Line2D.Double(180, 100, 28 | 180 + (int) (46 * Math.cos(minuteAngle)), 29 | 100 + (int) (46 * Math.sin(minuteAngle))); 30 | Line2D.Double second_line = 31 | new Line2D.Double(180, 100, 32 | 180 + (int) (60 * Math.cos(secondAngle)), 33 | 100 + (int) (60 * Math.sin(secondAngle))); 34 | g2.draw(hour_line); 35 | g2.draw(minute_line); 36 | g2.draw(second_line); 37 | } 38 | 39 | public void paintComponent(Graphics g) { 40 | super.paintComponent(g); 41 | paintClock(g); 42 | } 43 | } -------------------------------------------------------------------------------- /demo/mvc-clock/java/src/main/java/MainWindow.java: -------------------------------------------------------------------------------- 1 | import java.awt.* ; 2 | import java.awt.event.* ; 3 | import javax.swing.* ; 4 | 5 | class MainWindow extends JFrame { 6 | private JButton tickButton, resetButton; 7 | private JPanel buttonHolder; 8 | private Container contentPane; 9 | private ClockController controller; 10 | 11 | public MainWindow(ClockView clock_view) { 12 | contentPane = getContentPane(); 13 | setSize(350, 270); 14 | setTitle("MVC Clock"); 15 | buttonHolder = new JPanel(); 16 | contentPane.add(buttonHolder, BorderLayout.SOUTH); 17 | 18 | tickButton = new JButton("Tick"); 19 | resetButton = new JButton("Reset"); 20 | 21 | buttonHolder.add(tickButton); 22 | buttonHolder.add(resetButton); 23 | 24 | contentPane.add(clock_view, BorderLayout.CENTER); 25 | tickButton.addActionListener(new ActionListener() { 26 | public void actionPerformed(ActionEvent ae) { 27 | controller.tick(); 28 | } 29 | }); 30 | 31 | resetButton.addActionListener(new ActionListener() { 32 | public void actionPerformed(ActionEvent ae) { 33 | controller.reset(); 34 | } 35 | }); 36 | 37 | setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 38 | } 39 | 40 | public void setController(ClockController controller) { 41 | this.controller = controller; 42 | } 43 | } -------------------------------------------------------------------------------- /demo/spring-cardb/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /demo/spring-cardb/README.md: -------------------------------------------------------------------------------- 1 | Use the command: 2 | 3 | `./mvnw spring-boot:run` 4 | 5 | to run the application. -------------------------------------------------------------------------------- /demo/spring-cardb/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | fi 118 | 119 | if [ -z "$JAVA_HOME" ]; then 120 | javaExecutable="`which javac`" 121 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 122 | # readlink(1) is not available as standard on Solaris 10. 123 | readLink=`which readlink` 124 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 125 | if $darwin ; then 126 | javaHome="`dirname \"$javaExecutable\"`" 127 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 128 | else 129 | javaExecutable="`readlink -f \"$javaExecutable\"`" 130 | fi 131 | javaHome="`dirname \"$javaExecutable\"`" 132 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 133 | JAVA_HOME="$javaHome" 134 | export JAVA_HOME 135 | fi 136 | fi 137 | fi 138 | 139 | if [ -z "$JAVACMD" ] ; then 140 | if [ -n "$JAVA_HOME" ] ; then 141 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 142 | # IBM's JDK on AIX uses strange locations for the executables 143 | JAVACMD="$JAVA_HOME/jre/sh/java" 144 | else 145 | JAVACMD="$JAVA_HOME/bin/java" 146 | fi 147 | else 148 | JAVACMD="`which java`" 149 | fi 150 | fi 151 | 152 | if [ ! -x "$JAVACMD" ] ; then 153 | echo "Error: JAVA_HOME is not defined correctly." >&2 154 | echo " We cannot execute $JAVACMD" >&2 155 | exit 1 156 | fi 157 | 158 | if [ -z "$JAVA_HOME" ] ; then 159 | echo "Warning: JAVA_HOME environment variable is not set." 160 | fi 161 | 162 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 163 | 164 | # traverses directory structure from process work directory to filesystem root 165 | # first directory with .mvn subdirectory is considered project base directory 166 | find_maven_basedir() { 167 | 168 | if [ -z "$1" ] 169 | then 170 | echo "Path not specified to find_maven_basedir" 171 | return 1 172 | fi 173 | 174 | basedir="$1" 175 | wdir="$1" 176 | while [ "$wdir" != '/' ] ; do 177 | if [ -d "$wdir"/.mvn ] ; then 178 | basedir=$wdir 179 | break 180 | fi 181 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 182 | if [ -d "${wdir}" ]; then 183 | wdir=`cd "$wdir/.."; pwd` 184 | fi 185 | # end of workaround 186 | done 187 | echo "${basedir}" 188 | } 189 | 190 | # concatenates all lines of a file 191 | concat_lines() { 192 | if [ -f "$1" ]; then 193 | echo "$(tr -s '\n' ' ' < "$1")" 194 | fi 195 | } 196 | 197 | BASE_DIR=`find_maven_basedir "$(pwd)"` 198 | if [ -z "$BASE_DIR" ]; then 199 | exit 1; 200 | fi 201 | 202 | ########################################################################################## 203 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 204 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 205 | ########################################################################################## 206 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 207 | if [ "$MVNW_VERBOSE" = true ]; then 208 | echo "Found .mvn/wrapper/maven-wrapper.jar" 209 | fi 210 | else 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 213 | fi 214 | if [ -n "$MVNW_REPOURL" ]; then 215 | jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 216 | else 217 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 218 | fi 219 | while IFS="=" read key value; do 220 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 221 | esac 222 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 223 | if [ "$MVNW_VERBOSE" = true ]; then 224 | echo "Downloading from: $jarUrl" 225 | fi 226 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 227 | if $cygwin; then 228 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 229 | fi 230 | 231 | if command -v wget > /dev/null; then 232 | if [ "$MVNW_VERBOSE" = true ]; then 233 | echo "Found wget ... using wget" 234 | fi 235 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 236 | wget "$jarUrl" -O "$wrapperJarPath" 237 | else 238 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" 239 | fi 240 | elif command -v curl > /dev/null; then 241 | if [ "$MVNW_VERBOSE" = true ]; then 242 | echo "Found curl ... using curl" 243 | fi 244 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 245 | curl -o "$wrapperJarPath" "$jarUrl" -f 246 | else 247 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 248 | fi 249 | 250 | else 251 | if [ "$MVNW_VERBOSE" = true ]; then 252 | echo "Falling back to using Java to download" 253 | fi 254 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 255 | # For Cygwin, switch paths to Windows format before running javac 256 | if $cygwin; then 257 | javaClass=`cygpath --path --windows "$javaClass"` 258 | fi 259 | if [ -e "$javaClass" ]; then 260 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 261 | if [ "$MVNW_VERBOSE" = true ]; then 262 | echo " - Compiling MavenWrapperDownloader.java ..." 263 | fi 264 | # Compiling the Java class 265 | ("$JAVA_HOME/bin/javac" "$javaClass") 266 | fi 267 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 268 | # Running the downloader 269 | if [ "$MVNW_VERBOSE" = true ]; then 270 | echo " - Running MavenWrapperDownloader.java ..." 271 | fi 272 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 273 | fi 274 | fi 275 | fi 276 | fi 277 | ########################################################################################## 278 | # End of extension 279 | ########################################################################################## 280 | 281 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 282 | if [ "$MVNW_VERBOSE" = true ]; then 283 | echo $MAVEN_PROJECTBASEDIR 284 | fi 285 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 286 | 287 | # For Cygwin, switch paths to Windows format before running java 288 | if $cygwin; then 289 | [ -n "$M2_HOME" ] && 290 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 291 | [ -n "$JAVA_HOME" ] && 292 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 293 | [ -n "$CLASSPATH" ] && 294 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 295 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 296 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 297 | fi 298 | 299 | # Provide a "standardized" way to retrieve the CLI args that will 300 | # work with both Windows and non-Windows executions. 301 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 302 | export MAVEN_CMD_LINE_ARGS 303 | 304 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 305 | 306 | exec "$JAVACMD" \ 307 | $MAVEN_OPTS \ 308 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 309 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 310 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 311 | -------------------------------------------------------------------------------- /demo/spring-cardb/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 124 | 125 | FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 127 | ) 128 | 129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 131 | if exist %WRAPPER_JAR% ( 132 | if "%MVNW_VERBOSE%" == "true" ( 133 | echo Found %WRAPPER_JAR% 134 | ) 135 | ) else ( 136 | if not "%MVNW_REPOURL%" == "" ( 137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 138 | ) 139 | if "%MVNW_VERBOSE%" == "true" ( 140 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 141 | echo Downloading from: %DOWNLOAD_URL% 142 | ) 143 | 144 | powershell -Command "&{"^ 145 | "$webclient = new-object System.Net.WebClient;"^ 146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 148 | "}"^ 149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ 150 | "}" 151 | if "%MVNW_VERBOSE%" == "true" ( 152 | echo Finished downloading %WRAPPER_JAR% 153 | ) 154 | ) 155 | @REM End of extension 156 | 157 | @REM Provide a "standardized" way to retrieve the CLI args that will 158 | @REM work with both Windows and non-Windows executions. 159 | set MAVEN_CMD_LINE_ARGS=%* 160 | 161 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 162 | if ERRORLEVEL 1 goto error 163 | goto end 164 | 165 | :error 166 | set ERROR_CODE=1 167 | 168 | :end 169 | @endlocal & set ERROR_CODE=%ERROR_CODE% 170 | 171 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 172 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 173 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 174 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 175 | :skipRcPost 176 | 177 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 178 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 179 | 180 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 181 | 182 | exit /B %ERROR_CODE% 183 | -------------------------------------------------------------------------------- /demo/spring-cardb/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.5.3 9 | 10 | 11 | com.packt 12 | cardatabase 13 | 0.0.1-SNAPSHOT 14 | cardatabase 15 | Demo project for Spring Boot 16 | 17 | 11 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-web 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-data-jpa 28 | 29 | 30 | com.h2database 31 | h2 32 | runtime 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-devtools 37 | runtime 38 | true 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-test 43 | test 44 | 45 | 46 | 47 | 48 | 49 | 50 | org.springframework.boot 51 | spring-boot-maven-plugin 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/java/com/packt/cardatabase/CardatabaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase; 2 | 3 | import java.util.Arrays; 4 | 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.CommandLineRunner; 9 | import org.springframework.boot.SpringApplication; 10 | import org.springframework.boot.autoconfigure.SpringBootApplication; 11 | 12 | import com.packt.cardatabase.domain.Car; 13 | import com.packt.cardatabase.domain.CarRepository; 14 | import com.packt.cardatabase.domain.Owner; 15 | import com.packt.cardatabase.domain.OwnerRepository; 16 | 17 | @SpringBootApplication 18 | public class CardatabaseApplication implements CommandLineRunner { 19 | private static final Logger logger = 20 | LoggerFactory.getLogger(CardatabaseApplication.class); 21 | 22 | @Autowired 23 | private CarRepository repository; 24 | 25 | 26 | @Autowired 27 | private OwnerRepository orepository; 28 | 29 | 30 | public static void main(String[] args) { 31 | SpringApplication.run(CardatabaseApplication.class, args); 32 | } 33 | 34 | @Override 35 | public void run(String... args) throws Exception { 36 | // Add owner objects and save these to db 37 | Owner owner1 = new Owner("John" , "Johnson"); 38 | Owner owner2 = new Owner("Mary" , "Robinson"); 39 | Owner owner3 = new Owner("A", "Nguyen Van"); 40 | orepository.saveAll(Arrays.asList(owner1, owner2, owner3)); 41 | 42 | // Add car object and link to owners and save these to db 43 | Car car1 = new Car("Ford", "Mustang", "Red", 44 | "ADF-1121", 2021, 59000, owner1); 45 | Car car2 = new Car("Nissan", "Leaf", "White", 46 | "SSJ-3002", 2019, 29000, owner2); 47 | Car car3 = new Car("Toyota", "Prius", "Silver", 48 | "KKO-0212", 2020, 39000, owner2); 49 | Car car4 = new Car("Ferrari", "Stradale", "Red", 50 | "SF90", 2022, 625000, owner3); 51 | Car car5 = new Car("Bentley", "Continental", "Silver", 52 | "GT", 2022, 223000, owner3); 53 | repository.saveAll(Arrays.asList(car1, car2, car3, car4, car5)); 54 | 55 | for (Car car : repository.findAll()) { 56 | logger.info(car.getBrand() + " " + car.getModel()); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/java/com/packt/cardatabase/domain/Car.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase.domain; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.FetchType; 5 | import javax.persistence.GeneratedValue; 6 | import javax.persistence.GenerationType; 7 | import javax.persistence.Id; 8 | import javax.persistence.JoinColumn; 9 | import javax.persistence.ManyToOne; 10 | 11 | @Entity 12 | public class Car { 13 | @Id 14 | @GeneratedValue(strategy=GenerationType.AUTO) 15 | private long id; 16 | private String brand, model, color, registerNumber; 17 | private int year, price; 18 | 19 | public Car() {} 20 | 21 | public Car(String brand, String model, String color, 22 | String registerNumber, int year, int price, Owner owner) { 23 | super(); 24 | this.brand = brand; 25 | this.model = model; 26 | this.color = color; 27 | this.registerNumber = registerNumber; 28 | this.year = year; 29 | this.price = price; 30 | this.owner = owner; 31 | } 32 | 33 | @ManyToOne(fetch = FetchType.LAZY) 34 | @JoinColumn(name = "owner") 35 | private Owner owner; 36 | 37 | //Getter and setter 38 | public Owner getOwner() { 39 | return owner; 40 | } 41 | 42 | public void setOwner(Owner owner) { 43 | this.owner = owner; 44 | } 45 | 46 | 47 | public long getId() { 48 | return id; 49 | } 50 | 51 | public void setId(long id) { 52 | this.id = id; 53 | } 54 | 55 | public String getBrand() { 56 | return brand; 57 | } 58 | 59 | public void setBrand(String brand) { 60 | this.brand = brand; 61 | } 62 | 63 | public String getModel() { 64 | return model; 65 | } 66 | 67 | public void setModel(String model) { 68 | this.model = model; 69 | } 70 | 71 | public String getColor() { 72 | return color; 73 | } 74 | 75 | public void setColor(String color) { 76 | this.color = color; 77 | } 78 | 79 | public String getRegisterNumber() { 80 | return registerNumber; 81 | } 82 | 83 | public void setRegisterNumber(String registerNumber) { 84 | this.registerNumber = registerNumber; 85 | } 86 | 87 | public int getYear() { 88 | return year; 89 | } 90 | 91 | public void setYear(int year) { 92 | this.year = year; 93 | } 94 | 95 | public int getPrice() { 96 | return price; 97 | } 98 | 99 | public void setPrice(int price) { 100 | this.price = price; 101 | } 102 | 103 | } 104 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/java/com/packt/cardatabase/domain/CarRepository.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase.domain; 2 | 3 | import org.springframework.data.repository.CrudRepository; 4 | 5 | public interface CarRepository extends CrudRepository { 6 | } 7 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/java/com/packt/cardatabase/domain/Owner.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase.domain; 2 | 3 | import java.util.List; 4 | 5 | import javax.persistence.CascadeType; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | 12 | @Entity 13 | public class Owner { 14 | @Id 15 | @GeneratedValue(strategy=GenerationType.AUTO) 16 | private long ownerid; 17 | private String firstname, lastname; 18 | 19 | public Owner() {} 20 | 21 | public Owner(String firstname, String lastname) { 22 | super(); 23 | this.firstname = firstname; 24 | this.lastname = lastname; 25 | } 26 | 27 | @OneToMany(cascade=CascadeType.ALL, mappedBy="owner") 28 | private List cars; 29 | 30 | public List getCars() { 31 | return cars; 32 | } 33 | 34 | public void setCars(List cars) { 35 | this.cars = cars; 36 | } 37 | 38 | public long getOwnerid() { 39 | return ownerid; 40 | } 41 | 42 | public void setOwnerid(long ownerid) { 43 | this.ownerid = ownerid; 44 | } 45 | 46 | public String getFirstname() { 47 | return firstname; 48 | } 49 | 50 | public void setFirstname(String firstname) { 51 | this.firstname = firstname; 52 | } 53 | 54 | public String getLastname() { 55 | return lastname; 56 | } 57 | 58 | public void setLastname(String lastname) { 59 | this.lastname = lastname; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/java/com/packt/cardatabase/domain/OwnerRepository.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase.domain; 2 | 3 | import org.springframework.data.repository.CrudRepository; 4 | 5 | public interface OwnerRepository extends CrudRepository { 6 | } 7 | -------------------------------------------------------------------------------- /demo/spring-cardb/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=jdbc:h2:mem:testdb 2 | spring.jpa.show-sql=true -------------------------------------------------------------------------------- /demo/spring-cardb/src/test/java/com/packt/cardatabase/CardatabaseApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.packt.cardatabase; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CardatabaseApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /first-cut/Ch01-TongQuan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Ch01-TongQuan.pdf -------------------------------------------------------------------------------- /first-cut/Ch02-MoiTruong&DuAn&YeuCau.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Ch02-MoiTruong&DuAn&YeuCau.pdf -------------------------------------------------------------------------------- /first-cut/Ch03-MoHinhHoaChucNang.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Ch03-MoHinhHoaChucNang.pdf -------------------------------------------------------------------------------- /first-cut/Ch04-MoHinhHoaCauTruc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Ch04-MoHinhHoaCauTruc.pdf -------------------------------------------------------------------------------- /first-cut/Ch05-MoHinhHoaHanhVi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Ch05-MoHinhHoaHanhVi.pdf -------------------------------------------------------------------------------- /first-cut/Tk1-KienTrucTongQuan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Tk1-KienTrucTongQuan.pdf -------------------------------------------------------------------------------- /first-cut/Tk4-CoSoDuLieu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Tk4-CoSoDuLieu.pdf -------------------------------------------------------------------------------- /first-cut/Tk5.1-MauThietKe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/first-cut/Tk5.1-MauThietKe.pdf -------------------------------------------------------------------------------- /old/20212-Ch01-TongQuan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/old/20212-Ch01-TongQuan.pdf -------------------------------------------------------------------------------- /old/20212-Ch02-MoHinhHoaChucNang.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/old/20212-Ch02-MoHinhHoaChucNang.pdf -------------------------------------------------------------------------------- /qb/baitap-phantich-thietke.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/baitap-phantich-thietke.pdf -------------------------------------------------------------------------------- /qb/cauhoi-tracnghiem.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/cauhoi-tracnghiem.pdf -------------------------------------------------------------------------------- /qb/it3120-2k3hk2-pub.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/it3120-2k3hk2-pub.pdf -------------------------------------------------------------------------------- /qb/it3120-pp-24-01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/it3120-pp-24-01.pdf -------------------------------------------------------------------------------- /qb/it3120E-2k4hk1a-pp.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/it3120E-2k4hk1a-pp.pdf -------------------------------------------------------------------------------- /qb/oosad-pp1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/oosad-pp1.pdf -------------------------------------------------------------------------------- /qb/oosad-pp2-1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/oosad-pp2-1.pdf -------------------------------------------------------------------------------- /qb/oosad-pp2-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/qb/oosad-pp2-2.pdf -------------------------------------------------------------------------------- /sdlc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bangoc/it3120/b482fc50a7fd98997324e7ce296966e7c4a61400/sdlc.pdf --------------------------------------------------------------------------------