一、目的
利用数组实现一个简单的井字棋游戏!
二、运行环境
VS 2013 Ultimate版
三、具体步骤
这个简单的小程序是利用多文件的方法编写的。
1、创建对应的main.c(主函数所在的源文件),TIC-tac-toe.h(头文件),Tic-tac-toe.c(函数的实现文件)
(1)TIC-tac-toe.c
(2)Tic-tac-toe.h
右键单击管理器中的头文件添加新建项,然后如下图所示选择添加:
命名的时候,头文件与实现函数文件保持一致会更好!
(3)main.c
右键单击管理器中的源文件,添加新建项,然后如下图进行操作:
(4)至此,文件添加完成,开始写代码;
注意:头文件的写法
以#ifndef开始
#endif结束,
头文件包含所有的声明(函数,用到的头文件等的声明)
2.写大体的框架
3.之后进行Game()的具体实现!过程中你会发现慢慢的需要很多的函数来实现对应的功能,到时候就见招拆招!!!
四、源码
main.c
#include "Tic-tac-toe.h"
void Menu(){
printf("*********************************\n");
printf("** 1.开始游戏 2.退出游戏**\n");
printf(" 3.游戏帮助 \n");
printf("*********************************\n");
printf("请选择: ");
}
int main(){
int select = 0;
do{
Menu();
scanf_s("%d", &select);
switch (select){
case 1:
//开始游戏
Game();
break;
case 2:
//退出游戏,select == 2为退出条件
select = 2;
break;
case 3:
printf("先达三子连珠者赢!!!\n");
break;
default:
printf("没有此选项,请重新输入!");
break;
}
} while (select != 2);
system("pause");
return 0;
}
Tic-tac-toe.h
#ifndef _TIC-TAC-TOE_H_
#pragma warning(disable:4996)
#include <stdio.h>
#include <time.h>
#define NUM 3
void Game();
void InitBoard(char board[][NUM],int x,int y);
void ShowBoard(char board[][NUM],int x,int y);
void UserDown(char board[][NUM],int x,int y);
void ComputerDown(char board[][NUM], int x, int y);
char Judge(char board[][NUM], int x, int y);
#endif
Tic-tac-toe.c
#include "Tic-tac-toe.h"
void Game(){
char result;
char board[NUM][NUM] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
InitBoard(board, NUM, NUM);
do{
ShowBoard(board, NUM, NUM);
printf("请下棋:\n");
UserDown(board, NUM,NUM);
ShowBoard(board, NUM, NUM);
result = Judge(board, NUM, NUM);
if (result != 'N'){//不可以继续走,就跳出
break;
}
ComputerDown(board, NUM, NUM);
result = Judge(board, NUM, NUM);
if (result != 'N'){//不可以继续走,就跳出
break;
}
printf("计算机下:\n");
} while (1);
switch (result){
case 'E':
printf("平局,不想虐它一把吗?\n");
break;
case 'X':
printf("很遗憾,你竟然赢了。\n");
break;
case 'O':
printf("恭喜你,电脑碾压了你。\n");
break;
default:
printf("不是你的错,是程序的错!\n");
break;
}
}
void ShowBoard(char board[][NUM], int x, int y){
printf(" | 1 | 2 | 3 |\n");
printf("----------------\n");
int i = 1;
for (; i <= 3; i++){
printf(" %d | %c | %c | %c |\n", i,board[i-1][0],board[i-1][1],board[i-1][2]);
printf("----------------\n");
}
}
void UserDown(char board[][NUM], int x, int y){
int a, b;
while (1){
scanf("%d %d", &a, &b);
if (a >= 1 && b <= 3){
if (board[a - 1][b - 1] == ' '){
board[a - 1][b - 1] = 'X';
break;
}
else{
printf("此处已有棋!!!\n");
}
}
else{
printf("你要往哪里下?");
}
}
}
void ComputerDown(char board[][NUM], int x, int y){
int a, b;
srand((unsigned int)time(NULL));
while (1){
a = rand() % 3 + 1;
b = rand() % 3 + 1;
if (a >= 1 && b <= 3){
if (board[a - 1][b - 1] == ' '){
board[a - 1][b - 1] = 'O';
break;
}
else{
//此处无操作
}
}
else{
//此处无操作,让计算机自己随机生成数
}
}
}
char Judge(char board[][NUM], int x, int y){
int i, j;
//判断行是否相等
for (i = 0; i < NUM; i++){
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && \
board[i][0] != ' '){
return board[i][1];
}
else{
//空语句
}
}
//判断列是否相等
for (j = 0; j <= NUM; j++){
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && \
board[0][j] != ' '){
return board[0][j];
}
else{
//空语句
}
}
//判断对角线是否相等
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){
return board[0][0];
}
else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){
return board[0][2];
}
else{
//先执行上面的代码是判断是否有人先三子连珠,因为可能棋没有下完,但是出现了赢家
for (i = 0; i <= NUM; i++){
for (j = 0; j <= NUM; j++){
if (board[i][j] == ' '){
return 'N';
}
}
}
}
//走到这里就说明是平局
return 'E';
}
void InitBoard(char board[][NUM], int x, int y){
int i, j;
for (i = 0; i < NUM; i++){
for (j = 0; j < NUM; j++){
board[i][j] = ' ';
}
}
}
总结:
完成这个小游戏,对数组的操作就会更加得心应手了。打下了不错的基础!
参考:有缘人的指点