Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Крестики Нолики, Крестики Нолики (algoritm) 
:(
    Опции темы
Just_Girl
Дата 6.8.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Привет всем! 
Помогите докончить игру на Jave: крестики-нолики. 
Вроде игра кажется такой лёгкой!!! Я начала, но что-то дело дальше не идёт, не получается. :( Может я не в ту степь программирую?! :( 
Так что если кто чем-то может помочь, буду очень благодарна.


Здесь мой код:

Код


/*
 * MainFrame.java
 *
 * Created on 26 juli 2007, 23:06
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package krestikinoliki;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import javax.swing.*;
/**
 *
 * @author Ka.
 * @versie 0.1
 */
public class MainFrame extends JFrame
{
    
    private JTextField[][] textFields;
    private ImageButton btnOk;
    private ImageButton btnClear;
    private JLabel lblUitslag;
    
    public static final String KRESTIK = "x";
    public static final String NOLIK = "o";
    public static final String LEEG = " ";
    
    private int uitslag = 0;
    private int turn = 1;
    private String s;
    
    /** Creates a new instance of MainFrame */
    public MainFrame()
    {
        setTitle("Krestiki Noliki - 2007");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setBounds(300, 200, 250, 300);
        setResizable(false);
        initComponents();
        
        
        setVisible(true);
        
    }
    
    public void MainFrame()
    {
        this.uitslag = uitslag;
        this.s = s;
        this.turn = turn;
    }
    
    
    void initComponents()
    {
        textFields = new JTextField[3][3];
        
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<3; j++)
            {
                textFields[i][j] = new JTextField();
                textFields[i][j].setBounds(55+j*46, 55+i*46, 45, 45);
                textFields[i][j].setBackground(Color.getHSBColor(4.50f, 1.15f, 0.9f));
                textFields[i][j].setForeground(Color.getHSBColor(4.555f, 2.1f, 3.555f));
                textFields[i][j].setHorizontalAlignment(JTextField.CENTER);
                textFields[i][j].setFont(new Font("Arial", 3, 21));
                add(textFields[i][j]);
                
            }
            
        }
        lblUitslag = new JLabel("Uitslag: ");
        lblUitslag.setBounds(55, 10, 100, 50);
        lblUitslag.setForeground(Color.getHSBColor(4.55f, 2.0f, 3.555f));
        lblUitslag.setFont(new Font("Arial", 3, 13));
        add(lblUitslag);
        
        btnOk = new ImageButton("ok-up.png", "ok-down.png", 66, 66);
        btnOk.setBounds(56, 208, 66, 66);
        add(btnOk);
        
        btnOk.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    int i = 0;
                    int j = 0;
                    isSolved();
                    turn++;
                    if (turn == 2)
                    {
                        setValues(i, j, NOLIK);
                        isSolved();
                        turn--;
                    }
                    i++;
                    j++;

                }
                catch (Exception ex)
                {
                    // { System.out.println("Exception: " + ex.getMessage());}
                }
            }
        });
        
        btnClear = new ImageButton("clear-up.png", "clear-down.png", 66, 66);
        btnClear.setBounds(124, 208, 66, 66);
        add(btnClear);
        
        btnClear.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                clear();
            }
        });
    }
    
    // Zet values in textFields
    public void setValues(int i, int j, String s)
    {
        textFields[i][j].setText(s);
    }
    
    
    
    // Maakt textFields leeg
    public void clear()
    {
        for (int i  = 0;  i < 3;  i++)
        {
            for (int j = 0;  j < 3; j++)
            {
                textFields[i][j].setText("");
                uitslag = 0;
            }
        }
    }
    
    // Controleert of je gewonnen hebt
    public void isSolved()
    {
        
        for (int j = 0; j <= 2; j++)
        {
            for (int i = 0; i <= 2; i++)
            {
                
                if ( ((textFields[i][j].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j].getText().equals(KRESTIK)) ) ||
                        ((textFields[i][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+1].getText().equals(KRESTIK))) ||
                        ((textFields[i][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+2].getText().equals(KRESTIK))) ||
                        (textFields[i][j].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+2].getText().equals(KRESTIK)) ||
                        (textFields[i][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j].getText().equals(KRESTIK)) )
                    {
                    uitslag++;
                    lblUitslag.getText();
                    lblUitslag.setText("Uitslag: " + (String.valueOf(uitslag)) + " - " + "0");
                    String messageText = "U hebt Gewonnen!!!\n\n\n";
                    JOptionPane.showMessageDialog(MainFrame.this, messageText, "Message",
                            JOptionPane.INFORMATION_MESSAGE
                            );
                }
                else if  ( (textFields[i][j].getText().equals(NOLIK)) &&
                        (textFields[i+1][j].getText().equals(NOLIK)) &&
                        (textFields[i+2][j].getText().equals(NOLIK)) ||
                        (textFields[i][j+1].getText().equals(NOLIK)) &&
                        (textFields[i+1][j+1].getText().equals(NOLIK)) &&
                        (textFields[i+2][j+1].getText().equals(NOLIK)) ||
                        (textFields[i][j+2].getText().equals(NOLIK)) &&
                        (textFields[i+1][j+2].getText().equals(NOLIK)) &&
                        (textFields[i+2][j+2].getText().equals(NOLIK)) )
                {
                    uitslag++;
                    lblUitslag.getText();
                    lblUitslag.setText("Uitslag: " + "0" + " - " +(String.valueOf(uitslag)));
                    String messageText = "U hebt Verloren!!!\n\n\n";
                    JOptionPane.showMessageDialog(MainFrame.this, messageText, "Message",
                            JOptionPane.INFORMATION_MESSAGE
                            );
                }
                else
                {
                    System.out.println("Volgende stap!!!");
                }
            }
            
        }
        
    }
    
    
    //Player two
