2.7.1任务描述
本任务是对“媒体播放器”的项目进行总结和测评,小组总结各自项目的长处与不足,小组成员总结自己在项目完成过程期间的成败得失,教师对项目进行最后点评与总结。测评的方式采用小组内自评、组间互评、教师总评相结合。
2.7.2任务目的
本任务的目的完成项目的总结和测评,通过完成本次任务,可以帮组学生掌握项目总结与测评的方法,提高学生文档书写能力,积累学习经验,为以后学习做准备,加强学生团队协作和与人沟通的能力。养成自我评价与学习他人的良好风气。
2.7.3任务实现
游戏设计与实践是一项复杂而庞大的工作,在选题之后,意识到过程的艰难,因为以前从来都没有接触过游戏设计,刚开始有点迷茫和彷徨。后来通过翻阅书籍和在网上查阅资料,逐渐找到了一些感觉,在老师的指导下,自己也手动编写了几个简单的游戏,打地鼠游戏和网络N子棋双人对战游戏,本文以连连看游戏为例予以说明。
本次设计初步懂得了电子游戏涉及到的有关技术、方法,包括电子游戏选题、构思、设计步骤等。并实现一些可演示的游戏软件,其中有很多应用了学习的相关技术,并且做到了界面、声音都能实际演示。此次设计过程中印象最深的收获有:1、学到了很多新知识,并且对老知识进行了回顾。经过长时间的学习,更进一步熟悉了Qt编程、通过不断上机实验,调试程序,总结经验,从对课题的不理解到能够开始动手去做,提出新问题并自己想办法去解决问题,自己多实践,所以增强了动手能力。2、提高了中、英文资料的检索能力。这次毕业设计过程中查阅了多资料,包括一些期刊、杂志,还有网络中的电子文档、电子书籍、网页及下载的视频教学课程;不但有中文资料还有英文资料。这些资料,眼界更开阔,对课题的认识更加深刻,编写程序的时候思路更加清楚,少走了很多弯路。
回顾此次设计过程,学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩张了本专业的知识面,同时也体验到了搞软件开发的难度。在这次设计的同时,由于对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,有些功能还不能够完全的实现,如播放背景音乐时,只能播放一遍,因为游戏Qt类库中封装的东西太多,有些函数它底层的具体实现可能还没有真正的理解,所以,这也许就是本次游戏设计的不足之处。
项目二相关代码:
Mainwindow.cpp
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <QScrollBar>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"udp.h"
#include<QImage>
#include <Qtime>
#include "llk.h"
#include<iostream>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this,SIGNAL(recvMessage(QString,QString)), this,SLOT(onRecvMessage(QString,QString)));
//this->setCentralWidget(link);
//link->setMaximumSize(300,300);
ui->editChatRec->setReadOnly(true);
// link = new llk();
size=6;
isLinkE = false;
sendMessage("192.168.3.255",8838,"o192.168.3.117",true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::on_btnSend_clicked()
{
QString string =ui->lineEdit->text();
if(ui->radiosingle->isChecked()==true)
{
sendMessage(string,8838,'c'+ ui->editChat->text(),true);
}
else
{
string ="192.168.3.255";
sendMessage("192.168.3.255",8838,'c' +ui->editChat->text(),true);
}
QString str =trUtf8("自己对")+ string +trUtf8("发送:") + "\n"+ ui->editChat->text();
ui->editChatRec->setPlainText(ui->editChatRec->toPlainText()+" \n" +str);
ui->editChat->clear();
QScrollBar *bar =ui->editChatRec->verticalScrollBar();
bar->setSliderPosition(bar->maximum());
}
Ui::MainWindow* MainWindow::getUi()
{
return ui;
}
void MainWindow::onRecvMessage(QString msg, QString ipAdd)
{
//
QString time = Qtime::currentTime().toString();
QString string =time +"\n" +QString(trUtf8("收到来自")) + ipAdd +trUtf8(":的消息:") + "\n" + msg.right(msg.length()-1);
switch(msg.at(0).toAscii())
{
case 'o': //如果接受的是上线消息
ui->listWidget->addItem(msg.right(msg.length()-1));
break;
default: //如果接受的是普通消息
ui->editChatRec->setPlainText(ui->editChatRec->toPlainText()+"\n" + string);
break;
}
QScrollBar *bar =ui->editChatRec->verticalScrollBar();
bar->setSliderPosition(bar->maximum());
}
void MainWindow::on_action_begin_triggered()
{
/* link=new llk();
link->setsize(6);
link->arrayInit(6);
link->Create(6);
link->show();
isLinkE = true;*/
// size=4;
if(isLinkE)
{
//link=new llk();
//link->setsize(8);
// link->arrayInit(8);
//link->Create(8);
link->close();
isLinkE = false;
}
else
{
link=new llk();
link->setsize(size);
link->arrayInit(size);
link->Create(size);
link->show();
isLinkE = true;
}
if(isLinkE==false)
{
link=new llk();
link->setsize(size);
link->arrayInit(size);
link->Create(size);
link->show();
isLinkE = true;
}
}
void MainWindow::on_action_close_triggered()
{
this->close();
link->close();
}
void MainWindow::on_action_pause_triggered()
{
if(isLinkE)
link->setEnabled(false);
}
void MainWindow::on_action_return_triggered()
{
link->setEnabled(true);
}
void MainWindow::on_action_easy_triggered()
{
size=6;
if(isLinkE)
{
//link=new llk();
//link->setsize(8);
// link->arrayInit(8);
//link->Create(8);
link->close();
isLinkE = false;
}
else
{
link=new llk();
link->setsize(6);
link->arrayInit(6);
link->Create(6);
link->show();
isLinkE = true;
}
if(isLinkE==false)
{
link=new llk();
link->setsize(6);
link->arrayInit(6);
link->Create(6);
link->show();
isLinkE = true;
}
}
void MainWindow::on_action_soso_triggered()
{
size=8;
/*llk *lin;
lin = new llk();
//this->setCentralWidget(lin);
//lin->setGeometry(30,30,500,500);
lin->setsize(8);
lin->arrayInit(8);
lin->Create(8);
lin->setVisible(true);
lin->close();*/
if(isLinkE)
{
//link=new llk();
//link->setsize(8);
// link->arrayInit(8);
//link->Create(8);
link->close();
isLinkE = false;
}
else
{
link=new llk();
link->setsize(8);
link->arrayInit(8);
link->Create(8);
link->show();
isLinkE = true;
}
if(isLinkE==false)
{
link=new llk();
link->setsize(8);
link->arrayInit(8);
link->Create(8);
link->show();
isLinkE = true;
}
}
void MainWindow::on_action_diffcult_triggered()
{
size=10;
/*llk *lin;
lin = new llk();
//this->setCentralWidget(lin);
//lin->setGeometry(30,30,500,500);
lin->setsize(8);
lin->arrayInit(8);
lin->Create(8);
lin->setVisible(true);
lin->close();*/
if(isLinkE)
{
//link=new llk();
//link->setsize(8);
// link->arrayInit(8);
//link->Create(8);
link->close();
isLinkE = false;
}
else
{
link=new llk();
link->setsize(10);
link->arrayInit(10);
link->Create(10);
link->show();
isLinkE = true;
}
if(isLinkE==false)
{
link=new llk();
link->setsize(10);
link->arrayInit(10);
link->Cre
mybutton.cpp
#include "mybutton.h"
MyButton::MyButton(int value, QWidget *parent)
{
this->value = value;
this->setParent(parent);
QObject::connect(this,SIGNAL(clicked()),this,SLOT(mySlot()));
}
void MyButton::mySlot()
{
emit myClicked(this->value);
}
Main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtGui/QApplication>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <string>
using namespace std;
const unsigned int MAXBUF = 1024;
void* thd_handler(void* window)
{
MainWindow*w=(MainWindow*)window;
int sockfd;
struct sockaddr_in my_addr;
socklen_t addrlen;
char buffer[MAXBUF];
unsigned int myport = 8838;
printf("serverstarted!\n");
//create a socket for udp
if((sockfd =socket(AF_INET,SOCK_DGRAM,0)) < 0) //attention
{
perror("socket creationfailure");
exit(errno);
}
//initialize sockaddr_in
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port =htons(myport);
my_addr.sin_addr.s_addr =INADDR_ANY;
//bind
if(bind(sockfd,(structsockaddr*)&my_addr
,sizeof(structsockaddr)) == -1)
{
perror("bindfailure");
exit(errno);
}
printf("bindsuccess\n");
addrlen = sizeof(structsockaddr);
while(true)
{
bzero(buffer,MAXBUF);
int len = recvfrom(sockfd,buffer, MAXBUF, 0
,(sockaddr*)&my_addr, &addrlen);
if (len < 0) {
perror("recvfrom");
exit(errno);
}
emitw->recvMessage(QObject::trUtf8(buffer),inet_ntoa(my_addr.sin_addr));
}
//close connection
close(sockfd);
}
int main(int argc, char *argv[])
{
pthread_t ntid;
QApplication a(argc, argv);
MainWindow w;
pthread_create(&ntid,NULL,thd_handler,&w);
w.show();
return a.exec();
}
udp.cpp
#include"udp.h"
#include<QString>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
void sendMessage(QStringipAddress,unsigned int port,QString msg,bool isBroad)
{
// const unsigned int MAXBUF = 1024;
int sockfd;
int addr_len;
int len;
struct sockaddr_in dest;
//char buffer[MAXBUF];
char addr[16] ;
strcpy(addr,ipAddress.toAscii());
//create a socket for udp
if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0) //attention
{
perror("socket creationfailure");
exit(errno);
}
if(isBroad)
{
int broad=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&broad,sizeof(broad));
strcpy(addr,"192.168.3.255");
}
//initialize sockaddr_in
bzero(&dest,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons( port);
if(inet_aton(addr,(struct in_addr*)&dest.sin_addr)==0)
{
perror("ip address format iserror");
exit(errno);
}
//send msg to server
addr_len = sizeof(dest);
// bzero(buffer,MAXBUF);
len = sendto(sockfd, msg.toLocal8Bit(), msg.toLocal8Bit().length(), 0
,(sockaddr*)&dest,addr_len);
if (len < 0)
{
printf("\n\rsend error.\n\r");
exit(errno);
}
//close connection
::close(sockfd);
}
llk.cpp
#include "llk.h"
#include<iostream>
#include"judge.h"
llk::llk()
{
isFirstClick = true;
llk::createBtnRerank();
size=6;llk::createCurrentProgressBar(size);
timer = new Qtimer();
currentTime=0;
QObject::connect(timer,SIGNAL(timeout()),this,SLOT(timeProcess()));
}
void llk::xxx(int x)
{
clear(x);
// std::cout<<x<<std::endl;
// mybutton[x]->setVisible(false);
// Widget::arrayInit(6);
// progressBar[1]->setValue(20);
}
void llk::addPic(QString path,inti)
{
labelPic[i] = new QLabel(this);
labelPic[i]->setGeometry(i*100+5,30,100,120);
QPixmap pixmap(path);
labelPic[i]->setPixmap(path);
labelPic[i]->setVisible(false);
progressBar[i] = new QProgressBar();
progressBar[i]->setGeometry(i*100+10,120,100,20);
progressBar[i]->setParent(this);
progressBar[i]->setValue(10);
}
void llk::Create(int size)
{
createTimeProcessBar(size*size);
timer->start(1000);
charss[26][20]={"begin","./icon/icon1.png","./icon/icon2.png","./icon/icon3.png","./icon/icon4.png","./icon/icon5.png",
"./icon/icon6.png",
"./icon/icon7.png","./icon/icon8.png","./icon/icon9.png","./icon/icon10.png",
"./icon/icon11.gif","./icon/icon12.gif","./icon/icon13.gif","./icon/icon14.gif",
"./icon/icon15.gif","./icon/icon16.gif","./icon/icon17.gif","./icon/icon18.gif"
,"./icon/icon19.gif","./icon/icon20.gif","./icon/icon21.gif","./icon/icon22.gif","./icon/icon23.gif"
,"./icon/icon24.gif","./icon/icon25.gif"};
createCurrentProgressBar(size);
currentIndex=size*size;
progressBarCurrent->setValue(0);
for(unsigned int i=0;i<size*size;i++)
{
mybutton[i] = new MyButton(i,this);
mybutton[i]->setGeometry(20+i%size*60,150+i/size*60,60,60);
int x,y;
x=i/size+1;
if((i+1)%size)
{
y=(i+1)%size;
}
else
y=size;
int m=array[x][y];
//std::cout<<x<<","<<y<<std::endl;
mybutton[i]->setIcon(QIcon(ss[m]));
mybutton[i]->setIconSize(QSize(50,50));
QObject::connect(mybutton[i],SIGNAL(myClicked(int)),this,SLOT(xxx(int)));
//mybutton[i]->setIcon(QIcon(s));
}
}
void llk::arrayInit(int size)
{
array[size+1][0]=0;
array[size+1][size+1]=0;
array[0][size+1]=0;
array[0][0]=0;
for(int i=1;i<=size;i++)
{
array[0][i]=0;
array[size+1][i]=0;
array[i][0]=0;
array[i][size+1]=0;
for(int j=1;j<=size;j++)
{
array[i][j]=((i-1)*size+j-1)/4+1;
}
}
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
{
int x1,x2,y1,y2,tmp1;
// srand(unsigned(time(NULL)));
x1=rand()%size+1;
x2=rand()%size+1;
y1=rand()%size+1;
y2=rand()%size+1;
tmp1=array[x1][y1];
array[x1][y1]=array[x2][y2];
array[x2][y2]=tmp1;
}
}
for(int i=0;i<=size+1;i++)
{
for(int j=0;j<=size+1;j++)
{
std::cout<<array[i][j]<<" ";
}
std::cout<<std::endl;
}
}
void llk::clear(int index)
{
if(isFirstClick)
{
firstIndex=index;
isFirstClick=false;
std::cout<<firstIndex<<",";
}
else
{
std::cout<<index<<std::endl;
int x1,y1,x2,y2;
x1=firstIndex/size+1;
x2=index/size+1;
if((firstIndex+1)%size)
{
y1=(firstIndex+1)%size;
}
else
y1=size;
if((index+1)%size)
{
y2=(index+1)%size;
}
else
y2=size;
std::cout<<x1<<","<<y1<<std::endl;
std::cout<<x2<<","<<y2<<std::endl;
std::cout<<"**************"<<std::endl;
if(judge(x1,y1,x2,y2,array,size))
{
mybutton[firstIndex]->setVisible(false);
// free(mybutton[firstIndex]);
//mybutton[firstIndex]=NULL;
mybutton[index]->setVisible(false);
array[x1][y1]=0;
array[x2][y2]=0;
currentIndex-=2;
progressBarCurrent->setValue(size*size-currentIndex);
}
isFirstClick=true;
}
}
void llk::setsize(int size1)
{
if(size1==8||size1==6||size1==10||size1==4)
{
size=size1;
}
}
void llk::mybuttonDelt()
{
for(int i=0;i<size*size;i++)
{
free(mybutton[i]);
}
}
void llk::createBtnRerank()
{
btnReRank = new QPushButton();
btnReRank->setParent(this);
btnReRank->setText("reRank");
QObject::connect(btnReRank,SIGNAL(clicked()),this,SLOT(Rerank( )));
}
void llk::Rerank()
{
charss[26][20]={"begin","./icon/icon1.png","./icon/icon2.png","./icon/icon3.png","./icon/icon4.png","./icon/icon5.png",
"./icon/icon6.png",
"./icon/icon7.png","./icon/icon8.png","./icon/icon9.png","./icon/icon10.png",
"./icon/icon11.gif","./icon/icon12.gif","./icon/icon13.gif","./icon/icon14.gif",
"./icon/icon15.gif","./icon/icon16.gif","./icon/icon17.gif","./icon/icon18.gif"
,"./icon/icon19.gif","./icon/icon20.gif","./icon/icon21.gif","./icon/icon22.gif","./icon/icon23.gif"
,"./icon/icon24.gif","./icon/icon25.gif"};
int tmpx,tmpy,tmp;
std::cout<<"rerank"<<std::endl;
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
{
if(array[i][j]!=0)
{
tmpx=rand()%size+1;
tmpy=rand()%size+1;
tmp =array[i][j];
array[i][j]=array[tmpx][tmpy];
array[tmpx][tmpy]=tmp;
mybutton[(i-1)*size+j-1]->setIcon(QIcon(ss[array[i][j]]));
mybutton[(tmpx-1)*size+tmpy-1]->setIcon(QIcon(ss[array[tmpx][tmpy]]));
if(array[i][j])
{
mybutton[(i-1)*size+j-1]->setVisible(true);
}
else
{
mybutton[(i-1)*size+j-1]->setVisible(false);
}
mybutton[(tmpx-1)*size+tmpy-1]->setVisible(true);
}
}
}
}
voidllk::createCurrentProgressBar(int size)
{
progressBarCurrent = newQProgressBar();
progressBarCurrent->setGeometry(20,40,60*size,30);
progressBarCurrent->setMaximum(size*size);
progressBarCurrent->setValue(255);
progressBarCurrent->setParent(this);
}
void llk::createTimeProcessBar(intsumtime)
{
progressBarTime = new QProgressBar();
progressBarTime->setGeometry(20,80,60*size,30);
progressBarTime->setParent(this);
progressBarTime->setMaximum(sumtime);
}
void llk::timeProcess()
{
if(currentTime>=size*size)
this->close();
currentTime++;
progressBarTime->setValue(currentTime);
}
Judge.cpp
#include"judge.h"
#include<iostream>
int judge(int x1,int y1,int x2,inty2,int array[16][16],int size)
{
if(x1==x2&&y1==y2)
{
return 0;
}
if((array[x1][y1]==array[x2][y2]))
{
if(judge1(x1,y1,x2,y2,array,size)||judge2(x1,y1,x2,y2,array,size)||judge3(x1,y1,x2,y2,array,size))
{
array[x1][y1]=0;
array[x2][y2]=0;
return 1;
}
}
return 0;
}
int judge1(int x1,int y1,intx2,int y2,int array[16][16],int size)
{
//if(array[x1][y1]==array[x2][y2])
//{
int tmp;
if(x1!=x2&&y1!=y2)
return 0;
if(y1>y2)
{
tmp=y1;
y1=y2;
y2=tmp;
}
if(x1==x2)
{
if(y1>y2)
{
tmp=y1;
y1=y2;
y2=tmp;
}
for(int i=y1+1;i<y2;i++)
{
if(array[x1][i])
{
return 0;
}
}
}
if(x1>x2)
{
tmp=x1;
x1=x2;
x2=tmp;
}
if(y1==y2)
{
if(x1>x2)
{
tmp=x1;
x1=x2;
x2=tmp;
}
for(int j=x1+1;j<x2;j++)
{
if(array[j][y1])
{
return 0;
}
}
}
//return 1;
//}
return 1;
}
int judge2(int x1,int y1,intx2,int y2,int array[16][16],int size)
{
int flag=0;
if(judge1(x1,y2,x1,y1,array,size)&&judge1(x1,y2,x2,y2,array,size)&&array[x1][y2]==0)
{
//flag++;
//std::cout<<x1<<","<<i<<std::endl;
return 1;
}
if(judge1(x2,y1,x1,y1,array,size)&&judge1(x2,y1,x2,y2,array,size)&&array[x2][y1]==0)
{
//flag++;
//std::cout<<j<<","<<y1<<std::endl;
return 1;
}
return 0;
}
int judge3(int x1,int y1,intx2,int y2,int array[16][16],int size)
{
for(int i=0;i<=size+1;i++)
{
if(judge2(x1,i,x2,y2,array,size)&&judge1(x1,i,x1,y1,array,size)&&array[x1][i]==0)
{ //std::cout<<x1<<","<<i<<std::endl;
return 1;
}
}
for(int j=0;j<=size+1;j++)
{
if(judge2(j,y1,x2,y2,array,size)&&judge1(j,y1,x1,y1,array,size)&&array[j][y1]==0)
{
// std::cout<<j<<","<<y1<<std::endl;
return 1;
}
}
return 0;
}
头文件源代码:
Judge.h
#ifndef JUDGE_H
#define JUDGE_H
int judge(intx1,int y1,int x2,int y2,int array[16][16],int size);
int judge1(intx1,int y1,int x2,int y2,int array[16][16],int size);
int judge2(intx1,int y1,int x2,int y2,int array[16][16],int size);
int judge3(int x1,int y1,intx2,int y2,int array[16][16],int size);
#endif // JUDGE_H
Llk.h
#ifndef LLK_H
#define LLK_H
#include<mybutton.h>
#include <QWidget>
#include<QPicture>
#include <QWidget>
#include<QObject>
#include<QProgressBar>
#include<QLabel>
#include<Qtimer>
class llk : public QWidget
{
Q_OBJECT
public:
llk();
void setsize(int size1);
void addPic(QString path,int i);
void Create(int size);
void clear(int index);
void mybuttonDelt();
void createBtnRerank();
void newGame();
void createCurrentProgressBar(int size);
void createTimeProcessBar(int sumtime);
int currentTime;
private:
MyButton * mybutton[150];
QLabel * labelPic[4];
QProgressBar * progressBar[4];
int array[16][16];
bool isFirstClick;
int firstIndex;
QPushButton * btnReRank;
QProgressBar *progressBarCurrent;
QProgressBar *progressBarTime;
int currentIndex;
Qtimer *timer;
int size;
public slots:
void xxx(int x);
void arrayInit(int size);
void Rerank();
void timeProcess();
};
#endif // LLK_H
Mainwindow.h
#ifndef JUDGE_H
#define JUDGE_H
int judge(int x1,int y1,int x2,inty2,int array[16][16],int size);
int judge1(int x1,int y1,intx2,int y2,int array[16][16],int size);
int judge2(int x1,int y1,intx2,int y2,int array[16][16],int size);
int judge3(int x1,int y1,intx2,int y2,int array[16][16],int size);
#endif // JUDGE_H
Mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton>
class MyButton : publicQPushButton
{
Q_OBJECT
public:
MyButton(int value,QWidget * parent = 0);
private:
int value;
signals:
void myClicked(int value);
public slots:
void mySlot();
};
#endif // MYBUTTON_H
Udp.h
#ifndefUDP_H
#defineUDP_H
#include<QString>
void sendMessage(QStringipAddress,unsigned int port,QString msg,bool isBroad);
#endif // UDP_H

