用c语言实现三子棋小游戏
对于初学c语言的人,常常会陷入一种怪圈,既使不断的练习书上的例子,但似乎越来越觉得不会用, 事实上,是我们选择了一些“老路”,即像“刷题”似的通过不断的机械式练习,从而达到目的,但似乎这种方法已经不那么的有用,所以,我们必须明白只有将所学知识全部糅合在一起便可达到一种融会贯通的效果,显然 实现三子棋,对于初学者来说,正是一个可攀登的“小山峰“。
那么,实现一个三子棋需要什么呢?
0> 棋盘
1> 落子之前需要初始化棋盘
实现棋盘之后,我们又需要做什么呢?
e> 电脑下棋。
2> 玩家下棋。
游戏功能实现,是否需要规则?
3>判断输赢
Π>棋盘是否已满
上述功能实现之后,这个游戏基本已经可以搞定。那么是时候给出代码了:
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void Init(char arr[ROW][COL], int row, int col);
void Display(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
void PlayMove(char arr[ROW][COL], int row, int col);
//玩家赢-------X;电脑赢---------*; 平局--------Q; 继续----------R;
char L_Win(char arr[ROW][COL], int row, int col);
char L_Full(char arr[ROW][COL], int row, int col);
#endif // !_ _game_h__
//test.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void Init(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] =' ';
}
}
}void Display(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < row-1; j++)
{
printf("---|");
}
printf("--");
}
printf("\n");
}
}
void ComputerMove(char arr[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while (1)
{
if (arr[x][y] == ' ') {
arr[x][y] = '*';
break;
}
else {
x = rand() % row;
y = rand() % col;
}
}
}
void PlayMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if ((x >= 1) && (x <= row) && (y >= 1) && (y <= col))
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x-1][y-1] = 'X';
break;
}
else
printf("坐标有误:\n");
}
else
printf("坐标有误:\n");
}
}
char L_Win(char arr[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
return arr[i][0];
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
return arr[0][j];
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
return arr[0][0];
else if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
return arr[0][2];
else if (L_Full(arr, ROW, COL))
return 'Q';
else
return 'R';
}
char L_Full(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i<row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
#include<stdio.h>
void menu()
{
printf("- - - - - - - - - - - - - - - - - - - - - - \n");
printf("********** 1.玩游戏 *********\n");
printf("********** 0.退出 *********\n");
printf("- - - - - - - - - - - - - - - - - - - - - - \n");
}
void game()
{
char arr[ROW][COL] = { 0 };
Init(arr,ROW,COL);
Display(arr, ROW, COL);
do
{
printf("电脑走:");
ComputerMove(arr, ROW, COL);
printf("\n");
Display(arr, ROW, COL);
if (L_Win(arr, ROW, COL) != 'R')
{
break;
}
printf("玩家走: \n");
PlayMove(arr, ROW, COL);
printf("\n");
Display(arr, ROW, COL);
if (L_Win(arr, ROW, COL) != 'R')
{
break;
}
}while (1);
if (L_Win(arr, ROW, COL) == '*')
{
printf("电脑赢 \n");
}
else if (L_Win(arr, ROW, COL) == 'X')
{
printf("玩家赢 \n");
}
else if (L_Win(arr, ROW, COL) == 'Q')
{
printf("平局\n");
}
}
int main()
{
int n;
srand((unsigned int)time(NULL));
do {
menu();
printf("请输入你的选择:\n");
scanf("%d", &n);
switch (n)
{
case 1:
printf("玩游戏:>");
printf("\n");
game();
break;
case 0:
printf("退出游戏:\n");
break;
default:
printf("输入有误请重新输入:\n");
break;
}
} while (n);
return 0;
}
运行结果如何呢?我们来看看: