最近羊了个羊火的不得了,利用周末时间实现一个网页版。步骤如下:
1,用reactjs 实现。
2,实现Gameroom类。
3,实现Card类。
4,通过父组件控制子组件通信方式,控制点击事件。
5,通过top,left属性判断是否覆盖。

直接上代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="Zhou Zhengwei" content="anbangzhiguo@163.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=0.5">
<title>羊了个羊网页版</title>
<style>
.A{
background-image: url(https://img0.baidu.com/it/u=2915591120,58539746&fm=253&fmt=auto&app=138&f=JPEG?w=50&h=75);
background-size:cover;
}
.B{background-image: url(https://img2.baidu.com/it/u=1961605168,519023852&fm=253&fmt=auto&app=120&f=JPEG?w=200&h=200);
background-size:cover;}
.C{background-image: url(https://img1.baidu.com/it/u=1558460227,1600052005&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200);
background-size:cover;}
.D{background-image: url(https://img0.baidu.com/it/u=1367134673,2529600782&fm=253&fmt=auto&app=120&f=JPEG?w=200&h=200);
background-size:cover;}
.E{background-image: url(https://img1.baidu.com/it/u=2342405275,30063627&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200);
background-size:cover;}
.F{background-image: url(https://img2.baidu.com/it/u=794796699,2048913638&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200);
background-size:cover;}
.G{background-image: url(https://img2.baidu.com/it/u=2804974022,2583629637&fm=253&fmt=auto&app=138&f=JPEG?w=120&h=80);
background-size:cover;}
.H{background-image: url(https://img1.baidu.com/it/u=961754899,2161050074&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200);
background-size:cover;}
.J{background-image: url(https://img0.baidu.com/it/u=3372864484,86401414&fm=253&fmt=auto&app=138&f=JPEG?w=160&h=109);
background-size:cover;}
.K{background-image: url(https://img0.baidu.com/it/u=2447232726,212069368&fm=253&fmt=auto?w=200&h=200);
background-size:cover;}
.L{background-image: url(https://img2.baidu.com/it/u=3788646889,2975336153&fm=253&fmt=auto?w=200&h=200);
background-size:cover;}
.M{background-image: url(https://img1.baidu.com/it/u=1035241979,2591366575&fm=253&fmt=auto?w=130&h=170);
background-size:cover;}
.N{background-image: url(https://img0.baidu.com/it/u=1257446861,475247806&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200);
background-size:cover;}
body{
background: url(https://img2.baidu.com/it/u=3202063201,1142127465&fm=253&fmt=auto&app=138&f=JPEG?w=254&h=154);
margin: 0px;
padding: 0px;
}
.header{
width: 100%;
height: 50px;
}
</style>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div class="header">
</div>
<div id="gameroom" style="float:left">
</div>
<div style="float:none"></div>
<div style="float:left;width:110px;font-size:80px;font-weight:900;">
<div style="width:80px;padding-top:80px;">羊了个羊</div>
</div>
</body>
</html>
<script type="text/babel">
class CardSlot extends React.Component{
constructor(props) {
super(props);
this.state = {
slot0:'',
slot1:'',
slot2:'',
slot3:'',
slot4:'',
slot5:'',
slot6:''
};
}
disCard(s){
if(s.length > 0){
return (<div class={s} style={
{
width:'50px',
height:'75px',
position: 'absolute',
textAlign: 'center',
top: 5,
left: 5,
fontSize:40,
fontWeight:900
}
}>
</div>)
}else{
return ''
}
}
render() {
return (
<div style={{position: 'absolute',display:'block',bottom: 10,left: 50, width: 500,height: 90,backgroundColor: '#00ff00'}}>
<div style={{display:'inline-block',position: 'absolute',width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot0)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:70,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot1)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:140,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot2)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:210,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot3)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:280,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot4)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:350,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot5)}
</div>
<div style={{display:'inline-block',position: 'absolute',left:420,width: 60,height: 90,backgroundColor: 'red',marginLeft:10}}>
{this.disCard(this.state.slot6)}
</div>
</div>
);
}
}
class GameRoom extends React.Component{
constructor(props) {
super(props);
this.state = {
allCards:this.createCard(),
canClick:true
};
}
createCard(){
let allCards = []
let arr = ['A','B','C','D','E','F','G','H','J','K','L','M','N']
let cardArr = []
for(let i=0;i<141;i+=3){
let c = arr[i%13]
cardArr.push(c)
cardArr.push(c)
cardArr.push(c)
}
for(let i=0;i<40;i++){
allCards.push({key:(100+i)+'',text:cardArr.splice([Math.floor(Math.random()*cardArr.length)],1),levle:0,parent:'',left:90+parseInt(i/6)*58,top:10+(i%6)*90})
}
for(let i=40;i<70;i++){
allCards.push({key:(100+i)+'',text:cardArr.splice([Math.floor(Math.random()*cardArr.length)],1),levle:1,parent:'',left:110+parseInt((i-40)/5)*58,top:40+(i%5)*105})
}
for(let i=70;i<90;i++){
allCards.push({key:(100+i)+'',text:cardArr.splice([Math.floor(Math.random()*cardArr.length)],1),levle:2,parent:'',left:120+parseInt((i-70)/4)*65,top:80+i%4*110})
}
for(let i=90;i<105;i++){
allCards.push({key:(100+i)+'',text:cardArr.splice([Math.floor(Math.random()*cardArr.length)],1),levle:3,parent:'',left:130+parseInt((i-90)/3)*67,top:125+i%3*120})
}
for(let i=105;i<141;i++){
allCards.push({key:(100+i)+'cart',text:cardArr.splice([Math.floor(Math.random()*cardArr.length)],1),levle:i%105,parent:'',left:540+i%10*3,top:30+i%105*12})
}
return allCards
}
handleClick(t) {
let targetLeft = 65+(3*70)
let diffLeft = targetLeft-this[t].state.left
let stepLeft = diffLeft*5/(680-this[t].state.top)
let selectItem,selectIndex
for(let i=0;i<this.state.allCards.length;i++){
let item = this.state.allCards[i]
if(item.key == t){
selectItem = item
selectIndex = i
break
}
}
let haveCover = false;
for(let i=0;i<this.state.allCards.length;i++){
let item = this.state.allCards[i]
if(item.levle > selectItem.levle){
if(item.top < selectItem.top+75 && item.top > selectItem.top -75 && item.left < selectItem.left+50 && item.left > selectItem.left -75){
haveCover = true;
}
}
}
if(haveCover) return;
if(this.state.canClick){
this.setState(prevState => ({
canClick:false
}));
}else{
return;
}
this.backInterval = setInterval(()=>{
if(this[t].state.top >= 680){
clearInterval(this.backInterval)
this[t].setState(prevState => ({
dis: '0'
}));
let allCardsTemp = this.state.allCards
allCardsTemp.splice(selectIndex, 1);
this.setState(prevState => ({
allCards:allCardsTemp,
canClick:true
}));
let slotnum = {}
for(let i=0;i<7;i++){
let s = this.cardSlot.state['slot'+i]
if(s !=''){
if(slotnum[s]){
slotnum[s] = slotnum[s]+1
}else{
slotnum[s] = 1
}
}
}
let tt = selectItem.text
if(slotnum[tt]){
slotnum[tt] = slotnum[tt]+1
}else{
slotnum[tt] = 1
}
console.log(slotnum)
let slotState = {}
let snum = 0
for(let k in slotnum){
if(slotnum[k] < 3){
slotState['slot'+snum] = k
snum++
if(slotnum[k]==2){
slotState['slot'+snum] = k
snum++
}
}
}
for(let k = snum;k<7;k++){
slotState['slot'+k] = ''
}
this.cardSlot.setState(prevState => (slotState));
if(snum == 7){
alert('Game Over')
location.reload();
}
}else{
this[t].setState(prevState => ({
top: this[t].state.top+5,
left: this[t].state.left+stepLeft
}));
}
},10)
}
render() {
return (
<div style={{
position: 'absolute',
display:'block',
top:50,
bottom: 100,
left: 50,
width: 650,
height: 900
}} >
<CardSlot ref={foo => {this.cardSlot = foo}}/>
{
this.state.allCards.map((item, index) => {
return <Card key={item.key} ref={foo => {this[item.key] = foo}} handleClick={()=>{this.handleClick(item.key)}} name={item.text} top={item.top} left={item.left} dis={'1'} />
})
}
</div>
);
}
}
class Card extends React.Component {
constructor(props) {
super(props);
this.state = {
top:this.props.top,
left:this.props.left,
dis:this.props.dis
};
this.handleClick = this.props.handleClick;
}
render() {
return (
<div class={this.props.name} style={
{
width:'50px',
height:'75px',
position: 'absolute',
textAlign: 'center',
top: this.state.top,
left: this.state.left,
fontSize:40,
margin:3,
fontWeight:900,
boxShadow: '20px 20px 20px #000000',
border: 'white 4px solid',
display:this.state.dis=='1'?'block':'none'
}
} onClick={this.handleClick}>
</div>
);
}
}
ReactDOM.render(
<GameRoom></GameRoom>,
document.getElementById('gameroom')
);
</script>
我正在尝试用ruby编写一个简单的网络抓取代码。它一直工作到第29个url,然后我收到此错误消息:C:/Ruby193/lib/ruby/1.9.1/open-uri.rb:346:in`open_http':500InternalServerError(OpenURI::HTTPError)fromC:/Ruby193/lib/ruby/1.9.1/open-uri.rb:775:in`buffer_open'fromC:/Ruby193/lib/ruby/1.9.1/open-uri.rb:203:in`blockinopen_loop'fromC:/Ruby193/lib/r
我正在使用open-uri读取一个声称以iso-8859-1编码的网页。当我读取页面内容时,open-uri返回一个以ASCII-8BIT编码的字符串。open("http://www.nigella.com/recipes/view/DEVILS-FOOD-CAKE-5310"){|f|pf.content_type,f.charset,f.read.encoding}=>["text/html","iso-8859-1",#]我猜这是因为网页中的字节(或字符)\x92不是有效的iso-8859字符。http://en.wikipedia.org/wiki/ISO/IEC_8859-
🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我正在尝试以编程方式创建大量网页的缩略图,这些网页托管在我自己的基于ruby/rails的网站上。我希望能够编写一个独立的ruby代码,看起来像这样:require'awesome-screenshot-maker'items.eachdo|id|url="http://foo.com/bar/#{id}"shooter=AwesomeScreenshotMa
如果我使用OpenURI运行一个简单的脚本,我可以访问网页。结果写入终端。通常我会使用bash重定向将结果写入文件。如何使用ruby将OpenURI调用的结果写入文件? 最佳答案 require'open-uri'open("file_to_write.html","wb")do|file|URI.open("http://www.example.com/")do|uri|file.write(uri.read)endend注意:在Rubyopen(url)而不是URI.open(url)。参见https://bugs.ruby
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion我正尝试在我正在处理的Ruby脚本中抓取网页。该项目的目的是展示哪些ETF和股票共同基金最符合值(value)投资理念。我想抓取的一些页面示例是:http://finance.yahoo.com/q/pr?s=SPY+Profilehttp://finance.yahoo.com/q/hl?s=SPY+Holdingshttp://www.marketwatch.com/tools/mut
我正在使用seleniumwebdriver在浏览器上做一些自动化。现在需要获取当前在浏览器中打开的页面的当前url。我写了下面的代码但是给我错误:element=driver.find_element:name=>"btnSearch"element.clickall_table_data=driver.find_elements(:tag_name,"td")all_table_data.eachdo|td|putstd.textendprintdriver.get_url但它给我一个错误:filedownload.rb:30:in`':undefinedmethod`get_ur
我正在尝试使用Ruby检索网页的每个外部链接。我将String.scan与此正则表达式一起使用:/href="https?:[^"]*|href='https?:[^']*/i然后,我可以使用gsub删除href部分:str.gsub(/href=['"]/)这工作正常,但我不确定它在性能方面是否有效。这可以使用还是我应该使用更具体的解析器(例如nokogiri)?哪种方式更好?谢谢! 最佳答案 使用正则表达式对于快速而肮脏的脚本来说很好,但Nokogiri使用起来非常简单:require'nokogiri'require'open
我正在尝试滚动网页以查找并单击滚动页面时延迟加载的内容。我正在使用以下命令require'watir-webdriver'@browser=Watir::new:firefox@browser.send_keys:space我在firefox上使用网络驱动程序,我在ubuntu上,但它不工作。在下面的ruby代码中,我试图向下滚动页面,直到找不到带有:id的元素。该元素正在延迟加载。几秒钟后我超时了,不知道下面的代码有什么问题。When/^deal(\d+)isloaded$/do|id|(0..5).eachdo|click|@browser.send_keys:spaceend
我想从这个*页面中获取内容。我查找的所有内容都提供了解析CSS元素的解决方案;但是,那个页面没有。这是我发现的唯一看起来应该有效的代码:file=File.open('http://hiscore.runescape.com/index_lite.ws?player=zezima',"r")contents=file.readputscontents错误:tracker.rb:1:in'initialize':Invalidargument-http://hiscore.runescape.com/index_lite.ws?player=zezima(Errno::EINVAL)fr