- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道我做错了什么,但我在我的应用程序中收到“IndexOutOfBoundException”。这是我的代码和 logcat:
//代码
public class GameView extends View {
private Context myContext;
private int scaledCardW;
private int scaledCardH;
private int screenH, screenW;
private List<Card> deck = new ArrayList<Card>();
private List<Card> myHand = new ArrayList<Card>();
private List<Card> oppHand = new ArrayList<Card>();
private List<Card> discardPile = new ArrayList<Card>();
private float scale;
private Paint blackPaint;
private int oppScore;
private int myScore;
private boolean myTurn;
private int movingCardIdx = -1;
private int movingX;
private int movingY;
private int validRank = 8;
private int validSuit = 0;
private Bitmap cardBack;
private Bitmap nextCardButton;
private ComputerPlayer computerPlayer = new ComputerPlayer();
private int scoreThisHand = 0;
public GameView(Context context) {
super(context);
// TODO Auto-generated constructor stub
myContext = context;
scale = myContext.getResources().getDisplayMetrics().density;
blackPaint = new Paint();
blackPaint.setAntiAlias(true);
blackPaint.setColor(Color.BLACK);
blackPaint.setStyle(Paint.Style.STROKE);
blackPaint.setTextAlign(Paint.Align.LEFT);
blackPaint.setTextSize(scale * 15);
//myTurn = new Random().nextBoolean();
//myTurn = true;
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
screenH = h;
screenW = w;
initCards();
dealCards();
Bitmap tempBitmap = BitmapFactory.decodeResource(myContext.getResources(),R.drawable.card_back);
nextCardButton = BitmapFactory.decodeResource(myContext.getResources(), R.drawable.arrow_next);
scaledCardW = screenW/8;
scaledCardH = (int) (scaledCardW*1.28);
cardBack = Bitmap.createScaledBitmap(tempBitmap, scaledCardW,scaledCardH,false);
validRank = discardPile.get(0).getRank();
validSuit = discardPile.get(0).getSuit();
myTurn = new Random().nextBoolean();
if(!myTurn)
{
makeComputerPlay();
}
}
private void initCards()
{
for(int x = 0; x < 4; x++)
{
for(int y = 102; y < 115; y++)
{
int tempId = y + (x * 100);
Card tempCard = new Card(tempId);
int resourceId = getResources().getIdentifier("card"+ tempId, "drawable",myContext.getPackageName());
Bitmap tempBitmap = BitmapFactory.decodeResource(myContext.getResources(),resourceId);
scaledCardW = screenW/8;
scaledCardH = (int) (scaledCardW*1.28);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(tempBitmap,scaledCardW, scaledCardH, false);
tempCard.setBmp(scaledBitmap);
deck.add(tempCard);
}
}
}
private void drawCard(List<Card> handToDraw)
{
handToDraw.add(0,deck.get(0));
deck.remove(0);
if(deck.isEmpty())
{
for(int x = discardPile.size() -1; x > 0; x --)
{
deck.add(discardPile.get(0));
discardPile.remove(0);
Collections.shuffle(deck, new Random());
}
}
}
private void dealCards()
{
Collections.shuffle(deck, new Random());
for(int y = 0; y < 7; y++)
{
drawCard(myHand);
//drawCard(oppHand);
}
}
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawBitmap(deck.get(9).getBmp(), 80, 50,null);
canvas.drawText("Computer Score: " + oppScore, 10, blackPaint.getTextSize() + 10, blackPaint);
canvas.drawText("My Score: " + myScore, 10, (int)(screenH * 0.9) - blackPaint.getTextSize() - 10, blackPaint);
for (int i = 0; i < oppHand.size(); i++)
{
canvas.drawBitmap(cardBack, i*(scale*5), blackPaint.getTextSize()+(50*scale), null);
}
canvas.drawBitmap(cardBack, (screenW/2)-cardBack.getWidth()-10, (screenH/2)-(cardBack.getHeight()/2), null);
if (!discardPile.isEmpty())
{
canvas.drawBitmap(discardPile.get(0).getBmp(),(screenW/2)+10,(screenH/2)-(cardBack.getHeight()/2), null);
}
for (int i = 0; i < myHand.size(); i++) {
if (i == movingCardIdx)
{
canvas.drawBitmap(myHand.get(i).getBmp(),
movingX,
movingY,
null);
}
else
{
canvas.drawBitmap
(myHand.get(i).getBmp(),
i*(scaledCardW+5),
screenH-blackPaint.
getTextSize()-
(50*scale), null);
}
}
if (myHand.size() > 7)
{
canvas.drawBitmap(nextCardButton,
screenW-nextCardButton.getWidth()-(30*scale),screenH-nextCardButton.getHeight()-scaledCardH-(90*scale),null);
}
for (int i = 0; i < myHand.size(); i++)
{
if (i == movingCardIdx)
{
canvas.drawBitmap(myHand.get(i).getBmp(),movingX, movingY, null);
}
else
{
if(i < 7)
{
canvas.drawBitmap(myHand.get(i).getBmp(),i*(scaledCardW+5),screenH-blackPaint.getTextSize()-(50*scale),null);
}
}
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventaction = event.getAction();
int X = (int)event.getX();
int Y = (int)event.getY();
switch (eventaction ) {
case MotionEvent.ACTION_DOWN:
if(myTurn)
{
for (int i = 0; i < 7; i++)
{
if (X > i*(scaledCardW+5) && X < i*(scaledCardW+5) + scaledCardW && Y > screenH-blackPaint.getTextSize()- (50*scale))
{
movingCardIdx = i;
movingX = X-(int)(30*scale);
movingY = Y-(int)(70*scale);
}
}
}
break;
case MotionEvent.ACTION_MOVE:
movingX = X-(int)(30*scale);
movingY = Y-(int)(70*scale);
break;
case MotionEvent.ACTION_UP:
if (movingCardIdx > -1 && X > (screenW/2)-(100*scale) && X < (screenW/2)+(100*scale) && Y > (screenH/2)-(100*scale) && Y < (screenH/2)+(100*scale) &&
(myHand.get(movingCardIdx).getRank() == 8 || myHand.get(movingCardIdx).getRank() ==
validRank || myHand.get(movingCardIdx).getSuit() == validSuit))
{
validRank = myHand.get(movingCardIdx).getRank();
validSuit = myHand.get(movingCardIdx).getSuit();
discardPile.add(0, myHand.get(movingCardIdx));
myHand.remove(movingCardIdx);
if(myHand.isEmpty())
{
endHand();
}
else
{
if(validRank == 8)
{
showChooseSuitDialog();
}
else
{
myTurn = false;
makeComputerPlay();
}
}
}
movingCardIdx = -1;
if (movingCardIdx == -1 && myTurn && X > (screenW/2)-(100*scale) && X < (screenW/2)+(100*scale) &&
Y > (screenH/2)-(100*scale) && Y < (screenH/2)+(100*scale))
{
if (checkForValidDraw())
{
drawCard(myHand);
}
else
{
Toast.makeText(myContext, "You have a valid play.", Toast.LENGTH_SHORT).show();
}
}
if (myHand.size() > 7 && X > screenW-nextCardButton.getWidth()-(30*scale) && Y > screenH-nextCardButton.getHeight()-scaledCardH- (90*scale) &&
Y < screenH-nextCardButton.getHeight()-scaledCardH - (60*scale))
{
Collections.rotate(myHand, 1);
}
break;
}
invalidate();
return true;
}
private void showChooseSuitDialog()
{
final Dialog chooseSuitDialog = new Dialog(myContext);
chooseSuitDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
chooseSuitDialog.setContentView(R.layout.choose_suit_dialog);
final Spinner suitSpinner = (Spinner)chooseSuitDialog.findViewById(R.id.suitSpinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(myContext, R.array.suits,android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
suitSpinner.setAdapter(adapter);
Button okButton = (Button) chooseSuitDialog.findViewById(R.id.okButton);
okButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
validSuit = (suitSpinner.
getSelectedItemPosition()+1)*100;
String suitText = "";
if (validSuit == 100) {
suitText = "Diamonds";
} else if (validSuit == 200) {
suitText = "Clubs";
} else if (validSuit == 300) {
suitText = "Hearts";
} else if (validSuit == 400) {
suitText = "Spades";
}
chooseSuitDialog.dismiss();
Toast.makeText(myContext,"You chose " + suitText,Toast.LENGTH_SHORT).show();
myTurn = false;
makeComputerPlay();
}
});
chooseSuitDialog.show();
}
private boolean checkForValidDraw()
{
boolean canDraw = true;
for (int i = 0; i < myHand.size(); i++)
{
int tempId = myHand.get(i).getId();
int tempRank = myHand.get(i).getRank();
int tempSuit = myHand.get(i).getSuit();
if (validSuit == tempSuit || validRank == tempRank || tempId == 108 || tempId == 208 ||tempId == 308 || tempId == 408)
{
canDraw = false;
}
}
return canDraw;
}
private void makeComputerPlay()
{
int tempPlay = 0;
while (tempPlay == 0)
{
tempPlay = computerPlayer.makePlay(oppHand,validSuit, validRank);
if (tempPlay == 0)
{
drawCard(oppHand);
}
}
if (tempPlay == 108 || tempPlay == 208 || tempPlay == 308 || tempPlay == 408)
{
validRank = 8;
validSuit = computerPlayer.chooseSuit(oppHand);
String suitText = "";
if (validSuit == 100)
{
suitText = "Diamonds";
}
else if (validSuit == 200)
{
suitText = "Clubs";
}
else if (validSuit == 300)
{
suitText = "Hearts";
}
else if (validSuit == 400)
{
suitText = " Spades";
}
Toast.makeText(myContext, "Computer chose " + suitText, Toast.LENGTH_SHORT).show();
}
else
{
validSuit = Math.round((tempPlay/100) * 100);
validRank = tempPlay - validSuit;
}
for (int i = 0; i < oppHand.size(); i++)
{
Card tempCard = oppHand.get(i);
if (tempPlay == tempCard.getId())
{
discardPile.add(0, oppHand.get(i));
oppHand.remove(i);
}
}
if(oppHand.isEmpty())
{
endHand();
}
myTurn = true;
}
private void updateScores()
{
for (int i = 0; i < myHand.size(); i++)
{
oppScore += myHand.get(i).getScoreValue();
scoreThisHand += myHand.get(i).getScoreValue();
}
for (int i = 0; i < oppHand.size(); i++)
{
myScore += oppHand.get(i).getScoreValue();
scoreThisHand += oppHand.get(i).getScoreValue();
}
}
private void endHand()
{
final Dialog endHandDialog = new Dialog(myContext);
endHandDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
endHandDialog.setContentView(R.layout.end_hand_dialog);
updateScores();
TextView endHandText = (TextView)endHandDialog.findViewById(R.id.endHandText);
if (myHand.isEmpty())
{
if(myScore >= 300)
{
endHandText.setText("You reached " + myScore + " points. You won! Would you like to play again?");
}
else
{
endHandText.setText("You went out and got " + scoreThisHand + " points!");
}
}
else if (oppHand.isEmpty())
{
if (oppScore >= 300)
{
endHandText.setText("The computer reached " + oppScore + " points. Sorry, you lost. Would you like to play again?");
}
else
{
endHandText.setText("The computer went out and got " + scoreThisHand + " points.");
}
}
Button nextHandButton = (Button)endHandDialog.findViewById(R.id.nextHandButton);
if (oppScore >= 300 || myScore >= 300)
{
nextHandButton.setText("New Game");
}
nextHandButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if (oppScore >= 300 || myScore >= 300)
{
myScore = 0;
oppScore = 0;
}
initNewHand();
endHandDialog.dismiss();
}
});
endHandDialog.show();
}
private void initNewHand() {
// TODO Auto-generated method stub
scoreThisHand = 0;
if (myHand.isEmpty())
{
myTurn = true;
}
else if (oppHand.isEmpty())
{
myTurn = false;
}
deck.addAll(discardPile);
deck.addAll(myHand);
deck.addAll(oppHand);
discardPile.clear();
myHand.clear();
oppHand.clear();
dealCards();
drawCard(discardPile);
validSuit = discardPile.get(0).getSuit();
validRank = discardPile.get(0).getRank();
if (!myTurn)
{
makeComputerPlay();
}
}
}
//这是我的 LogCat
error opening trace file: No such file or directory (2)
GC_FOR_ALLOC freed 34K, 7% free 2395K/2572K, paused 88ms, total 91ms
Grow heap (frag case) to 3.210MB for 770432-byte allocation
GC_FOR_ALLOC freed <1K, 6% free 3147K/3328K, paused 100ms, total 100ms
GC_CONCURRENT freed <1K, 6% free 3265K/3448K, paused 23ms+25ms, total 186ms
Emulator without GPU emulation detected.
GC_CONCURRENT freed 245K, 11% free 3524K/3920K, paused 75ms+53ms, total 455ms
WAIT_FOR_CONCURRENT_GC blocked 194ms
GC_CONCURRENT freed 315K, 12% free 3673K/4160K, paused 14ms+29ms, total 370ms
WAIT_FOR_CONCURRENT_GC blocked 212ms
GC_CONCURRENT freed 287K, 11% free 3853K/4320K, paused 78ms+64ms, total 441ms
WAIT_FOR_CONCURRENT_GC blocked 182ms
GC_CONCURRENT freed 352K, 12% free 3961K/4500K, paused 9ms+28ms, total 363ms
WAIT_FOR_CONCURRENT_GC blocked 243ms
GC_CONCURRENT freed 314K, 11% free 4105K/4600K, paused 98ms+61ms, total 434ms
WAIT_FOR_CONCURRENT_GC blocked 234ms
GC_CONCURRENT freed 352K, 12% free 4268K/4820K, paused 9ms+80ms, total 530ms
WAIT_FOR_CONCURRENT_GC blocked 215ms
GC_FOR_ALLOC freed 193K, 12% free 4244K/4820K, paused 68ms, total 70ms
Grow heap (frag case) to 4.583MB for 316480-byte allocation
GC_FOR_ALLOC freed <1K, 12% free 4553K/5132K, paused 147ms, total 147ms
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x40a71930)
FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
at com.example.crazyeights.GameView.onSizeChanged(GameView.java:94)
at android.view.View.setFrame(View.java:14094)
at android.view.View.layout(View.java:14006)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14008)
at android.view.ViewGroup.layout(ViewGroup.java:4373)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
at android.view.View.layout(View.java:14008)
at android.view.ViewGroup.layout(ViewGroup.java:4373)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14008)
at android.view.ViewGroup.layout(ViewGroup.java:4373)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Sending signal. PID: 929 SIG: 9
GC_FOR_ALLOC freed 38K, 8% free 2395K/2576K, paused 326ms, total 332ms
Grow heap (frag case) to 3.210MB for 770432-byte allocation
GC_FOR_ALLOC freed <1K, 6% free 3147K/3332K, paused 79ms, total 79ms
GC_CONCURRENT freed <1K, 6% free 3273K/3452K, paused 31ms+29ms, total 163ms
Emulator without GPU emulation detected.
最佳答案
在您的 onSizeChanged()
中,您访问 discardPile
的第一个元素与 get(0)
但是discardPile
为空。
关于java - Android IndexOutOfBoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21599870/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!