三子棋小游戏
初学C语言,我们可以做一些小游戏,既能提高我们对c的理解,也能增强我们的实践能力。接下来我们一起去完成这个小游戏:三子棋。
三子棋首先得有一个3*3的棋盘,这个棋盘上还得有棋子,然后是玩家走一步,电脑走一步,每走一步还需要判断输赢。
以上就是三子棋的基本逻辑,现在我们一步一步的实现。
-
初始化棋盘
打印棋盘时,棋盘上的棋子不能是个随机的,我们要的是一个干净的棋盘,上面还未落子。所以先初始化棋盘。
void chushihua(char borad[ROW][ROL], int row, int rol) { for (int i = 0; i < row; i++) { for (int j = 0; j < rol; j++) { borad[i][j] = ' '; } } }
这样我们的棋子一上来就是全空的状态。
-
打印棋盘
棋盘上的棋子已经初始化好了,我们需要一个函数来把棋盘打印出来,之后的对局,每走一步,也需要打印出来棋盘。
void daying(char borad[ROW][ROL],int row, int rol) { for (int i = 0; i < row; i++) { for (int j = 0; j < rol; j++) { printf(" %c ", borad[i][j]); if (j < rol - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (int j = 0; j < rol; j++) { printf("---"); if (j < rol - 1) printf("|"); } } printf("\n"); } }
-
玩家走
棋盘有了,就差下棋了,所以玩家走一步,再打印出棋盘。我们规定玩家走的棋子为’#’。
void playermove(char borad[ROW][ROL], int row, int rol) { printf("玩家请输入坐标,坐标用空格空开\n"); int a = 0; int b = 0; again: scanf("%d%d", &a, &b); while (1) { if (a <= 3 && b <= 3) { if (borad[a - 1][b - 1] == ' ') { borad[a - 1][b - 1] = '*'; break; } else { printf("坐标已经占用,请重新输入\n"); goto again; } } else { printf("坐标错误,请重新输入\n"); goto again; } } }
-
电脑走
电脑走就是一个随机数了,不会再输入坐标了,所以代码如下:
void computermove(char borad[ROW][ROL], int row, int rol) { int x = 0; int y = 0; printf("电脑走:\n"); while (1) { x = rand() % row; y = rand() % rol; if (borad[x][y] == ' ') { borad[x][y] = '#'; break; } } }
-
判断输赢
判断输赢的逻辑就是,行连成三个或列连成三个或对角线连成三个算赢。
如果没满足以上条件,并且下满了,那么就是平局。
再者,就是继续下棋。
代码如下:
char iswin(char borad[ROW][ROL], int row, int rol) { //判断行 for (int i = 0; i < row; i++) { if (borad[i][0] != ' '&&borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2]) return borad[i][0]; } //判断列 for (int i = 0; i < row; i++) { if (borad[0][i] != ' '&&borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i]) return borad[0][i]; } //判断对角线 if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ') return borad[0][0]; if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ') return borad[0][2]; //平局 if (isfull(borad,ROW,ROL)) return 'Q'; //继续 return 'C'; }
iswin函数返回的是’C‘就是游戏继续,返回的是’#‘电脑赢,返回’*‘玩家赢,返回’Q‘是平局。所以还需要有接收返回值的变量ret。
if (ret == '*') { printf("玩家赢\n"); } if (ret == '#') { printf("电脑赢\n"); } if (ret == 'Q') printf("平局\n");
判断好输赢,这个游戏已经基本完成了。
下面是游戏的代码:
头文件:
#pragma once #include<stdio.h> #define ROW 3 #define ROL 3 #include<stdlib.h> #include<time.h> void mune(); void chushihua(char borad[ROW][ROL], int row, int rol); void daying(char borad[ROW][ROL], int row, int rol); void game(); void playermove(char borad[ROW][ROL], int row, int rol); void computermove(char borad[ROW][ROL], int row, int rol); char iswin(char borad[ROW][ROL], int row, int rol);
三子棋游戏代码:
#include"game.h" void mune() { printf("*******************************************\n"); printf("******************三子棋*******************\n"); printf("******************请投币:******************\n"); printf("****************** ******************\n"); printf("****************** ******************\n"); } void chushihua(char borad[ROW][ROL], int row, int rol) { for (int i = 0; i < row; i++) { for (int j = 0; j < rol; j++) { borad[i][j] = ' '; } } } void daying(char borad[ROW][ROL],int row, int rol) { for (int i = 0; i < row; i++) { for (int j = 0; j < rol; j++) { printf(" %c ", borad[i][j]); if (j < rol - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (int j = 0; j < rol; j++) { printf("---"); if (j < rol - 1) printf("|"); } } printf("\n"); } } void playermove(char borad[ROW][ROL], int row, int rol) { printf("玩家请输入坐标,坐标用空格空开\n"); int a = 0; int b = 0; again: scanf("%d%d", &a, &b); while (1) { if (a <= 3 && b <= 3) { if (borad[a - 1][b - 1] == ' ') { borad[a - 1][b - 1] = '*'; break; } else { printf("坐标已经占用,请重新输入\n"); goto again; } } else { printf("坐标错误,请重新输入\n"); goto again; } } } void computermove(char borad[ROW][ROL], int row, int rol) { int x = 0; int y = 0; printf("电脑走:\n"); while (1) { x = rand() % row; y = rand() % rol; if (borad[x][y] == ' ') { borad[x][y] = '#'; break; } } } int isfull(char borad[ROW][ROL], int row, int rol) { for (int i = 0; i < row; i++) { for (int j = 0; j < rol; j++) { if (borad[i][j] == ' ') return 0; } } return 1; } char iswin(char borad[ROW][ROL], int row, int rol) { //判断行 for (int i = 0; i < row; i++) { if (borad[i][0] != ' '&&borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2]) return borad[i][0]; } //判断列 for (int i = 0; i < row; i++) { if (borad[0][i] != ' '&&borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i]) return borad[0][i]; } //判断对角线 if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ') return borad[0][0]; if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ') return borad[0][2]; //平局 if (isfull(borad,ROW,ROL)) return 'Q'; //继续 return 'C'; } void game() { char ret = 0; char borad[ROW][ROL]; //初始化棋盘 chushihua(borad, ROW, ROL); //打印棋盘 daying(borad, ROW, ROL); while (1) { //玩家下棋 playermove(borad, ROW, ROL); daying(borad, ROW, ROL); //判断输赢 ret=iswin(borad,ROW,ROL); if (ret != 'C') { break; } //电脑下棋 computermove(borad, ROW, ROL); daying(borad, ROW, ROL); //判断输赢 ret=iswin(borad,ROW,ROL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢\n"); } if (ret == '#') { printf("电脑赢\n"); } if (ret == 'Q') printf("平局\n"); }
总程序代码:
#include"game.h" int main() { srand((unsigned int)time(NULL)); int n = 0; mune(); again: scanf("%d", &n); while (n) { game(); n--; } printf("游戏是否继续?请投币\n"); goto again; return 0; }
以上就是本期内容。