我正在制作井字游戏,希望使逻辑重复性降低。我目前正在通过以下操作检查每个点击位置的所有可能的获胜条件:
public static boolean isCompleted(int position, ImageView[] blocks) {
GameLogic.blocks = blocks;
boolean isComplete = false;
switch (position) {
case 1:
isComplete = areSameInSet(1, 2, 3) ||
areSameInSet(1, 4, 7) ||
areSameInSet(1, 5, 9);
break;
然后将其发送到此方法,该方法将检查一个数字值,单击该值会设置为0,表示圆圈,为1表示交叉:
private static boolean areSameInSet(int first, int second, int third) {
boolean value = blocks[first - 1].getId() == blocks[second - 1].getId() &&
blocks[second - 1].getId() == blocks[third - 1].getId();
是否可以查看此gridview的整个行或列,而不是每次都需要3个不同参数的自定义方法?
我尝试查看TableView来查看这是否是一个更好的选择,但我也无法查看该路线中的任何方式。
理想情况下,我可以运行诸如checkSum(row,column)之类的方法,该方法求和以检查3或-3(一个玩家用1表示,一个玩家用-1表示),对角线有一些特殊条件。
编辑: 我不确定您的意思是什么,但是网格是静态的,内部的每个imageview都占据一个位置,并且不会移动。
<GridLayout
android:id="@+id/grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/colorPrimaryDark"
android:columnCount="3"
android:rowCount="3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
紧接着是九个嵌套的ImageView,其中之一像这样:
<ImageView
android:id="@+id/block1"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_row="0"
android:layout_column="0"
android:background="@color/colorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
答案 0 :(得分:0)
如果列号是固定的,则可以在getView(position)
中进行。您将获得职位。
您可以在链接中找到custom grid view的示例
CustomAdapter
public class CustomAdapter extends BaseAdapter{
String [] result;
Context context;
int [] imageId;
private static LayoutInflater inflater=null;
public CustomAdapter(MainActivity mainActivity, String[] osNameList, int[] osImages) {
// TODO Auto-generated constructor stub
result=osNameList;
context=mainActivity;
imageId=osImages;
inflater = ( LayoutInflater )context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return result.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public class Holder
{
TextView os_text;
ImageView os_img;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder=new Holder();
View rowView;
rowView = inflater.inflate(R.layout.sample_gridlayout, null);
holder.os_text =(TextView) rowView.findViewById(R.id.os_texts);
holder.os_img =(ImageView) rowView.findViewById(R.id.os_images);
holder.os_text.setText(result[position]);
holder.os_img.setImageResource(imageId[position]);
rowView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_SHORT).show();
}
});
return rowView;
}
}
在您的活动中,
CustomAdapter adapter = new CustomAdapter(this, String[] your_data, int[] img_arr);
gridView.setAdapter(adapter);
如前所述,您的列为3,行数为3。
那么位置0, 1, 2
表示第一行,
3, 4, 5
表示第二行,
6, 7, 8
表示第三行。
答案 1 :(得分:0)
因为网格是固定的,所以位置永远不会改变,因此基本上具有索引的项目:
0 1 2
3 4 5
6 7 8
您可以将数据映射到具有其索引的2D数组:
(0,0)(0,1)(0,2)
(1,0)(1,1)(1,2)
(2,0)(2,1)(2,2)
这样,您可以检查整个行和列。对于第一个对角线,您可以检查两个索引等于(0,0),(1,1),(2,2)的条件。对于第二个对角线,您可以检查索引总和为2(2,0),(1、1),(0、2)。