Flutter SDK 是一个开源软件开发工具包,用于构建原生编译的漂亮 UI。在本文中,我们将构建一个Tic Tac Toe 游戏。
我们将在此项目中使用 VS Code IDE,您也可以使用 Android Studio。
涵盖的概念是:
- 在屏幕上显示小部件。
- GridView.builder
- 函数编写
- 手势检测器
- 如果和其他在dart
按照以下步骤实施井字游戏。让我们开始吧。
第 1 步:创建Flutter应用程序
打开终端/命令提示符。将目录更改为您选择的并运行
flutter create tic-tac-toe
在 VS Code 或 Android Studio 中打开井字游戏。
第 2 步:编写井字游戏应用程序
在 Lib 文件夹中,有一个main. dart文件已经存在。现在,在 main.js 中添加以下代码。dart文件。
- 井字游戏的用户界面
Dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State {
// declartions
bool oTurn = true;
// 1st player is O
List displayElement = ['', '', '', '', '', '', '', '', ''];
int oScore = 0;
int xScore = 0;
int filledBoxes = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigo[900],
body: Column(
children: [
Expanded(
// creating the ScoreBoard
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Player X',
style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white),
),
Text(
xScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Player O', style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white)
),
Text(
oScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
],
),
),
),
Expanded(
// Creating the Board for Tic tac toe
flex: 4,
child: GridView.builder(
itemCount: 9,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
_tapped(index);
},
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.white)),
child: Center(
child: Text(
displayElement[index],
style: TextStyle(color: Colors.white, fontSize: 35),
),
),
),
);
}),
),
Expanded(
// Button for Clearing the Enter board
// as well as Scoreboard to start allover again
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
color: Colors.indigo[50],
textColor: Colors.black,
onPressed: _clearScoreBoard,
child: Text("Clear Score Board"),
),
],
),
))
],
),
);
}
// filling the boxes when tapped with X
// or O respectively and then checking the winner function
void _tapped(int index) {
setState(() {
if (oTurn && displayElement[index] == '') {
displayElement[index] = 'O';
filledBoxes++;
} else if (!oTurn && displayElement[index] == '') {
displayElement[index] = 'X';
filledBoxes++;
}
oTurn = !oTurn;
_checkWinner();
});
}
}
Dart
void _checkWinner() {
// Checking rows
if (displayElement[0] == displayElement[1] &&
displayElement[0] == displayElement[2] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[3] == displayElement[4] &&
displayElement[3] == displayElement[5] &&
displayElement[3] != '') {
_showWinDialog(displayElement[3]);
}
if (displayElement[6] == displayElement[7] &&
displayElement[6] == displayElement[8] &&
displayElement[6] != '') {
_showWinDialog(displayElement[6]);
}
// Checking Column
if (displayElement[0] == displayElement[3] &&
displayElement[0] == displayElement[6] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[1] == displayElement[4] &&
displayElement[1] == displayElement[7] &&
displayElement[1] != '') {
_showWinDialog(displayElement[1]);
}
if (displayElement[2] == displayElement[5] &&
displayElement[2] == displayElement[8] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
}
// Checking Diagonal
if (displayElement[0] == displayElement[4] &&
displayElement[0] == displayElement[8] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[2] == displayElement[4] &&
displayElement[2] == displayElement[6] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
} else if (filledBoxes == 9) {
_showDrawDialog();
}
}
Dart
void _showWinDialog(String winner) {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("\" " + winner + " \" is Winner!!!"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
if (winner == 'O') {
oScore++;
} else if (winner == 'X') {
xScore++;
}
}
void _showDrawDialog() {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Draw"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
}
Dart
void _clearBoard() {
setState(() {
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
void _clearScoreBoard() {
setState(() {
xScore = 0;
oScore = 0;
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
Dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State {
bool oTurn = true;
// 1st player is O
List displayElement = ['', '', '', '', '', '', '', '', ''];
int oScore = 0;
int xScore = 0;
int filledBoxes = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigo[900],
body: Column(
children: [
Expanded(
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Player X',
style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white),
),
Text(
xScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Player O', style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white)
),
Text(
oScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
],
),
),
),
Expanded(
flex: 4,
child: GridView.builder(
itemCount: 9,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
_tapped(index);
},
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.white)),
child: Center(
child: Text(
displayElement[index],
style: TextStyle(color: Colors.white, fontSize: 35),
),
),
),
);
}),
),
Expanded(
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
color: Colors.indigo[50],
textColor: Colors.black,
onPressed: _clearScoreBoard,
child: Text("Clear Score Board"),
),
],
),
))
],
),
);
}
void _tapped(int index) {
setState(() {
if (oTurn && displayElement[index] == '') {
displayElement[index] = 'O';
filledBoxes++;
} else if (!oTurn && displayElement[index] == '') {
displayElement[index] = 'X';
filledBoxes++;
}
oTurn = !oTurn;
_checkWinner();
});
}
void _checkWinner() {
// Checking rows
if (displayElement[0] == displayElement[1] &&
displayElement[0] == displayElement[2] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[3] == displayElement[4] &&
displayElement[3] == displayElement[5] &&
displayElement[3] != '') {
_showWinDialog(displayElement[3]);
}
if (displayElement[6] == displayElement[7] &&
displayElement[6] == displayElement[8] &&
displayElement[6] != '') {
_showWinDialog(displayElement[6]);
}
// Checking Column
if (displayElement[0] == displayElement[3] &&
displayElement[0] == displayElement[6] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[1] == displayElement[4] &&
displayElement[1] == displayElement[7] &&
displayElement[1] != '') {
_showWinDialog(displayElement[1]);
}
if (displayElement[2] == displayElement[5] &&
displayElement[2] == displayElement[8] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
}
// Checking Diagonal
if (displayElement[0] == displayElement[4] &&
displayElement[0] == displayElement[8] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[2] == displayElement[4] &&
displayElement[2] == displayElement[6] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
} else if (filledBoxes == 9) {
_showDrawDialog();
}
}
void _showWinDialog(String winner) {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("\" " + winner + " \" is Winner!!!"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
if (winner == 'O') {
oScore++;
} else if (winner == 'X') {
xScore++;
}
}
void _showDrawDialog() {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Draw"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
}
void _clearBoard() {
setState(() {
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
void _clearScoreBoard() {
setState(() {
xScore = 0;
oScore = 0;
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
}
- 检查获胜者的函数:下面定义的函数可用于检查游戏中的获胜者。它使用与游戏本身相同的逻辑,即基于每个单元格中的元素。
Dart
void _checkWinner() {
// Checking rows
if (displayElement[0] == displayElement[1] &&
displayElement[0] == displayElement[2] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[3] == displayElement[4] &&
displayElement[3] == displayElement[5] &&
displayElement[3] != '') {
_showWinDialog(displayElement[3]);
}
if (displayElement[6] == displayElement[7] &&
displayElement[6] == displayElement[8] &&
displayElement[6] != '') {
_showWinDialog(displayElement[6]);
}
// Checking Column
if (displayElement[0] == displayElement[3] &&
displayElement[0] == displayElement[6] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[1] == displayElement[4] &&
displayElement[1] == displayElement[7] &&
displayElement[1] != '') {
_showWinDialog(displayElement[1]);
}
if (displayElement[2] == displayElement[5] &&
displayElement[2] == displayElement[8] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
}
// Checking Diagonal
if (displayElement[0] == displayElement[4] &&
displayElement[0] == displayElement[8] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[2] == displayElement[4] &&
displayElement[2] == displayElement[6] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
} else if (filledBoxes == 9) {
_showDrawDialog();
}
}
- Win & Draw 对话框的代码:以下代码在用户获胜或比赛为平局时显示对话框。
Dart
void _showWinDialog(String winner) {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("\" " + winner + " \" is Winner!!!"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
if (winner == 'O') {
oScore++;
} else if (winner == 'X') {
xScore++;
}
}
void _showDrawDialog() {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Draw"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
}
- 游戏结束后清除棋盘:以下代码可用于在游戏结束后清除棋盘。
Dart
void _clearBoard() {
setState(() {
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
void _clearScoreBoard() {
setState(() {
xScore = 0;
oScore = 0;
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
完整的源代码:
Dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State {
bool oTurn = true;
// 1st player is O
List displayElement = ['', '', '', '', '', '', '', '', ''];
int oScore = 0;
int xScore = 0;
int filledBoxes = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigo[900],
body: Column(
children: [
Expanded(
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Player X',
style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white),
),
Text(
xScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Player O', style: TextStyle(fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white)
),
Text(
oScore.toString(),
style: TextStyle(fontSize: 20,color: Colors.white),
),
],
),
),
],
),
),
),
Expanded(
flex: 4,
child: GridView.builder(
itemCount: 9,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
_tapped(index);
},
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.white)),
child: Center(
child: Text(
displayElement[index],
style: TextStyle(color: Colors.white, fontSize: 35),
),
),
),
);
}),
),
Expanded(
child: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
color: Colors.indigo[50],
textColor: Colors.black,
onPressed: _clearScoreBoard,
child: Text("Clear Score Board"),
),
],
),
))
],
),
);
}
void _tapped(int index) {
setState(() {
if (oTurn && displayElement[index] == '') {
displayElement[index] = 'O';
filledBoxes++;
} else if (!oTurn && displayElement[index] == '') {
displayElement[index] = 'X';
filledBoxes++;
}
oTurn = !oTurn;
_checkWinner();
});
}
void _checkWinner() {
// Checking rows
if (displayElement[0] == displayElement[1] &&
displayElement[0] == displayElement[2] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[3] == displayElement[4] &&
displayElement[3] == displayElement[5] &&
displayElement[3] != '') {
_showWinDialog(displayElement[3]);
}
if (displayElement[6] == displayElement[7] &&
displayElement[6] == displayElement[8] &&
displayElement[6] != '') {
_showWinDialog(displayElement[6]);
}
// Checking Column
if (displayElement[0] == displayElement[3] &&
displayElement[0] == displayElement[6] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[1] == displayElement[4] &&
displayElement[1] == displayElement[7] &&
displayElement[1] != '') {
_showWinDialog(displayElement[1]);
}
if (displayElement[2] == displayElement[5] &&
displayElement[2] == displayElement[8] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
}
// Checking Diagonal
if (displayElement[0] == displayElement[4] &&
displayElement[0] == displayElement[8] &&
displayElement[0] != '') {
_showWinDialog(displayElement[0]);
}
if (displayElement[2] == displayElement[4] &&
displayElement[2] == displayElement[6] &&
displayElement[2] != '') {
_showWinDialog(displayElement[2]);
} else if (filledBoxes == 9) {
_showDrawDialog();
}
}
void _showWinDialog(String winner) {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("\" " + winner + " \" is Winner!!!"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
if (winner == 'O') {
oScore++;
} else if (winner == 'X') {
xScore++;
}
}
void _showDrawDialog() {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Draw"),
actions: [
FlatButton(
child: Text("Play Again"),
onPressed: () {
_clearBoard();
Navigator.of(context).pop();
},
)
],
);
});
}
void _clearBoard() {
setState(() {
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
void _clearScoreBoard() {
setState(() {
xScore = 0;
oScore = 0;
for (int i = 0; i < 9; i++) {
displayElement[i] = '';
}
});
filledBoxes = 0;
}
}
在Flutter主要。 dart文件是代码开始执行的入口点。在主要。 dart文件首先导入了材料设计包。然后创建了一个函数runApp,参数为 MyApp。在声明了无状态小部件 MyApp 类之后,MyApp 类的状态就已经布置好了。
输出:
想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!