//    public void playerTwo()
//    {
//        int i = 1, j = 0;
//        while(true)
//        {
//               
//        if (turn == 0)
//        {
//            turn = 1;
//            isSolved();
//            turn++;
//        }
//        else if (turn == 2)
//        {
//            setValues(i, j, NOLIK);
//            isSolved();
//            i++;
//            j++;
//        }
//        }
//    }
    
    
    public static void main(String[] args)
    {
        new MainFrame();
    }
    
    
}





PM MAIL   Вверх
ecologist
Дата 7.8.2007, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



Во-первых - код не собирается - там используется ImageButton, которого нет в стандартной JDK - а искать по Инету, что там имелось в виду ...

Во-вторых - разбираться где ошибка - это слишком много времени требует. Лучше спрашивать конкретно - то-то не работает и что делать. А так - по сути это предложение написать программу - не многие согласятся потратить на это несколько часов.

В-третьих -я кое-что исправил и программа поехала, но что в ней надо - я не понял.

Код

/*
 * MainFrame.java
 *
 * Created on 26 juli 2007, 23:06
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import javax.swing.*;
/**
 *
 * @author Ka.
 * @versie 0.1
 */
public class MainFrame extends JFrame
{
    
    private JTextField[][] textFields;
    private JButton btnOk;
    private JButton btnClear;
    private JLabel lblUitslag;
    
    public static final String KRESTIK = "x";
    public static final String NOLIK = "o";
    public static final String LEEG = " ";
    
    private int uitslag = 0;
    private int turn = 1;
    private String s;
    
    /** Creates a new instance of MainFrame */
    public MainFrame()
    {
        setTitle("Krestiki Noliki - 2007");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setBounds(300, 200, 250, 300);
        setResizable(false);
        initComponents();
        
        
        setVisible(true);
        
    }
    
