Copyright 2013-2014 All Rights Reserved Theme by 1580毕业设计网 最好的毕业设计网站大全 毕业设计代做 工商企业管理论文
苏ICP备112451047180号-6
服务计算概论实验报告
一、实验目的
了解多线程,并学会应用。
二、实验内容
编写一个java或c#多线程程序模拟乒乓球双打比赛。在该问题中,你必须使用监听器和事件。
三、实验要求
(1)有四个选手,A1和A2为一队,B1和B2为另外一队。A1首先发球(启动球),然后B1,A2,B2将最后发球。每一轮中选手发六个球。
(2)选手不改变他们的位置。
(3)比赛期间,双方选手必须轮流发球(用事件定义次序)并且在同一队中的两个选手可以竞争发球(用monitor同步他们)。
(4)当轮到某个选手时,他/她可调用一个叫做shot(rate)的随机函数来模拟该比赛。如果是给定的概率该函数返回会“in”,如果是用1减去给定的概率,则返回“out”。例如如果rate=85%,则球在界内的概率是85%,出街的概率是15%。
(5)如果shot函数返回in,对方选手必须通过调用shot函数把球打回。
(6)如果shot函数返回out,对方选手将赢得1分,必须开始一个新的发球。
(7)当每个选手发完6个球后比赛终止,分数最多的一队将赢得比赛比赛。如果两队比赛分数一样多,比赛平局。
四、源程序及程序作用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class TableTennis
{
Random rand;
AutoResetEvent A1event, A2event, B1event, B2event;
int turn, rate, Apoints, Bpoints, totalServes;
bool serve, gamePlay;
static void Main(string[] args)
{
TableTennis a = new TableTennis();
}
public TableTennis()
{
totalServes = 0;
serve = true;
gamePlay = true;
long tick = DateTime.Now.Ticks;
rand = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
//多线程
A1event = new AutoResetEvent(false);
A2event = new AutoResetEvent(false);
B1event = new AutoResetEvent(false);
B2event = new AutoResetEvent(false);
Thread A1 = new Thread(playerA1);
Thread A2 = new Thread(playerA2);
Thread B1 = new Thread(playerB1);
Thread B2 = new Thread(playerB2);
A1.Start();
A2.Start();
B1.Start();
B2.Start();
A1event.Set();
}
public bool shot(int rate)//击球概率
{
rate = rand.Next(1, 100);
if (rate < 86)
return true;
else
return false;
}
//概率函数,有85%的概率成功打过去。
public void notifyNextServer()//唤醒所有等待的程序运行
{
switch (turn)
{
case 0:
A1event.Set();
break;
case 1:
B1event.Set();
break;
case 2:
A2event.Set();
break;
case 3:
B2event.Set();
break;
}
}
public void aSwing(string str)
{
if (shot(rate))
{
// if I got to the ball first if (shot(rate)) {
Console.Write("-" + str + "-in");
// wake up other side
if (str == "A1") B2event.Set();
else B1event.Set();
}
else
{
Console.Write("-" + str + "- out \n");
Bpoints++;
Console.WriteLine(" The side B1B2 wins.Score=({0},{1} ) ", Apoints, Bpoints);
// check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void aServe(string str)
{
if (shot(rate))
{
Console.Write(str + "- in ");
//wake up other side
if (str == "A1") B2event.Set();
else B1event.Set();
}
else
{
Console.Write(str + "- out \n");
Bpoints++;
Console.WriteLine("The side B1B2 wins.Score =({0},{1})", Apoints, Bpoints);
//check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void bSwing(string str)
{
if (shot(rate))
{
// if I got to the ball first if (shot(rate)) {
Console.Write("-" + str + "-in");
// wake up other side
if (str == "B1") A1event.Set();
else A2event.Set();
}
else
{
Console.Write("-" + str + "- out \n");
Apoints++;
Console.WriteLine(" The side A1A2 wins.Score=({0},{1} ) ", Apoints, Bpoints);
// check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void bServe(string str)
{
if (shot(rate))
{
Console.Write(str + "- in ");
//wake up other side
if (str == "B1") A1event.Set();
else A2event.Set();
}
else
{
Console.Write(str + "- out \n");
Apoints++;
Console.WriteLine("The side A1A2 wins.Score =({0},{1})", Apoints, Bpoints);
//check if that was the winning point
if (str == "B1") A1event.Set();
else A2event.Set();
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void playerA1()
{
//while game in play
do
{
A1event.WaitOne();//write on myevent
if (serve && turn == 0)//if it is my to serve
{
serve = false;//then serve
turn = 1;
totalServes++;
aServe("A1");
}
else
{
//if i got to the ball first
aSwing("A1");
}
}
while (gamePlay);
}
public void playerA2()
{
//while game in play
do
{
A2event.WaitOne();//write on myevent
if (serve && turn == 2)//if it is my to serve
{
serve = false;//then serve
turn = 3;
totalServes++;
aServe("A2");
}
else
{
//if i got to the ball first
aSwing("A2");
}
}
while (gamePlay);
}
public void playerB1()
{
//while game in play
do
{
B1event.WaitOne();//write on myevent
if (serve && turn == 1)//if it is my to serve
{
serve = false;//then serve
turn = 2;
totalServes++;
aServe("B1");
}
else
{
//if i got to the ball first
bSwing("B1");
}
}
while (gamePlay);
}
public void playerB2()
{
//while game in play
do
{
B2event.WaitOne();//write on myevent
if (serve && turn == 3)//if it is my to serve
{
serve = false;//then serve
turn = 0;
totalServes++;
bServe("B2");
}
else
{
//if i got to the ball first
bSwing("B2");
}
}
while (gamePlay);
}
public bool gameDone()
{
if (totalServes == 24)
{
if (Apoints > Bpoints)
Console.WriteLine("Final score = ({0},{1}).The team A1A2 wins", Apoints, Bpoints);
else if (Apoints < Bpoints)
Console.WriteLine("Final score = ({0},{1}).The team B1B2 wins", Apoints, Bpoints);
else
Console.WriteLine("Final score = ({0},{1}).The two teams tie", Apoints, Bpoints);
gamePlay = false;
return true;
}
else return false;
}
}
五、}实验结果
六、实验分析
通过这次实验,我对服务计算概论这门课有了进一步的深层次了解,把理论知识应用于实验中,也让我重新熟悉了多线程的相关内容,加深了对多线程知识的了解和用途的理解。
一、实验目的
了解多线程,并学会应用。
二、实验内容
编写一个java或c#多线程程序模拟乒乓球双打比赛。在该问题中,你必须使用监听器和事件。
三、实验要求
(1)有四个选手,A1和A2为一队,B1和B2为另外一队。A1首先发球(启动球),然后B1,A2,B2将最后发球。每一轮中选手发六个球。
(2)选手不改变他们的位置。
(3)比赛期间,双方选手必须轮流发球(用事件定义次序)并且在同一队中的两个选手可以竞争发球(用monitor同步他们)。
(4)当轮到某个选手时,他/她可调用一个叫做shot(rate)的随机函数来模拟该比赛。如果是给定的概率该函数返回会“in”,如果是用1减去给定的概率,则返回“out”。例如如果rate=85%,则球在界内的概率是85%,出街的概率是15%。
(5)如果shot函数返回in,对方选手必须通过调用shot函数把球打回。
(6)如果shot函数返回out,对方选手将赢得1分,必须开始一个新的发球。
(7)当每个选手发完6个球后比赛终止,分数最多的一队将赢得比赛比赛。如果两队比赛分数一样多,比赛平局。
四、源程序及程序作用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class TableTennis
{
Random rand;
AutoResetEvent A1event, A2event, B1event, B2event;
int turn, rate, Apoints, Bpoints, totalServes;
bool serve, gamePlay;
static void Main(string[] args)
{
TableTennis a = new TableTennis();
}
public TableTennis()
{
totalServes = 0;
serve = true;
gamePlay = true;
long tick = DateTime.Now.Ticks;
rand = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
//多线程
A1event = new AutoResetEvent(false);
A2event = new AutoResetEvent(false);
B1event = new AutoResetEvent(false);
B2event = new AutoResetEvent(false);
Thread A1 = new Thread(playerA1);
Thread A2 = new Thread(playerA2);
Thread B1 = new Thread(playerB1);
Thread B2 = new Thread(playerB2);
A1.Start();
A2.Start();
B1.Start();
B2.Start();
A1event.Set();
}
public bool shot(int rate)//击球概率
{
rate = rand.Next(1, 100);
if (rate < 86)
return true;
else
return false;
}
//概率函数,有85%的概率成功打过去。
public void notifyNextServer()//唤醒所有等待的程序运行
{
switch (turn)
{
case 0:
A1event.Set();
break;
case 1:
B1event.Set();
break;
case 2:
A2event.Set();
break;
case 3:
B2event.Set();
break;
}
}
public void aSwing(string str)
{
if (shot(rate))
{
// if I got to the ball first if (shot(rate)) {
Console.Write("-" + str + "-in");
// wake up other side
if (str == "A1") B2event.Set();
else B1event.Set();
}
else
{
Console.Write("-" + str + "- out \n");
Bpoints++;
Console.WriteLine(" The side B1B2 wins.Score=({0},{1} ) ", Apoints, Bpoints);
// check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void aServe(string str)
{
if (shot(rate))
{
Console.Write(str + "- in ");
//wake up other side
if (str == "A1") B2event.Set();
else B1event.Set();
}
else
{
Console.Write(str + "- out \n");
Bpoints++;
Console.WriteLine("The side B1B2 wins.Score =({0},{1})", Apoints, Bpoints);
//check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void bSwing(string str)
{
if (shot(rate))
{
// if I got to the ball first if (shot(rate)) {
Console.Write("-" + str + "-in");
// wake up other side
if (str == "B1") A1event.Set();
else A2event.Set();
}
else
{
Console.Write("-" + str + "- out \n");
Apoints++;
Console.WriteLine(" The side A1A2 wins.Score=({0},{1} ) ", Apoints, Bpoints);
// check if that was the winning point
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void bServe(string str)
{
if (shot(rate))
{
Console.Write(str + "- in ");
//wake up other side
if (str == "B1") A1event.Set();
else A2event.Set();
}
else
{
Console.Write(str + "- out \n");
Apoints++;
Console.WriteLine("The side A1A2 wins.Score =({0},{1})", Apoints, Bpoints);
//check if that was the winning point
if (str == "B1") A1event.Set();
else A2event.Set();
if (!gameDone())
{
serve = true;
notifyNextServer();
}
}
}
public void playerA1()
{
//while game in play
do
{
A1event.WaitOne();//write on myevent
if (serve && turn == 0)//if it is my to serve
{
serve = false;//then serve
turn = 1;
totalServes++;
aServe("A1");
}
else
{
//if i got to the ball first
aSwing("A1");
}
}
while (gamePlay);
}
public void playerA2()
{
//while game in play
do
{
A2event.WaitOne();//write on myevent
if (serve && turn == 2)//if it is my to serve
{
serve = false;//then serve
turn = 3;
totalServes++;
aServe("A2");
}
else
{
//if i got to the ball first
aSwing("A2");
}
}
while (gamePlay);
}
public void playerB1()
{
//while game in play
do
{
B1event.WaitOne();//write on myevent
if (serve && turn == 1)//if it is my to serve
{
serve = false;//then serve
turn = 2;
totalServes++;
aServe("B1");
}
else
{
//if i got to the ball first
bSwing("B1");
}
}
while (gamePlay);
}
public void playerB2()
{
//while game in play
do
{
B2event.WaitOne();//write on myevent
if (serve && turn == 3)//if it is my to serve
{
serve = false;//then serve
turn = 0;
totalServes++;
bServe("B2");
}
else
{
//if i got to the ball first
bSwing("B2");
}
}
while (gamePlay);
}
public bool gameDone()
{
if (totalServes == 24)
{
if (Apoints > Bpoints)
Console.WriteLine("Final score = ({0},{1}).The team A1A2 wins", Apoints, Bpoints);
else if (Apoints < Bpoints)
Console.WriteLine("Final score = ({0},{1}).The team B1B2 wins", Apoints, Bpoints);
else
Console.WriteLine("Final score = ({0},{1}).The two teams tie", Apoints, Bpoints);
gamePlay = false;
return true;
}
else return false;
}
}
五、}实验结果
六、实验分析
通过这次实验,我对服务计算概论这门课有了进一步的深层次了解,把理论知识应用于实验中,也让我重新熟悉了多线程的相关内容,加深了对多线程知识的了解和用途的理解。