学完C语言,我们可以写很多好玩的小游戏。今天就介绍一个用C语言写的简单的小游戏------三子棋。
首先,分析一下:三子棋也就是平常的井字棋,用C语言写的话,界面上应该给玩家的展现的。
首先应该是空的棋牌,这个棋牌如何呈现给玩家呢,可以用二维数组实现。
其次是玩家如何下棋?玩家通过棋盘的坐标,告诉棋子要落在哪里,以我们平时的习惯,应该在棋盘上画x,o.这里和使用宏定义,在以下的代码中将会展示。
最后一个问题:如何判断谁输谁赢?可在玩家或电脑每走完一步,判断每一行、每一列、一撇或者一捺是否相同,如果相同则判断这个棋是玩家的还是电脑的,以判断输赢。(一下的代码中会有具体的介绍)
这三子棋里写目录标题
三子棋的项目的大致思路
这里声明一下:本文的代码是将头文件、源文件分开的,这样思路会比较清晰,书写方便。
这里我们要介绍一下,写一个三子棋,其中的逻辑顺序。
#include"chess.h"
int main(){
int select = 0;
START:
Menu();//菜单
scanf("%d", &select);//输入选择
switch (select){//以选择打开开关
case 1:
Game();
printf("再玩一次吧!\n");
goto START;
case 2:
break;
default:
printf("输入错误\n");
goto START;
}
system("pause");
return 0;
}
首先,要给玩家一个界面,告诉玩家这个如何玩。所以Menu()就是给玩家呈现界面。然后玩家看到这个界面就需要选择;这里选择1,是开始游戏;选择2则退出,其他的选择就是错误输入(但后期可以再优化一下选择,选择其他的操作)。
所以要玩这个游戏就必须选1。则进入游戏,而这个小游戏的核心就是Game()。假设玩家玩完了一局,这时候有的人还想再玩一局,所以应该给玩家这个选择,所以Game()完成之后,用goto 语句。从菜单开始再来选择一次,如果不想继续,那么就可以选择2,则退出。
三子棋的重要函数实现
现在,就要讲一讲重要函数Game()的实现。
我先把头文件放在这里,因为有些宏定义在这里,可以看得更清楚一点。
#ifndef _CHESS_H_
#include<Windows.h>
#define _CHESS_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define BLACK 'o'
#define WHITE 'x'
void InitBoard(char board[][COL], int row, int col);
void Menu();
void Game();
void ComputerMove(board, row, col);
void ShowBoard(char board[][COL], int row, int col);
char JudgeResult(char board[][COL], int row, int col);
int PlayerMove(char board[][COL], int row, int col);
#endif
以下是Game()函数实现
void Game(){
int board[ROW][COL];//二维数组
InitBoard(board, ROW, COL);//初始化面板
char judge = 'N';
srand((unsigned long)time(NULL));
void ShowBoard(char board[][COL], int row, int col);//展示面板
int player = 0;
while (1){
ShowBoard(board, ROW, COL);
player = PlayerMove(board, ROW, COL);//玩家走棋
if (player==2){
printf("该处已有棋子!\n");
continue;
}
else if (player == 1){
printf("输入坐标错误!\n");
continue;
}
else{
printf("玩家已落棋!\n");
}
ShowBoard(board, ROW, COL);
JudgeResult(board, ROW, COL);
judge = JudgeResult(board ,ROW,COL);
if (judge != 'N'){
break;
}
ComputerMove(board, ROW, COL);
judge = JudgeResult(board, ROW, COL);
if (judge != 'N'){
break;
}
}
ShowBoard(board, ROW, COL);//result = JudgeResult;
switch (judge){
case BLACK:
printf("恭喜你,玩家获胜!\n");
break;
case WHITE:
printf("真遗憾,你输了!\n");
break;
case 'E':
printf("恭喜你,平局!");
break;
}
}
看起来代码有点多哦,但是思路清晰就不会乱了。
1.玩家进入游戏后,首先会看到一个棋盘。void ShowBoard(char board[][COL], int row, int col);
2.玩家要开始玩游戏,提示输入玩家的棋子位置。使用PlayerMove(board, ROW, COL)。玩家将棋子输入之后,会有三种情况:棋子的坐标处有棋子;输入的坐标不正确(超出棋子坐标范围);该处没有棋子,即落子成功。
所以PlayerMove(board, ROW, COL)函数带上返回值,分别表示这几种情况。如果有棋子或者棋子坐标错误,都要提醒玩家,然后跳出本次循环,重新输入,直到输入坐标从正确。
3.玩家落棋后展示棋盘,玩家落棋的位置。然后判断是否有三个相同的且连续的棋子,使用JudgeResult(board, ROW, COL)判断,如果有则退出,如果没有则继续下一步。
4.电脑落棋,电脑落棋此处会由电脑产生一个随机数范围在(0-2),这个随机数种子srand((unsigned long)time(NULL))在游戏开始便被种下。随机数在
ComputerMove(board, ROW, COL)中产生。
6.判断电脑落棋后有没有三个相同且连续的棋子。仍然是 JudgeResult(char board[][COL], int row, int col)判断,如果返回值为’N’,则继续while循环。
7.while循环使得一直重复2-6的步骤,直到 JudgeResult(char board[][COL], int row, int col)的返回值为‘E’—平局;或者’BLACK’,‘WHITE’—表示玩家或者电脑获胜。
三子棋的各个函数实现
下面我们来看看具体的函数的实现。以下函数的说明将会在函数的顶部使用引用,便于阅读。
#include"chess.h"
void Menu(){//用户选择界面
printf("*************************************\n");
printf("********欢迎来到三子棋世界***********\n");
printf("***1.GAME*************2.QUIT*********\n");
printf("******** 请输入你的选择:************\n");
printf("*************************************\n");
}
> 这个函数是用来给棋牌的初始化的,也就是玩家进入游戏后的界面,所以数组的内容为空格,使用双循环,给数组的每一个内容放上空格。
void InitBoard(char board[][COL], int row, int col){//初始化面板
int i = 0;
for (; i < col; i++){
int j = 0;
for (; j < row; j++){
board[i][j] = ' ';
}
}
}
> showboard函数是给用户的棋盘更新后展示棋盘使用的。
void ShowBoard(char board[][COL], int row, int col){//展示面板
printf(" | 1 | 2 | 3 |\n");
int i = 0;
for (; i < row; i++){
printf("__________________\n");
printf(" %d | %c | %c | %c \n", i+1,board[i][0], board[i][1],board[i][2]);
}printf("__________________\n");
}
> 指引玩家下棋的函数,输入坐标存储起来,先判断坐标是否在范围之内,如果是,则继续判断,该坐标处是否有棋子(是否为空),如果不为空返回2;为空就给该处赋值BLACK(宏定义为 ‘O’)。如果坐标不正确返回1.
int PlayerMove(char board[][COL], int row, int col){//玩家移动
int x = 0;
int y = 0;
printf("please enter your Pos<x,y>\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3){
if (board[x - 1][y - 1] != ' '){
return 2;
}//表示该处有棋子
else{//坐标正确
board[x - 1][y - 1] = BLACK;
return 0;
}
}
return 1;//输入错误的坐标;
}
//判断棋盘上的棋子。
char JudgeResult(char board[][COL] ,int row,int col){//判断棋子的情况
int i = 0;
for (; i < row; i++){
if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2]){
return board[i][0];
}
}
int j = 0;
for (; j < col; j++){
if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j]){
return board[0][j];
}
}
if (board[0][0] != ' '&&board[0][0] == board[1][1] && board[1][1] == board[2][2]){
return board[0][0];
}if (board[0][2] != ' '&&board[0][2] == board[1][1] && board[1][1] == board[2][0]){
return board[0][2];
}
for (i = 0; i < 3; i++){
for ( j = 0; j <3; j++){
if (board[i][j] == ' '){
return 'N';//检查有坐标为空,继续
}
}
}
return 'E';//平局
}
void ComputerMove(char board[ROW][COL], int row, int col){
//电脑移动
while (1){
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == ' '){
board[i][j] = WHITE;
break;
}
}printf("电脑已落棋!\n");
Sleep(100);
}
void Game(){
int board[ROW][COL];//二维数组
InitBoard(board, ROW, COL);//初始化面板
char judge = 'N';
srand((unsigned long)time(NULL));
void ShowBoard(char board[][COL], int row, int col);//展示面板
int player = 0;
while (1){
ShowBoard(board, ROW, COL);
player = PlayerMove(board, ROW, COL);
if (player==2){
printf("该处已有棋子!\n");
continue;
}
else if (player == 1){
printf("输入坐标错误!\n");
continue;
}
else{
printf("玩家已落棋!\n");
}
ShowBoard(board, ROW, COL);
JudgeResult(board, ROW, COL);
judge = JudgeResult(board ,ROW,COL);
if (judge != 'N'){
break;
}
ComputerMove(board, ROW, COL);
judge = JudgeResult(board, ROW, COL);
if (judge != 'N'){
break;
}
}
ShowBoard(board, ROW, COL);//result = JudgeResult;
switch (judge){
case BLACK:
printf("恭喜你,玩家获胜!\n");
break;
case WHITE:
printf("真遗憾,你输了!\n");
break;
case 'E':
printf("恭喜你,平局!");
break;
}
}
以上是三字棋的整个代码实现,如有问题,欢迎指正。