    public void MainFrame()
    {
        this.uitslag = uitslag;
        this.s = s;
        this.turn = turn;
    }
    
    
    void initComponents()
    {
        textFields = new JTextField[3][3];
        
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<3; j++)
            {
                textFields[i][j] = new JTextField();
                textFields[i][j].setBounds(55+j*46, 55+i*46, 45, 45);
                textFields[i][j].setBackground(Color.getHSBColor(4.50f, 1.15f, 0.9f));
                textFields[i][j].setForeground(Color.getHSBColor(4.555f, 2.1f, 3.555f));
                textFields[i][j].setHorizontalAlignment(JTextField.CENTER);
                textFields[i][j].setFont(new Font("Arial", 3, 21));
                add(textFields[i][j]);
                
            }
            
        }
        lblUitslag = new JLabel("Uitslag: ");
        lblUitslag.setBounds(55, 10, 100, 50);
        lblUitslag.setForeground(Color.getHSBColor(4.55f, 2.0f, 3.555f));
        lblUitslag.setFont(new Font("Arial", 3, 13));
        add(lblUitslag);
        
        //btnOk = new ImageButton("ok-up.png", "ok-down.png", 66, 66);
        btnOk = new JButton("OK");
        btnOk.setBounds(56, 208, 66, 66);
        add(btnOk);
        
        btnOk.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    int i = 0;
                    int j = 0;
                    isSolved();
                    turn++;
                    if (turn == 2)
                    {
                        setValues(i, j, NOLIK);
                        isSolved();
                        turn--;
                    }
                    i++;
                    j++;
                }
                catch (Exception ex)
                {
                    // { System.out.println("Exception: " + ex.getMessage());}
                }
            }
        });
        
        //btnClear = new ImageButton("clear-up.png", "clear-down.png", 66, 66);
        btnClear = new JButton("Clear");
        btnClear.setBounds(124, 208, 66, 66);
        add(btnClear);
        
        btnClear.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                clear();
            }
        });
    }
    
    // Zet values in textFields
    public void setValues(int i, int j, String s)
    {
        textFields[i][j].setText(s);
    }
    
    
    
    // Maakt textFields leeg
    public void clear()
    {
        for (int i  = 0;  i < 3;  i++)
        {
            for (int j = 0;  j < 3; j++)
            {
                textFields[i][j].setText("");
                uitslag = 0;
            }
        }
    }
    
    // Controleert of je gewonnen hebt
    public void isSolved()
    {
        
        for (int j = 0; j <= 2; j++)
        {
            for (int i = 0; i <= 2; i++)
            {
                
                if ( ((textFields[i][j].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j].getText().equals(KRESTIK)) ) ||
                        ((textFields[i][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+1].getText().equals(KRESTIK))) ||
                        ((textFields[i][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+2].getText().equals(KRESTIK))) ||
                        (textFields[i][j].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j+2].getText().equals(KRESTIK)) ||
                        (textFields[i][j+2].getText().equals(KRESTIK)) &&
                        (textFields[i+1][j+1].getText().equals(KRESTIK)) &&
                        (textFields[i+2][j].getText().equals(KRESTIK)) )
                    {
                    uitslag++;
                    lblUitslag.getText();
                    lblUitslag.setText("Uitslag: " + (String.valueOf(uitslag)) + " - " + "0");
                    String messageText = "U hebt Gewonnen!!!\n\n\n";
                    JOptionPane.showMessageDialog(MainFrame.this, messageText, "Message",
                            JOptionPane.INFORMATION_MESSAGE
                            );
                }
                else if  ( (textFields[i][j].getText().equals(NOLIK)) &&
                        (textFields[i+1][j].getText().equals(NOLIK)) &&
                        (textFields[i+2][j].getText().equals(NOLIK)) ||
                        (textFields[i][j+1].getText().equals(NOLIK)) &&
                        (textFields[i+1][j+1].getText().equals(NOLIK)) &&
                        (textFields[i+2][j+1].getText().equals(NOLIK)) ||
                        (textFields[i][j+2].getText().equals(NOLIK)) &&
                        (textFields[i+1][j+2].getText().equals(NOLIK)) &&
                        (textFields[i+2][j+2].getText().equals(NOLIK)) )
                {
                    uitslag++;
                    lblUitslag.getText();
                    lblUitslag.setText("Uitslag: " + "0" + " - " +(String.valueOf(uitslag)));
                    String messageText = "U hebt Verloren!!!\n\n\n";
                    JOptionPane.showMessageDialog(MainFrame.this, messageText, "Message",
                            JOptionPane.INFORMATION_MESSAGE
                            );
                }
                else
                {
                    System.out.println("Volgende stap!!!");
                }
            }
            
        }
        
    }
    
    
    //Player two
//    public void playerTwo()
//    {
//        int i = 1, j = 0;
//        while(true)
//        {
//               
//        if (turn == 0)
//        {
//            turn = 1;
//            isSolved();
//            turn++;
//        }
//        else if (turn == 2)
//        {
//            setValues(i, j, NOLIK);
//            isSolved();
//            i++;
//            j++;
//        }
//        }
//    }
    
    
    public static void main(String[] args)
    {
        new MainFrame();
    }
    
    
}

PM MAIL   Вверх
niasilil
Дата 7.8.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Почти все работает как планировалось. гы
Надо только подправить метод isSolved, добавить проверок. Можно даже вручную вбить все проверки, без всяких циклов. Либо сделать с одним циклом, проверка всех столбцов и строчек. 

Это сообщение отредактировал(а) niasilil - 7.8.2007, 09:40


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
Just_Girl
Дата 7.8.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Дело в том, что он у меня нолики автоматично не ставит. А ImageButton я сама сделала, ет просто чтоб стирать, или нажав на старт, чтоб нолики ставились.
PM MAIL   Вверх
LSD
Дата 7.8.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Just_Girl, в состав JDK входит апплет TicTacToe где реализована логика игры. Можешь взять ее оттуда.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Just_Girl
Дата 8.8.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Здесь весь мой код:



Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  BoterKaasEiren.rar 112,70 Kb
PM MAIL   Вверх
AntonSaburov
Дата 8.8.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Just_Girl @  8.8.2007,  12:44 Найти цитируемый пост)
Здесь весь мой код:

И что с ним надо делать ? smile

Я попробовал Ant запустить - свалился. Да и неужели это все написано руками ? Потому как при таком уровне вопросы обычно задают иные.
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 8.8.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(Just_Girl @  7.8.2007,  11:23 Найти цитируемый пост)
Дело в том, что он у меня нолики автоматично не ставит. А ImageButton я сама сделала, ет просто чтоб стирать, или нажав на старт, чтоб нолики ставились.

if(был поставлен крестик)
{
 ставим нолик
}
не понятно, что именно тебе непонятно  smile 
напиши поконкретнее.


LSD, по моему там алгоритма как такового нет(TicTacToe). просто просчитаны ходы, так как их не много(всего 9 максимум). или не так?
я вообще то не очень понял...   smile 
PM MAIL   Вверх
LSD
Дата 10.8.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(dorogoyIV @  8.8.2007,  17:34 Найти цитируемый пост)
LSD, по моему там алгоритма как такового нет(TicTacToe). просто просчитаны ходы, так как их не много(всего 9 максимум). или не так?

Да вроде, но в любом случае он хорошо играет (мне выиграть не удалось).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Just_Girl
  Дата 10.8.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



Цитата

Я попробовал Ant запустить - свалился. Да и неужели это все написано руками ? Потому как при таком уровне вопросы обычно задают иные. 



AntonSaburov  понимаешь, это всё написано руками, кстати сама написала!!! 
Просто я программирую не так давно и с алгоритмами у меня как то не очень пока получается. Затрудняюсь..... Ну а что касается GUI, то нет проблем, а алгоритм же важнее..................




Добавлено через 4 минуты и 6 секунд
Цитата

не понятно, что именно тебе непонятно   
напиши поконкретнее.



Мне не понятно, как он должен места ноликам выбирать. Компютер же тоже должен пробовать выиграть у меня.... smile






PM MAIL   Вверх
dorogoyIV
Дата 10.8.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



например:
X|_|_
_|O|_
X| | 

ты крестик, комп нолик.
твой первый ход.
первый ход компа желательно в центр или в угол, это делаешь случайный выбор (Random например).
потом смотришь координаты крестика, если х1=х2 или у1=у2 
(первый крестик setLocation(х1,у1), второй (х2,у2)), 
комп ставит нолик с координатой х или у.
здесь в примере у крестиков равны координаты х (х1=х2).
ну и так далее...
PM MAIL   Вверх
AntonSaburov
Дата 10.8.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Может тогда проще в алгоритмах спросить - там люди может больше знают. Или в гугле поискать.
PM MAIL WWW ICQ   Вверх
nornad
Дата 10.8.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Just_Girl, принцип крестиков-ноликов довольно прост. Можно, конечно, в лоб решить задачу, но луше использовать принцип магического квадрата. Тогда для проверки хватит перебора имеющихся значений на предмет возможности получения необходимой суммы с одним из оставшихся чисел (каждому квадрату присваивается своё число так, чтобы любая линия из трёх квадратов в сумме давала одно и то же число).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.