Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра Автоматики Курсовая работа
по дисциплине программирование
Группа: АУ-04
Студент: Ананин В. В.
Проверил:
Новосибирск
2010
Курсовой проект
Проекты обязаны быть реализованы с использованием классов или готовых пакетов, построенных на основе объектно-ориентированного программирования. В зависимости от техники, к которой имеется доступ, в качестве таких пакетов могут быть использованы TVISION для Borland C++, Object Windows Library 1.0 или Object Windows Library 2.0 для Borland C++ или Visual C++ 6.0. Программа может выполнять любые функции, но студенты должны показать в ней умение пользоваться достаточно сложными библиотеками классов. В качестве таких программ могут быть предложены различные игры,
Объем программ должен быть таким, чтобы можно было показать овладение технологией объектно-ориентированного программирования, умение использовать библиотеки классов. Объем работы не ограничен сверху и определяется способностями и возможностями студентов по использованию вычислительной техники.
Примерные задания на курсовое проектирование.
Разработать графическую игру.
Разработать пользовательский интерфейс к файловой системе, включая манипулирование, просмотр и редактирование текстовых файлов.
Разработать программу визуализации табличных данных.
Разработать HTML-редактор с подсветкой тегов.
Разработать редактор электронных таблиц.
Разработать программу графического оформления текстовых объявлений.
Предпочтение отдается реальной тематике, определяемой интересами студента и согласуемой с преподавателем.
Правила игры:
Игроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 своих фигуры по вертикали, горизонтали или диагонали, выигрывает.
Реализация:
Игра реализуется с помощью трех классов: TForm – описывающий саму визуализацию игры, pole – рабочую область, и player – класс, определяющий игрока.
TForm содержит метод обновления поля для внесения изменений.
Pole – очистку поля для начала новой игры и проверку на наличие допустимых ходов.
Player – ходы игроков и одноименный конструктор для реализации возможности ввода имени реального игрока.
В ходе игры ведется небольшая игровая статистика: кол-во побед, поражений, исходов с результатом «ничья», общее число сыгранных партий. Все они после выполнения программы выгружаются через поток в текстовый документ.
Ходы компьютера не привязаны к анализу, то есть имеют интуитивно простой алгоритм: заполняется любая клетка из числа не содержащих другие элементы.
Листинг программы:
Main.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMForm *MForm;
pole pol;
player comp, human;
//---------------------------------------------------------------------------
//Методы рукописных классов
void player::hod()
{
bool flag=false;
while (flag==false)
{
randomize();
x=random(3);
y=random(3);
if (pol.pol[x][y]==0) {flag=true;pol.pol[x][y]=2;}
}
}
void pole::reset()
{
for (int i=0;i<3;++i)
for (int j=0;j<3;++j)
pol[i][j]=0;
}
void pole::check()
{
bool flag=true;//true - поле заполнено; false - можно еще играть
int win=0;//0-никто не выйграл;1-выйграли крестики;2-выйграли нолики
int s=0;
for (int i=0;i<3;++i)//проверка по горизонтали
{
for (int j=0;j<3;++j)if(pol[i][0]!=pol[i][j])s=1;
if ((s==0)&&(pol[i][0]==1)) win=1;
if ((s==0)&&(pol[i][0]==2)) win=2;
s=0;
}
for (int i=0;i<3;++i)//проверка по вертикали
{
for (int j=0;j<3;++j)if(pol[0][i]!=pol[j][i])s=1;
if ((s==0)&&(pol[0][i]==1)) win=1;
if ((s==0)&&(pol[0][i]==2)) win=2;
s=0;
}
for (int j=0;j<3;++j)if(pol[0][0]!=pol[j][j])s=1;//проверка по главной диагонали
if ((s==0)&&(pol[0][0]==1)) win=1;
if ((s==0)&&(pol[0][0]==2)) win=2;
s=0;
for (int j=0;j<3;++j)if(pol[2][0]!=pol[j][2-j])s=1;//проверка по побочной диагонали
if ((s==0)&&(pol[2][0]==1)) win=1;
if ((s==0)&&(pol[2][0]==2)) win=2;
s=0;
for (int i=0;i<3;++i)
for (int j=0;j<3;++j)
if (pol[i][j]==0) flag=false;
if((flag==true)&&(win==0))
{
++sdraw;
++sgame;
MForm->MoreGame->Enabled=true;
MForm->Gstatus->Caption="Ничья";
MForm->P11->Enabled=false;MForm->P12->Enabled=false;
MForm->P13->Enabled=false;MForm->P21->Enabled=false;
MForm->P22->Enabled=false;MForm->P23->Enabled=false;
MForm->P31->Enabled=false;MForm->P32->Enabled=false;
MForm->P33->Enabled=false;
}
if(win==1)
{
++shuman;
++sgame;
MForm->MoreGame->Enabled=true;
MForm->Gstatus->Caption="Победа";
MForm->P11->Enabled=false;MForm->P12->Enabled=false;
MForm->P13->Enabled=false;MForm->P21->Enabled=false;
MForm->P22->Enabled=false;MForm->P23->Enabled=false;
MForm->P31->Enabled=false;MForm->P32->Enabled=false;
MForm->P33->Enabled=false;
}
if(win==2)
{
++scomp;
++sgame;
MForm->MoreGame->Enabled=true;
MForm->Gstatus->Caption="FAIL";
MForm->P11->Enabled=false;MForm->P12->Enabled=false;
MForm->P13->Enabled=false;MForm->P21->Enabled=false;
MForm->P22->Enabled=false;MForm->P23->Enabled=false;
MForm->P31->Enabled=false;MForm->P32->Enabled=false;
MForm->P33->Enabled=false;
}
}
player::player()
{
name=new char[30];
}
player::~player()
{
delete[] name;
}
//---------------------------------------------------------------------------
TMForm::refresh()
{
Draw->Caption=pol.sdraw;
Kolgame->Caption=pol.sgame;
ScoreComp->Caption=pol.scomp;
ScoreHuman->Caption=pol.shuman;
switch (pol.pol[0][0])
{
case 0:P11->Caption="";break;
case 1:P11->Caption="X";break;
case 2:{P11->Caption="O";P11->Enabled=false;};break;
}
switch (pol.pol[0][1])
{
case 0:P12->Caption="";break;
case 1:P12->Caption="X";break;
case 2:{P12->Caption="O";P12->Enabled=false;};break;
}
switch (pol.pol[0][2])
{
case 0:P13->Caption="";break;
case 1:P13->Caption="X";break;
case 2:{P13->Caption="O";P13->Enabled=false;};break;
}
switch (pol.pol[1][0])
{
case 0:P21->Caption="";break;
case 1:P21->Caption="X";break;
case 2:{P21->Caption="O";P21->Enabled=false;};break;
}
switch (pol.pol[1][1])
{
case 0:P22->Caption="";break;
case 1:P22->Caption="X";break;
case 2:{P22->Caption="O";P22->Enabled=false;};break;
}
switch (pol.pol[1][2])
{
case 0:P23->Caption="";break;
case 1:P23->Caption="X";break;
case 2:{P23->Caption="O";P23->Enabled=false;};break;
}
switch (pol.pol[2][0])
{
case 0:P31->Caption="";break;
case 1:P31->Caption="X";break;
case 2:{P31->Caption="O";P31->Enabled=false;};break;
}
switch (pol.pol[2][1])
{
case 0:P32->Caption="";break;
case 1:P32->Caption="X";break;
case 2:{P32->Caption="O";P32->Enabled=false;};break;
}
switch (pol.pol[2][2])
{
case 0:P33->Caption="";break;
case 1:P33->Caption="X";break;
case 2:{P33->Caption="O";P33->Enabled=false;};break;
}
}
//---------------------------------------------------------------------------
__fastcall TMForm::TMForm(TComponent* Owner)
: TForm(Owner)
{
refresh();
MoreGame->Enabled=false;
randomize();
if (random(2)==0)comp.hod();
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P11Click(TObject *Sender)
{
if ( pol.pol[0][0]==0 ) pol.pol[0][0]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P11->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P12Click(TObject *Sender)
{
if ( pol.pol[0][1]==0 ) pol.pol[0][1]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P12->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P13Click(TObject *Sender)
{
if ( pol.pol[0][2]==0 ) pol.pol[0][2]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P13->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P21Click(TObject *Sender)
{
if ( pol.pol[1][0]==0 ) pol.pol[1][0]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P21->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P22Click(TObject *Sender)
{
if ( pol.pol[1][1]==0 ) pol.pol[1][1]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P22->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P23Click(TObject *Sender)
{
if ( pol.pol[1][2]==0 ) pol.pol[1][2]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P23->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P31Click(TObject *Sender)
{
if ( pol.pol[2][0]==0 ) pol.pol[2][0]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P31->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P32Click(TObject *Sender)
{
if ( pol.pol[2][1]==0 ) pol.pol[2][1]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P32->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::P33Click(TObject *Sender)
{
if ( pol.pol[2][2]==0 ) pol.pol[2][2]=1;
pol.check();
if (MoreGame->Enabled==false) {comp.hod();pol.check();}
P33->Enabled=false;
refresh();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::MoreGameClick(TObject *Sender)
{
pol.reset();
MForm->P11->Enabled=true;MForm->P12->Enabled=true;
MForm->P13->Enabled=true;MForm->P21->Enabled=true;
MForm->P22->Enabled=true;MForm->P23->Enabled=true;
MForm->P31->Enabled=true;MForm->P32->Enabled=true;
MForm->P33->Enabled=true;
randomize();
if (random(2)==0)comp.hod();
refresh();
MoreGame->Enabled=false;
Gstatus->Caption="";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::N4Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::N2Click(TObject *Sender)
{
randomize();
if (random(2)==0)comp.hod();
std::ofstream out("result.txt",std::ios::out);
out<<"Результаты последней игры:\n";
out<<"Компьютер:"<<pol.scomp<<"\n";
out<<"Игрок:"<<pol.shuman<<"\n";
out<<"Ничьих:"<<pol.sdraw<<"\n";
out<<"Всего игр:"<<pol.sgame;
out.close();
pol.reset();
pol.scomp=pol.sdraw=pol.shuman=pol.sgame=0;
refresh();
Gstatus->Caption="";
MoreGame->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TMForm::NameChange(TObject *Sender)
{
Pname->Caption=human.name=Name->Text.c_str();
Pname->Caption=Pname->Caption+":";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::FormCanResize(TObject *Sender, int &NewWidth,
int &NewHeight, bool &Resize)
{
P11->Left=ClientWidth*32/400;
P11->Top=ClientHeight*32/260;
P11->Width=ClientWidth*57/400;
P11->Height=ClientHeight*57/260;
P12->Left=ClientWidth*104/400;
P12->Top=ClientHeight*32/260;
P12->Width=ClientWidth*57/400;
P12->Height=ClientHeight*57/260;
P13->Left=ClientWidth*176/400;
P13->Top=ClientHeight*32/260;
P13->Width=ClientWidth*57/400;
P13->Height=ClientHeight*57/260;
P21->Left=ClientWidth*32/400;
P21->Top=ClientHeight*104/260;
P21->Width=ClientWidth*57/400;
P21->Height=ClientHeight*57/260;
P22->Left=ClientWidth*104/400;
P22->Top=ClientHeight*104/260;
P22->Width=ClientWidth*57/400;
P22->Height=ClientHeight*57/260;
P23->Left=ClientWidth*176/400;
P23->Top=ClientHeight*104/260;
P23->Width=ClientWidth*57/400;
P23->Height=ClientHeight*57/260;
P31->Left=ClientWidth*32/400;
P31->Top=ClientHeight*176/260;
P31->Width=ClientWidth*57/400;
P31->Height=ClientHeight*57/260;
P32->Left=ClientWidth*104/400;
P32->Top=ClientHeight*176/260;
P32->Width=ClientWidth*57/400;
P32->Height=ClientHeight*57/260;
P33->Left=ClientWidth*176/400;
P33->Top=ClientHeight*176/260;
P33->Width=ClientWidth*57/400;
P33->Height=ClientHeight*57/260;
Label1->Left=ClientWidth*264/400;
Label1->Top=ClientHeight*32/260;
Label1->Width=ClientWidth*61/400;
Label1->Height=ClientHeight*16/260;
ScoreComp->Left=ClientWidth*336/400;
ScoreComp->Top=ClientHeight*32/260;
ScoreComp->Width=ClientWidth*6/400;
ScoreComp->Height=ClientHeight*13/260;
Pname->Left=ClientWidth*291/400;
Pname->Top=ClientHeight*48/260;
Pname->Width=ClientWidth*34/400;
Pname->Height=ClientHeight*13/260;
ScoreHuman->Left=ClientWidth*336/400;
ScoreHuman->Top=ClientHeight*48/260;
ScoreHuman->Width=ClientWidth*6/400;
ScoreHuman->Height=ClientHeight*13/260;
Label3->Left=ClientWidth*291/400;
Label3->Top=ClientHeight*64/260;
Label3->Width=ClientWidth*34/400;
Label3->Height=ClientHeight*13/260;
Draw->Left=ClientWidth*336/400;
Draw->Top=ClientHeight*64/260;
Draw->Width=ClientWidth*6/400;
Draw->Height=ClientHeight*13/260;
Label4->Left=ClientWidth*272/400;
Label4->Top=ClientHeight*80/260;
Label4->Width=ClientWidth*53/400;
Label4->Height=ClientHeight*13/260;
Kolgame->Left=ClientWidth*336/400;
Kolgame->Top=ClientHeight*80/260;
Kolgame->Width=ClientWidth*6/400;
Kolgame->Height=ClientHeight*13/260;
MoreGame->Left=ClientWidth*264/400;
MoreGame->Top=ClientHeight*120/260;
MoreGame->Width=ClientWidth*89/400;
MoreGame->Height=ClientHeight*25/260;
Name->Left=ClientWidth*280/400;
Name->Top=ClientHeight*208/260;
Name->Width=ClientWidth*73/400;
Name->Height=ClientHeight*21/260;
Gstatus->Left=ClientWidth*112/400;
Gstatus->Top=ClientHeight*104/260;
}
Main.h
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
//---------------------------------------------------------------------------
class TMForm : public TForm
{
__published: // IDE-managed Components
TLabel *P11;
TLabel *P12;
TLabel *P13;
TLabel *P21;
TLabel *P22;
TLabel *P23;
TLabel *P31;
TLabel *P32;
TLabel *P33;
TLabel *Label1;
TLabel *Pname;
TLabel *Label3;
TLabel *Label4;
TLabel *ScoreComp;
TLabel *ScoreHuman;
TLabel *Draw;
TLabel *Kolgame;
TButton *MoreGame;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TEdit *Name;
TLabel *Gstatus;
void __fastcall P11Click(TObject *Sender);
void __fastcall P12Click(TObject *Sender);
void __fastcall P13Click(TObject *Sender);
void __fastcall P21Click(TObject *Sender);
void __fastcall P22Click(TObject *Sender);
void __fastcall P23Click(TObject *Sender);
void __fastcall P31Click(TObject *Sender);
void __fastcall P32Click(TObject *Sender);
void __fastcall P33Click(TObject *Sender);
void __fastcall MoreGameClick(TObject *Sender);
void __fastcall N4Click(TObject *Sender);
void __fastcall N2Click(TObject *Sender);
void __fastcall NameChange(TObject *Sender);
void __fastcall FormCanResize(TObject *Sender, int &NewWidth,
int &NewHeight, bool &Resize);
private: // User declarations
public: // User declarations
refresh();//обновляем игровое поле
__fastcall TMForm(TComponent* Owner);
};
class pole
{
public:
int pol [3][3];//массив игровое поле 0-пусто,1-крестик,2-нолик
int scomp,shuman,sdraw,sgame;//число побед компа/игрока
//, число ничьих и общее число игр
void reset();//обнуляем поле
void check();//true - поле заполнено; false - можно еще играть
};
class player
{
public:
int x,y;//координаты последнего хода
char* name;
void hod();
player();
~player();
};
//---------------------------------------------------------------------------
extern PACKAGE TMForm *MForm;
//---------------------------------------------------------------------------
#endif#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TGroupBox *GroupBox2;
TGroupBox *GroupBox3;
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TButton *Button1;
TButton *Button2;
TLabel *Label7;
TLabel *Label8;
TEdit *Edit5;
TEdit *Edit6;
TShape *Shape1;
TShape *Shape2;
TTimer *Timer1;
TGroupBox *GroupBox4;
TLabel *Label9;
void __fastcall FormPaint(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif